Browse Source

Zend_Filter: corrected ALLOW_EMPTY metacommand processing workflow. Closes [ZF-6708], [ZF-1912].

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@15678 44c647ce-9c0f-0410-b52a-842ac1e357ba
alexander 16 years ago
parent
commit
943a37dd86
2 changed files with 45 additions and 16 deletions
  1. 19 14
      library/Zend/Filter/Input.php
  2. 26 2
      tests/Zend/Filter/InputTest.php

+ 19 - 14
library/Zend/Filter/Input.php

@@ -905,22 +905,27 @@ class Zend_Filter_Input
             if (!is_array($field)) {
                 $field = array($field);
             }
+
+
+            $notEmptyValidator = $this->_getValidator('NotEmpty');
+            $notEmptyValidator->setMessage($this->_getNotEmptyMessage($validatorRule[self::RULE], $fieldName));
+            if ($validatorRule[self::ALLOW_EMPTY]) {
+            	$validatorChain = $validatorRule[self::VALIDATOR_CHAIN];
+            } else {
+                $validatorChain = new Zend_Validate();
+                $validatorChain->addValidator($notEmptyValidator, true /* Always break on failure */);
+                $validatorChain->addValidator($validatorRule[self::VALIDATOR_CHAIN]);
+            }
+
             foreach ($field as $value) {
-                if (empty($value)) {
-                    if ($validatorRule[self::ALLOW_EMPTY] == true) {
-                        continue;
-                    }
-                    if ($validatorRule[self::VALIDATOR_CHAIN_COUNT] == 0) {
-                        $notEmptyValidator = $this->_getValidator('NotEmpty');
-                        $notEmptyValidator->setMessage($this->_getNotEmptyMessage($validatorRule[self::RULE], $fieldName));
-                        $validatorRule[self::VALIDATOR_CHAIN]->addValidator($notEmptyValidator);
-                    }
+                if ($validatorRule[self::ALLOW_EMPTY]  &&  !$notEmptyValidator->isValid($value)) {
+                    // Field is empty AND it's allowed. Do nothing.
+                    continue;
                 }
-                if (!$validatorRule[self::VALIDATOR_CHAIN]->isValid($value)) {
-                    $this->_invalidMessages[$validatorRule[self::RULE]] =
-                        $validatorRule[self::VALIDATOR_CHAIN]->getMessages();
-                    $this->_invalidErrors[$validatorRule[self::RULE]] =
-                        $validatorRule[self::VALIDATOR_CHAIN]->getErrors();
+
+                if (!$validatorChain->isValid($value)) {
+                    $this->_invalidMessages[$validatorRule[self::RULE]] = $validatorChain->getMessages();
+                    $this->_invalidErrors[$validatorRule[self::RULE]]   = $validatorChain->getErrors();
                     unset($this->_validFields[$fieldName]);
                     $failed = true;
                     if ($validatorRule[self::BREAK_CHAIN]) {

+ 26 - 2
tests/Zend/Filter/InputTest.php

@@ -542,7 +542,31 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
         $messages = $input->getMessages();
         $this->assertType('array', $messages);
         $this->assertEquals(array('field1'), array_keys($messages));
-        $this->assertEquals("'' is an empty string", current($messages['field1']));
+        $this->assertEquals("You must give a non-empty value for field 'field1'", current($messages['field1']));
+    }
+
+    public function testValidatorAllowEmptyWithOtherValidatersProcessing()
+    {
+        $data = array(
+            'field1' => ''
+        );
+        $validators = array(
+            'field1' => array(
+                'alpha',
+                Zend_Filter_Input::ALLOW_EMPTY => false
+            ),
+        );
+        $input = new Zend_Filter_Input(null, $validators, $data);
+
+        $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
+        $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
+        $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
+        $this->assertFalse($input->hasValid(), 'Expected hasValid() to return true');
+
+        $messages = $input->getMessages();
+        $this->assertType('array', $messages);
+        $this->assertEquals(array('field1'), array_keys($messages));
+        $this->assertEquals("You must give a non-empty value for field 'field1'", current($messages['field1']));
     }
 
     public function testValidatorAllowEmptyNoValidatorChain()
@@ -737,7 +761,7 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
         $this->assertType('array', $messages);
         $this->assertEquals(array('field2', 'field3'), array_keys($messages));
         $this->assertType('array', $messages['field2']);
-        $this->assertEquals("'' is an empty string", current($messages['field2']));
+        $this->assertEquals("You must give a non-empty value for field 'field2'", current($messages['field2']));
     }
 
     public function testValidatorMessagesSingle()