NOTE: If you are a developer, please use a private wiki based on foswiki/trunk on a daily base ...or use trunk.foswiki.org to view this page for some minimal testing.
Use Item9693 for docu changes for 1.2 and 2.0.

Item9647: select+values formfields can lose their value mapping

Priority: CurrentState: AppliesTo: Component: WaitingFor:
Normal Closed Engine DataForms  
When creating a Form object using new Foswiki::Form these are cached and thus shared among consecutive calls. So are the gathered _options within a Select formfield. Now, when there's a select+values modifier of the formfield type, an internal valueMap is build up using the key=value pairs in the list of allowed values for that field. This is computed in getOptions() which takes care of the _options cache. All strings in there are also shared by consequtive calls.

Unfortunately these strings in the _options cache are manipulated in place while rendering the html markup.

The second time a Form object is created the old Form object is reused. But now the _options cache has been modified by accident in renderForEdit So now, the call to getOptions() returns a different list of allowed values with the mapping being applied to it.

So far the analysis and the theory.

Here's how to reproduce:

  1. install FlexFormPlugin
  2. create a DataForm and add a | ListOfThings | select+values | 1 | one=1, two=2, three=3 | | | row to it
  3. create a TestTopic and attach the new DataForm to it
  4. make a selection for your ListOfThings formfield
  5. add
    %RENDERFOREDIT{field="ListOfThings"}%%RENDERFOREDIT{field="ListOfThings"}%
    to it
  6. now the error: only the first select box is rendered correctly, the second is wrong

Patch:
Index: Select.pm
===================================================================
--- Select.pm   (revision 8802)
+++ Select.pm   (working copy)
@@ -44,9 +44,11 @@
 sub getOptions {
     my $this = shift;
 
-    return $this->{_options} if $this->{_options};
+    my $vals = $this->{_options};
+    return $vals if $vals;
 
-    my $vals = $this->SUPER::getOptions(@_);
+    $vals = $this->SUPER::getOptions(@_);
+
     if ( $this->{type} =~ /\+values/ ) {
 
         # create a values map
@@ -97,7 +99,8 @@
     my $choices = '';
 
     my %isSelected = map { $_ => 1 } split( /\s*,\s*/, $value );
-    foreach my $option ( @{ $this->getOptions() } ) {
+    foreach my $item ( @{ $this->getOptions() } ) {
+        my $option = $item;
         my %params = ( class => 'foswikiOption', );
         $params{selected} = 'selected' if $isSelected{$option};
         if ( defined( $this->{valueMap}{$option} ) ) {

-- MichaelDaum - 08 Sep 2010

If you need a FlexFormPlugin to see it, and it has been there since (tm)wiki and all Foswiki releases and noone noticed it must be a narrow scope bug.

So I downgrade it to Normal. But you seem to have the fix. Why didn't you check it in to trunk and Release01x01 branch?

-- KennethLavrsen - 08 Sep 2010

My svn checkout is behind and I won't update not to risk my stuff breaking. I need a working wiki all week. So Monday. The bug can also be triggered by two %META{"form"}% I guess.

Agreed, it is only Urgent for me and my client. I can't deploy their latest wiki-app without the above error being hotfixed.

-- MichaelDaum - 08 Sep 2010

Michael,

Is this fix confirmed good? Is this going to get checked in?

-- GeorgeClark - 13 Mar 2011

Thanks George for bringing this up. I will add it to stable + trunk and check the unit tests. The fix should also take Item10071 into account.

-- MichaelDaum - 14 Mar 2011

We are a couple of weeks from 1.1.5 release. Any plans to fix, or defer to 1.2.

-- GeorgeClark - 07 Mar 2012

Working on it...already was fixed in Foswikirev:13616 as part of Item11428. Sorry, lost track of all the +values task items.

-- MichaelDaum - 08 Mar 2012
 

ItemTemplate edit

Summary select+values formfields can lose their value mapping
ReportedBy MichaelDaum
Codebase 1.1.0 beta1, 1.0.10, 1.0.9, trunk
SVN Range
AppliesTo Engine
Component DataForms
Priority Normal
CurrentState Closed
WaitingFor
Checkins Foswikirev:14247 Foswikirev:14248
TargetRelease patch
ReleasedIn 1.1.5
CheckinsOnBranches Release01x01
trunkCheckins
Release01x01Checkins Foswikirev:14247 Foswikirev:14248
Topic revision: r15 - 11 Apr 2012, GeorgeClark
 
The copyright of the content on this website is held by the contributing authors, except where stated elsewhere. see CopyrightStatement. Creative Commons LicenseGet Foswiki at sourceforge.net. Fast, secure and Free Open Source software downloads