Procházet zdrojové kódy

ZF-11402: do not allow empty arrays on required multi-elements

- Applied patch by Adam L.

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@24197 44c647ce-9c0f-0410-b52a-842ac1e357ba
matthew před 14 roky
rodič
revize
3449f928ca

+ 16 - 8
library/Zend/Form/Element.php

@@ -1377,15 +1377,23 @@ class Zend_Form_Element implements Zend_Validate_Interface
             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());
+                            }
                         }
                     }
                 }

+ 22 - 0
tests/Zend/Form/Element/MultiCheckboxTest.php

@@ -278,6 +278,28 @@ class Zend_Form_Element_MultiCheckboxTest extends PHPUnit_Framework_TestCase
         $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.