From 89e2c5d7b7d18d53ded6eaa17e0afaaad2104ae9 Mon Sep 17 00:00:00 2001 From: Martin Hujer Date: Tue, 3 Jun 2014 23:21:53 +0200 Subject: [PATCH] Zend_Form::setDefaults() check whether an array or Traversable object is passed --- library/Zend/Form.php | 7 ++++++- tests/Zend/Form/FormTest.php | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) 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