diff --git a/library/Zend/Form.php b/library/Zend/Form.php index 7566c43d17..63df54f2c5 100644 --- a/library/Zend/Form.php +++ b/library/Zend/Form.php @@ -1268,11 +1268,16 @@ public function clearElements() * * 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()) { diff --git a/tests/Zend/Form/FormTest.php b/tests/Zend/Form/FormTest.php index 218cba848b..765c5df18b 100644 --- a/tests/Zend/Form/FormTest.php +++ b/tests/Zend/Form/FormTest.php @@ -4865,6 +4865,32 @@ 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