ソースを参照

Zend_Form::setDefaults() check whether an array or Traversable object is passed

Martin Hujer 11 年 前
コミット
89e2c5d7b7
2 ファイル変更32 行追加1 行削除
  1. 6 1
      library/Zend/Form.php
  2. 26 0
      tests/Zend/Form/FormTest.php

+ 6 - 1
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($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()) {

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

@@ -4865,6 +4865,32 @@ class Zend_Form_FormTest extends PHPUnit_Framework_TestCase
         //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