Просмотр исходного кода

Merge pull request #371 from mhujer/form-array-hint

Allow children of Zend_Form to handle setDefaults to array conversion by themselves
Frank Brückner 11 лет назад
Родитель
Сommit
634885c8b2
2 измененных файлов с 47 добавлено и 2 удалено
  1. 7 2
      library/Zend/Form.php
  2. 40 0
      tests/Zend/Form/FormTest.php

+ 7 - 2
library/Zend/Form.php

@@ -1268,11 +1268,16 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
      *
      * Sets values for all elements specified in the array of $defaults.
      *
-     * @param  array $defaults
+     * @param  array|Traversable $defaults
+     * @throws Zend_Form_Exception When invalid type is passed
      * @return Zend_Form
      */
-    public function setDefaults(array $defaults)
+    public function setDefaults($defaults)
     {
+        if (!is_array($defaults) && !$defaults instanceof Traversable) {
+            throw new Zend_Form_Exception('Argument passed to setDefaults() must be of type array or Traversable.');
+        }
+
         $eBelongTo = null;
 
         if ($this->isArray()) {

+ 40 - 0
tests/Zend/Form/FormTest.php

@@ -4859,6 +4859,46 @@ class Zend_Form_FormTest extends PHPUnit_Framework_TestCase
         $this->assertTrue($element->hasErrors());
         $this->assertFalse($element->isValid(1));
     }
+
+    public function testSetDefaultsAllowOverridingWithNonArrayParameter()
+    {
+        //this would throw a strict warning if the setDefaults() method requires param to be array
+        $form = new Zend_Form_FormTest_SetDefaults();
+    }
+
+    public function testCanSetElementDefaultValuesFromTraversable()
+    {
+        $this->testCanAddAndRetrieveMultipleElements();
+        $values = array(
+            'foo' => 'foovalue',
+            'bar' => 'barvalue',
+            'baz' => 'bazvalue',
+            'bat' => 'batvalue',
+        );
+        $traversable = new ArrayIterator($values);
+        $this->form->setDefaults($traversable);
+        $elements = $this->form->getElements();
+        foreach (array_keys($values) as $name) {
+            $this->assertEquals($name . 'value', $elements[$name]->getValue());
+        }
+    }
+
+    /**
+     * @expectedException Zend_Form_Exception
+     * @expectedExceptionMessage Argument passed to setDefaults() must be of type array or Traversable.
+     */
+    public function testSetDefaultsWithInvalidTypeThrowsException()
+    {
+        $this->form->setDefaults(new stdClass());
+    }
+}
+
+class Zend_Form_FormTest_SetDefaults extends Zend_Form
+{
+    public function setDefaults($defaults)
+    {
+        return parent::setDefaults($defaults);
+    }
 }
 
 class Zend_Form_FormTest_DisplayGroup extends Zend_Form_DisplayGroup