Development

Changeset 8709

You must first sign up to be able to contribute.

Changeset 8709

Show
Ignore:
Timestamp:
05/01/08 14:17:57 (1 year ago)
Author:
FabianLange
Message:

fillin now handles array notations like <input type="text" name "textinput[]"/> correctly. added 8 unit tests for that. fixes #2811 purpose.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/1.0/lib/util/sfFillInForm.class.php

    r8707 r8709  
    148148          // text input 
    149149          $element->removeAttribute('value'); 
    150           if ($this->hasValue($values, $name)) 
    151           { 
    152             $element->setAttribute('value', $this->escapeValue($this->getValue($values, $name), $name)); 
    153           } 
     150          $element->setAttribute('value', $this->escapeValue($this->getValue($values, $name, true), $name)); 
    154151        } 
    155152      } 
     
    157154      { 
    158155        $el = $element->cloneNode(false); 
    159         $el->appendChild($dom->createTextNode($this->escapeValue($this->getValue($values, $name), $name))); 
     156        $el->appendChild($dom->createTextNode($this->escapeValue($this->getValue($values, $name, true), $name))); 
    160157        $element->parentNode->replaceChild($el, $element); 
    161158      } 
    162159      else if ($element->nodeName == 'select') 
    163160      { 
    164         // select 
    165         $value    = $this->getValue($values, $name); 
     161        //if the name contains [] it is part of an array that needs to be shifted 
     162        $value    = $this->getValue($values, $name, strpos($name,'[]') !== false); 
    166163        $multiple = $element->hasAttribute('multiple'); 
    167164        foreach ($xpath->query('descendant::'.$ns.'option', $element) as $option) 
     
    196193  } 
    197194 
    198   protected function getValue($values, $name) 
     195  //use reference to values so that arrays can be shifted. 
     196  protected function getValue(&$values, $name, $shiftArray = false) 
    199197  { 
    200198    if (array_key_exists($name, $values)) 
    201199    { 
    202       return $values[$name]; 
     200      $return = $values[$name]; 
     201      if ($shiftArray && is_array($return)) 
     202      { 
     203        //we need to remove the first element from the array. Therefore we need a reference 
     204        $arrayRef = &$values[$name]; 
     205        $return = array_shift($arrayRef); 
     206      } 
     207      return $return; 
    203208    } 
    204209 
  • branches/1.0/test/unit/util/sfFillInFormTest.php

    r8695 r8709  
    1212require_once($_test_dir.'/../lib/util/sfFillInForm.class.php'); 
    1313 
    14 $t = new lime_test(53, new lime_output_color()); 
     14$t = new lime_test(61, new lime_output_color()); 
    1515 
    1616$html = <<<EOF 
     
    4545    </select> 
    4646    <input name="article[or][much][longer]" value="very long!"/> 
     47    <input name="multiple_text[]" value="text1"/> 
     48    <input name="multiple_text[]" value="text2"/> 
     49    <textarea name="multiple_textarea[]">area1</textarea> 
     50    <textarea name="multiple_textarea[]">area2</textarea> 
     51    <select name="articles[]" multiple="multiple"> 
     52      <option value="1">1</option> 
     53      <option value="2" selected="selected">2</option> 
     54      <option value="3" selected="selected">3</option> 
     55    </select> 
     56    <select name="articles[]" multiple="multiple"> 
     57      <option value="1" selected="selected">1</option> 
     58      <option value="2">2</option> 
     59      <option value="3" selected="selected">3</option> 
     60    </select> 
    4761    <input type="submit" name="submit" value="submit" /> 
    4862  </form> 
     
    7690$t->is(get_input_value($xml, 'input_radio', 'checked'), 'checked', '->fillInDom() preserves default values for radio'); 
    7791$t->is(get_input_value($xml, 'input_checkbox_multiple[]', 'checked'), array('checked', null), '->fillInDom() preserves default values for multiple checkboxes'); 
    78 $t->is($xml->xpath('//form[@name="form1"]/textarea'), array('content'), '->fillInDom() preserves default values for textarea'); 
     92$t->is($xml->xpath('//form[@name="form1"]/textarea[@name="textarea"]'), array('content'), '->fillInDom() preserves default values for textarea'); 
    7993$t->is($xml->xpath('//form[@name="form1"]/select[@name="select"]/option[@selected="selected"]'), array('selected'), '->fillInDom() preserves default values for select'); 
    8094$t->is($xml->xpath('//form[@name="form1"]/select[@name="select_multiple"]/option[@selected="selected"]'), array('selected', 'last'), '->fillInDom() preserves default values for multiple select'); 
    8195$t->is(get_input_value($xml, 'article[title]'), 'title', '->fillInDom() preserves default values for text input'); 
    8296$t->is($xml->xpath('//form[@name="form1"]/select[@name="article[category]"]/option[@selected="selected"]'), array(2, 3), '->fillInDom() preserves default values for select'); 
     97$t->is(get_input_value($xml, 'multiple_text[]'), array('text1', 'text2'), '->fillInDom() preserves default values for multiple text inputs'); 
     98$t->is($xml->xpath('//form[@name="form1"]/textarea[@name="multiple_textarea[]"]'), array('area1', 'area2'), '->fillInDom() preserves default values for multiple textareas'); 
     99$t->is($xml->xpath('//form[@name="form1"]/select[@name="articles[]"][1]/option[@selected="selected"]'), array(2, 3), '->fillInDom() preserves default values for multiple select'); 
     100$t->is($xml->xpath('//form[@name="form1"]/select[@name="articles[]"][2]/option[@selected="selected"]'), array(1, 3), '->fillInDom() preserves default values for multiple select'); 
    83101 
    84102// check form selection by name 
     
    135153  'article[title]' => 'my article title', 
    136154  'article[category]' => array(1, 2), 
     155  'multiple_text[]' => array('m1', 'm2'), 
     156  'multiple_textarea[]' => array('a1', 'a2'), 
     157  'articles[]' => array(array(1, 2),array(2, 3)), 
    137158); 
    138159 
     
    146167$t->is(get_input_value($xml, 'input_checkbox_not_checked', 'checked'), 'checked', '->fillInDom() fills in values for checkbox'); 
    147168$t->is(get_input_value($xml, 'input_checkbox_multiple[]', 'checked'), array(null, 'checked'), '->fillInDom() fills in values for multiple checkboxes'); 
    148 $t->is($xml->xpath('//form[@name="form1"]/textarea'), array('my content'), '->fillInDom() fills in values for textarea'); 
     169$t->is($xml->xpath('//form[@name="form1"]/textarea[@name="textarea"]'), array('my content'), '->fillInDom() fills in values for textarea'); 
    149170$t->is($xml->xpath('//form[@name="form1"]/select[@name="select"]/option[@selected="selected"]'), array('first'), '->fillInDom() fills in values for select'); 
    150171$t->is($xml->xpath('//form[@name="form1"]/select[@name="select_multiple"]/option[@selected="selected"]'), array('first', 'last'), '->fillInDom() fills in values for multiple select'); 
    151172$t->is(get_input_value($xml, 'article[title]'), 'my article title', '->fillInDom() fills in values for text input'); 
    152173$t->is($xml->xpath('//form[@name="form1"]/select[@name="article[category]"]/option[@selected="selected"]'), array(1, 2), '->fillInDom() fills in values for select'); 
     174$t->is(get_input_value($xml, 'multiple_text[]'), array('m1', 'm2'), '->fillInDom() fills in values for multiple text inputs'); 
     175$t->is($xml->xpath('//form[@name="form1"]/textarea[@name="multiple_textarea[]"]'), array('a1', 'a2'), '->fillInDom() fills in values for multiple textareas'); 
     176$t->is($xml->xpath('//form[@name="form1"]/select[@name="articles[]"][1]/option[@selected="selected"]'), array(1, 2), '->fillInDom() fills in values for multiple select'); 
     177$t->is($xml->xpath('//form[@name="form1"]/select[@name="articles[]"][2]/option[@selected="selected"]'), array(2, 3), '->fillInDom() fills in values for multiple select'); 
    153178 
    154179// ->setTypes() 
     
    172197$t->is(get_input_value($xml, 'input_checkbox', 'checked'), 'checked', '->setSkipFields() allows to prevent some fields to be filled'); 
    173198$t->is(get_input_value($xml, 'input_checkbox_not_checked', 'checked'), 'checked', '->setSkipFields() allows to prevent some fields to be filled'); 
    174 $t->is($xml->xpath('//form[@name="form1"]/textarea'), array('content'), '->setSkipFields() allows to prevent some fields to be filled'); 
     199$t->is($xml->xpath('//form[@name="form1"]/textarea[@name="textarea"]'), array('content'), '->setSkipFields() allows to prevent some fields to be filled'); 
    175200$t->is($xml->xpath('//form[@name="form1"]/select[@name="select"]/option[@selected="selected"]'), array('first'), '->setSkipFields() allows to prevent some fields to be filled'); 
    176201$t->is($xml->xpath('//form[@name="form1"]/select[@name="select_multiple"]/option[@selected="selected"]'), array('selected', 'last'), '->setSkipFields() allows to prevent some fields to be filled'); 
     
    186211$t->is(get_input_value($xml, 'empty_input_text'), 'input text', '->addConverter() register a callable to be called for each value'); 
    187212$t->is(get_input_value($xml, 'input_checkbox', 'checked'), '', '->addConverter() register a callable to be called for each value'); 
    188 $t->is($xml->xpath('//form[@name="form1"]/textarea'), array(str_rot13('my content')), '->addConverter() register a callable to be called for each value'); 
     213$t->is($xml->xpath('//form[@name="form1"]/textarea[@name="textarea"]'), array(str_rot13('my content')), '->addConverter() register a callable to be called for each value'); 
    189214 
    190215function get_input_value($xml, $name, $attribute = 'value', $form = null) 

The Sensio Labs Network

Since 1998, Sensio Labs has been promoting the Open-Source software movement by providing quality web application development, training, consulting, and supporting several large Open-Source projects.