Index: library/Zend/Form/Element.php =================================================================== --- library/Zend/Form/Element.php (revision 24092) +++ library/Zend/Form/Element.php (working copy) @@ -1377,15 +1377,23 @@ if ($isArray && is_array($value)) { $messages = array(); $errors = array(); - foreach ($value as $val) { - if (!$validator->isValid($val, $context)) { + if (empty($value)) { + if ($this->isRequired() + || (!$this->isRequired() && !$this->getAllowEmpty()) + ) { $result = false; - if ($this->_hasErrorMessages()) { - $messages = $this->_getErrorMessages(); - $errors = $messages; - } else { - $messages = array_merge($messages, $validator->getMessages()); - $errors = array_merge($errors, $validator->getErrors()); + } + } else { + foreach ($value as $val) { + if (!$validator->isValid($val, $context)) { + $result = false; + if ($this->_hasErrorMessages()) { + $messages = $this->_getErrorMessages(); + $errors = $messages; + } else { + $messages = array_merge($messages, $validator->getMessages()); + $errors = array_merge($errors, $validator->getErrors()); + } } } } Index: tests/Zend/Form/ElementTest.php =================================================================== --- tests/Zend/Form/ElementTest.php (revision 24092) +++ tests/Zend/Form/ElementTest.php (working copy) @@ -2189,6 +2189,39 @@ $validator = $username->getValidator('regex'); $this->assertTrue($validator->zfBreakChainOnFailure); } + + /** + * @group ZF-11402 + */ + public function testValidatorForArrayElementsDoesNotAcceptEmptyArray() + { + $element = new Zend_Form_Element('test'); + $element->setIsArray(true); + $element->addValidator('InArray',true,array( + 'haystack'=>array('k1','k2') + )); + $this->assertTrue($element->isValid(array('test'=>'k1'))); + $this->assertTrue($element->isValid(array('test'=>'k2'))); + $this->assertFalse($element->isValid(array('test'=>'k9'))); + + $element->setRequired(false); + $element->setAllowEmpty(false); + $this->assertFalse($element->isValid(array())); + + $element->setRequired(false); + $element->setAllowEmpty(true); + $this->assertTrue($element->isValid(array())); + + $element->setRequired(true); + $element->setAllowEmpty(true); + $this->assertFalse($element->isValid(array())); + + $element->setRequired(true); + $element->setAllowEmpty(false); + $this->assertFalse($element->isValid(array())); + + } + } class Zend_Form_ElementTest_Decorator extends Zend_Form_Decorator_Abstract Index: tests/Zend/Form/Element/MultiCheckboxTest.php =================================================================== --- tests/Zend/Form/Element/MultiCheckboxTest.php (revision 24092) +++ tests/Zend/Form/Element/MultiCheckboxTest.php (working copy) @@ -278,6 +278,29 @@ $this->element->isValid(array('foo', 'bogus')); $html = $this->element->render($this->getView()); } + + /** + * @group ZF-11402 + */ + public function testValidateShouldNotAcceptEmptyArray() + { + $this->element->addMultiOptions(array( + 'foo' => 'Foo', + 'bar' => 'Bar', + 'baz' => 'Baz', + )); + $this->element->setRegisterInArrayValidator(true); + + $this->assertTrue($this->element->isValid(array('foo'))); + $this->assertTrue($this->element->isValid(array('foo','baz'))); + + $this->element->setAllowEmpty(true); + $this->assertTrue($this->element->isValid(array())); + + $this->element->setAllowEmpty(false); + $this->assertFalse($this->element->isValid(array())); + } + } // Call Zend_Form_Element_MultiCheckboxTest::main() if this source file is executed directly.