Просмотр исходного кода

Zend_Filter_Input: ALLOW_EMPTY metacommand processing for multi-fieldmulti-field rules. Closes [ZF-6711].

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@15660 44c647ce-9c0f-0410-b52a-842ac1e357ba
alexander 16 лет назад
Родитель
Сommit
ebb7e91521
2 измененных файлов с 83 добавлено и 0 удалено
  1. 27 0
      library/Zend/Filter/Input.php
  2. 56 0
      tests/Zend/Filter/InputTest.php

+ 27 - 0
library/Zend/Filter/Input.php

@@ -855,6 +855,33 @@ class Zend_Filter_Input
          * Evaluate the inputs against the validator chain.
          */
         if (count((array) $validatorRule[self::FIELDS]) > 1) {
+        	if (!$validatorRule[self::ALLOW_EMPTY]) {
+        		$emptyFieldsFound = false;
+        		$errorsList       = array();
+        		$messages         = array();
+
+        		foreach ($data as $fieldKey => $field) {
+                	$notEmptyValidator = $this->_getValidator('NotEmpty');
+                	$notEmptyValidator->setMessage($this->_getNotEmptyMessage($validatorRule[self::RULE], $fieldKey));
+
+                	if (!$notEmptyValidator->isValid($field)) {
+                		foreach ($notEmptyValidator->getMessages() as $messageKey => $message) {
+                			if (!isset($messages[$messageKey])) {
+                				$messages[$messageKey] = $message;
+                			} else {
+                				$messages[] = $message;
+                			}
+                		}
+                        $errorsList[] = $notEmptyValidator->getErrors();
+                        $emptyFieldsFound = true;
+                	}
+                }
+                if ($emptyFieldsFound) {
+                	$this->_invalidMessages[$validatorRule[self::RULE]] = $messages;
+                    $this->_invalidErrors[$validatorRule[self::RULE]]   = array_unique(call_user_func_array('array_merge', $errorsList));
+                    return;
+                }
+            }
         	if (!$validatorRule[self::VALIDATOR_CHAIN]->isValid($data)) {
         		$this->_invalidMessages[$validatorRule[self::RULE]] = $validatorRule[self::VALIDATOR_CHAIN]->getMessages();
         		$this->_invalidErrors[$validatorRule[self::RULE]] = $validatorRule[self::VALIDATOR_CHAIN]->getErrors();

+ 56 - 0
tests/Zend/Filter/InputTest.php

@@ -417,6 +417,62 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
             current($messages['rule2']));
     }
 
+    /**
+     * @group ZF-6711
+     *
+     */
+    public function testValidatorMultiFieldAllowEmptyProcessing()
+    {
+        $data = array(
+            'password1' => 'EREIAMJH',
+            'password2' => 'EREIAMJH',
+            'password3' => '',
+            'password4' => ''
+        );
+        $validators = array(
+            'rule1' => array(
+                'StringEquals',
+                'fields' => array('password1', 'password2')
+            ),
+            'rule2' => array(
+                Zend_Filter_Input::ALLOW_EMPTY => false,
+                'StringEquals',
+                'fields' => array('password1', 'password3')
+            ),
+            'rule3' => array(
+                Zend_Filter_Input::ALLOW_EMPTY => false,
+                'StringEquals',
+                'fields' => array('password3', 'password4')
+            )
+        );
+        $options = array(
+            Zend_Filter_Input::INPUT_NAMESPACE => 'TestNamespace'
+        );
+
+        $ip = get_include_path();
+        $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files';
+        $newIp = $dir . PATH_SEPARATOR . $ip;
+        set_include_path($newIp);
+
+        $input = new Zend_Filter_Input(null, $validators, $data, $options);
+
+        $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->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
+
+        set_include_path($ip);
+        $messages = $input->getMessages();
+        $this->assertType('array', $messages);
+        $this->assertEquals(array('rule2', 'rule3'), array_keys($messages));
+        $this->assertEquals(array('isEmpty' => "You must give a non-empty value for field 'password3'"),
+                            $messages['rule2']);
+        $this->assertEquals(array('isEmpty' => "You must give a non-empty value for field 'password3'",
+                                          0 => "You must give a non-empty value for field 'password4'"
+                                 ),
+                            $messages['rule3']);
+    }
+
     public function testValidatorBreakChain()
     {
         $data = array(