Prechádzať zdrojové kódy

[ZF-11402] Zend_Form
Update to r24197 to fix issue with error messages being discarded when value is empty array


git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@24552 44c647ce-9c0f-0410-b52a-842ac1e357ba

adamlundrigan 14 rokov pred
rodič
commit
86a35d70d1

+ 11 - 12
library/Zend/Form/Element.php

@@ -1393,19 +1393,18 @@ class Zend_Form_Element implements Zend_Validate_Interface
                     if ($this->isRequired()
                         || (!$this->isRequired() && !$this->getAllowEmpty())
                     ) {
-                        $result = false;
+                        $value = '';
                     }
-                } 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());
-                            }
+                }
+                foreach ((array)$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());
                         }
                     }
                 }

+ 19 - 2
tests/Zend/Form/Element/MultiCheckboxTest.php

@@ -293,12 +293,29 @@ class Zend_Form_Element_MultiCheckboxTest extends PHPUnit_Framework_TestCase
     
         $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()));
-    
+
+        // Empty value + AllowEmpty=true = no error messages
+        $messages = $this->element->getMessages();
+        $this->assertEquals(0, count($messages), 'Received unexpected error message(s)');
+        
         $this->element->setAllowEmpty(false);
         $this->assertFalse($this->element->isValid(array()));
+        
+        // Empty value + AllowEmpty=false = notInArray error message
+        $messages = $this->element->getMessages();
+        $this->assertTrue(is_array($messages), 'Expected error message');
+        $this->assertArrayHasKey('notInArray', $messages, 'Expected \'notInArray\' error message');
+        
+        $this->element->setRequired(true)->setAllowEmpty(false);
+        $this->assertFalse($this->element->isValid(array()));
+        
+        // Empty value + Required=true + AllowEmpty=false = isEmpty error message
+        $messages = $this->element->getMessages();
+        $this->assertTrue(is_array($messages), 'Expected error message');
+        $this->assertArrayHasKey('isEmpty', $messages, 'Expected \'isEmpty\' error message');
     }
 }