Development

Changeset 9539

You must first sign up to be able to contribute.

Changeset 9539

Show
Ignore:
Timestamp:
06/11/08 12:02:48 (5 years ago)
Author:
FabianLange
Message:

1.1: fixed sfFillInForm to work correctly with nested arrays like: article[description][]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/1.1/lib/plugins/sfCompat10Plugin/lib/util/sfFillInForm.class.php

    r9217 r9539  
    226226    } 
    227227 
    228     return null !== sfToolkit::getArrayValueForPath($values, $name); 
     228    return sfToolkit::hasArrayValueForPath($values, $name); 
    229229  } 
    230230 
     
    234234    if (array_key_exists($name, $values)) 
    235235    { 
    236       $return = $values[$name]; 
    237       if ($shiftArray && is_array($return)) 
    238       { 
    239         // we need to remove the first element from the array. Therefore we need a reference 
    240         $arrayRef = &$values[$name]; 
    241         $return = array_shift($arrayRef); 
    242       } 
    243       return $return; 
    244     } 
    245  
    246     return sfToolkit::getArrayValueForPath($values, $name)
     236      $return = &$values[$name]; 
     237    } else { 
     238      $return = &sfToolkit::getArrayValueForPath($values, $name); 
     239    } 
     240 
     241    if ($shiftArray && is_array($return)) 
     242    { 
     243      // we need to remove the first element from the array. Therefore we need a reference 
     244      return array_shift($return); 
     245    } 
     246    return $return
    247247  } 
    248248 
  • branches/1.1/lib/plugins/sfCompat10Plugin/test/unit/util/sfFillInFormTest.php

    r9495 r9539  
    1212require_once(dirname(__FILE__).'/../../../lib/util/sfFillInForm.class.php'); 
    1313 
    14 $t = new lime_test(72, new lime_output_color()); 
     14$t = new lime_test(74, new lime_output_color()); 
    1515 
    1616$html = <<<EOF 
     
    4545    </select> 
    4646    <input name="article[or][much][longer]" value="very long!"/> 
     47    <input name="article[description][]" value="default description" /> 
     48    <input name="article[description][]" value="default description2" /> 
    4749    <input name="multiple_text[]" value="text1"/> 
    4850    <input name="multiple_text[]" value="text2"/> 
     
    99101$t->is($xml->xpath('//form[@name="form1"]/select[@name="articles[]"][1]/option[@selected="selected"]'), array(2, 3), '->fillInDom() preserves default values for multiple select'); 
    100102$t->is($xml->xpath('//form[@name="form1"]/select[@name="articles[]"][2]/option[@selected="selected"]'), array(1, 3), '->fillInDom() preserves default values for multiple select'); 
     103$t->is(get_input_value($xml, 'article[description][]'), array('default description', 'default description2'), '->fillInDom() preserves default values for long multiple text inputs (article[description][])'); 
    101104 
    102105// check form selection by name 
     
    151154  'select_multiple' => array('first', 'last'), 
    152155  'textarea' => 'my content', 
    153   'article[title]' => 'my article title', 
    154   'article[category]' => array(1, 2), 
     156  'article' => array( 
     157    'title' => 'my article title', 
     158    'category' => array(1, 2), 
     159    'description' => array('new description', 'new description2'), 
     160  ), 
    155161  'multiple_text[]' => array('m1', 'm2'), 
    156162  'multiple_textarea[]' => array('a1', 'a2'), 
     
    169175$t->is($xml->xpath('//form[@name="form1"]/textarea[@name="textarea"]'), array('my content'), '->fillInDom() fills in values for textarea'); 
    170176$t->is($xml->xpath('//form[@name="form1"]/select[@name="select"]/option[@selected="selected"]'), array('first'), '->fillInDom() fills in values for select'); 
     177$t->is(get_input_value($xml, 'article[description][]'), array('new description', 'new description2'), '->fillInDom() fills in values for multiple text inputs in second dimension array'); 
    171178$t->is($xml->xpath('//form[@name="form1"]/select[@name="select_multiple"]/option[@selected="selected"]'), array('first', 'last'), '->fillInDom() fills in values for multiple select'); 
    172179$t->is(get_input_value($xml, 'article[title]'), 'my article title', '->fillInDom() fills in values for text input'); 
     
    221228  $values = $xml->xpath($xpath); 
    222229 
    223   if (count($values) > 1
     230  if (count($values) > 1 || substr($name,-2)=='[]'
    224231  { 
    225232    foreach($values as $val) 
  • branches/1.1/lib/util/sfToolkit.class.php

    r9190 r9539  
    483483   * @return array 
    484484   */ 
    485   public static function getArrayValueForPath($values, $name, $default = null) 
     485  public static function &getArrayValueForPath(&$values, $name, $default = null) 
    486486  { 
    487487    if (false === $offset = strpos($name, '[')) 
    488488    { 
    489       return isset($values[$name]) ? $values[$name] : $default; 
     489      $return = $default; 
     490      if (isset($values[$name])) 
     491      { 
     492        $return = &$values[$name]; 
     493      } 
     494      return $return; 
    490495    } 
    491496 
     
    495500    } 
    496501 
    497     $array = $values[substr($name, 0, $offset)]; 
     502    $array = &$values[substr($name, 0, $offset)]; 
    498503 
    499504    while (false !== $pos = strpos($name, '[', $offset)) 
     
    513518        return $default; 
    514519      } 
    515       $array = $array[substr($name, $pos + 1, $end - $pos - 1)]; 
     520      $array = &$array[substr($name, $pos + 1, $end - $pos - 1)]; 
    516521      $offset = $end; 
    517522    }