Parcourir la source

Zend_Filter: validation messages for multi-value fields processing. Closes [ZF-6780].

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@15682 44c647ce-9c0f-0410-b52a-842ac1e357ba
alexander il y a 16 ans
Parent
commit
55b2873a75
2 fichiers modifiés avec 54 ajouts et 4 suppressions
  1. 21 2
      library/Zend/Filter/Input.php
  2. 33 2
      tests/Zend/Filter/InputTest.php

+ 21 - 2
library/Zend/Filter/Input.php

@@ -924,8 +924,27 @@ class Zend_Filter_Input
                 }
 
                 if (!$validatorChain->isValid($value)) {
-                    $this->_invalidMessages[$validatorRule[self::RULE]] = $validatorChain->getMessages();
-                    $this->_invalidErrors[$validatorRule[self::RULE]]   = $validatorChain->getErrors();
+                	if (isset($this->_invalidMessages[$validatorRule[self::RULE]])) {
+                		$collectedMessages = $this->_invalidMessages[$validatorRule[self::RULE]];
+                	} else {
+                		$collectedMessages = array();
+                	}
+
+                    foreach ($validatorChain->getMessages() as $messageKey => $message) {
+                        if (!isset($collectedMessages[$messageKey])) {
+                            $collectedMessages[$messageKey] = $message;
+                        } else {
+                            $collectedMessages[] = $message;
+                        }
+                    }
+
+                	$this->_invalidMessages[$validatorRule[self::RULE]] = $collectedMessages;
+                	if (isset($this->_invalidErrors[$validatorRule[self::RULE]])) {
+                        $this->_invalidErrors[$validatorRule[self::RULE]] = array_merge($this->_invalidErrors[$validatorRule[self::RULE]],
+                                                                                        $validatorChain->getErrors());
+                	} else {
+                		$this->_invalidErrors[$validatorRule[self::RULE]] = $validatorChain->getErrors();
+                	}
                     unset($this->_validFields[$fieldName]);
                     $failed = true;
                     if ($validatorRule[self::BREAK_CHAIN]) {

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

@@ -815,8 +815,39 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
         $this->assertType('array', $messages);
         $this->assertEquals(array('month'), array_keys($messages));
         $this->assertEquals(2, count($messages['month']));
-        // $this->assertEquals($digitsMesg, $messages['month'][0]);
-        // $this->assertEquals($betweenMesg, $messages['month'][1]);
+        $this->assertEquals($digitsMesg, $messages['month']['notDigits']);
+        $this->assertEquals($betweenMesg, $messages['month']['notBetween']);
+    }
+
+    public function testValidatorMessagesFieldsMultiple()
+    {
+        $data = array('field1' => array('13abc', '234'));
+        $digitsMesg = 'Field1 should consist of digits';
+        $betweenMesg = 'Field1 should be between 1 and 12';
+        Zend_Loader::loadClass('Zend_Validate_Between');
+        $validators = array(
+            'field1' => array(
+                'digits',
+                new Zend_Validate_Between(1, 12),
+                'messages' => array(
+                    $digitsMesg,
+                    $betweenMesg
+                )
+            )
+        );
+        $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 false');
+
+        $messages = $input->getMessages();
+        $this->assertType('array', $messages);
+        $this->assertEquals(array('field1'), array_keys($messages));
+        $this->assertEquals(3, count($messages['field1']));
+        $this->assertEquals($digitsMesg, $messages['field1']['notDigits']);
+        $this->assertEquals($betweenMesg, $messages['field1']['notBetween']);
     }
 
     public function testValidatorMessagesIntIndex()