فهرست منبع

[ZF-7034, ZF-7394] Zend_Filter_Input:

- fixed handling of 'messages' array
- fixed settings for NotEmpty when overriding the default one

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@17845 44c647ce-9c0f-0410-b52a-842ac1e357ba
thomas 16 سال پیش
والد
کامیت
dc9fb07b1b
3فایلهای تغییر یافته به همراه97 افزوده شده و 6 حذف شده
  1. 12 5
      library/Zend/Filter/Input.php
  2. 6 1
      library/Zend/Validate/Abstract.php
  3. 79 0
      tests/Zend/Filter/InputTest.php

+ 12 - 5
library/Zend/Filter/Input.php

@@ -740,19 +740,21 @@ class Zend_Filter_Input
             if (!isset($validatorRule[self::ALLOW_EMPTY])) {
                 $validatorRule[self::ALLOW_EMPTY] = $this->_defaults[self::ALLOW_EMPTY];
             }
+
             if (!isset($validatorRule[self::MESSAGES])) {
                 $validatorRule[self::MESSAGES] = array();
             } else if (!is_array($validatorRule[self::MESSAGES])) {
                 $validatorRule[self::MESSAGES] = array($validatorRule[self::MESSAGES]);
-            } else if (!array_intersect_key($validatorList, $validatorRule[self::MESSAGES])) {
+            } else if (array_intersect_key($validatorList, $validatorRule[self::MESSAGES])) {
                 // There are now corresponding numeric keys in the validation rule messages array
                 // Treat it as a named messages list for all rule validators
-                /** @todo Update documentation to describe this possibility */
                 $unifiedMessages = $validatorRule[self::MESSAGES];
                 $validatorRule[self::MESSAGES] = array();
 
                 foreach ($validatorList as $key => $validator) {
-                    $validatorRule[self::MESSAGES][$key] = $unifiedMessages;
+                    if (array_key_exists($key, $unifiedMessages)) {
+                        $validatorRule[self::MESSAGES][$key] = $unifiedMessages[$key];
+                    }
                 }
             }
 
@@ -766,6 +768,7 @@ class Zend_Filter_Input
                     if (is_string($validator) || is_array($validator)) {
                         $validator = $this->_getValidator($validator);
                     }
+
                     if (isset($validatorRule[self::MESSAGES][$key])) {
                         $value = $validatorRule[self::MESSAGES][$key];
                         if (is_array($value)) {
@@ -773,6 +776,10 @@ class Zend_Filter_Input
                         } else {
                             $validator->setMessage($value);
                         }
+
+                        if ($validator instanceof Zend_Validate_NotEmpty) {
+                            $this->_defaults[self::NOT_EMPTY_MESSAGE] = $value;
+                        }
                     }
 
                     $validatorRule[self::VALIDATOR_CHAIN]->addValidator($validator, $validatorRule[self::BREAK_CHAIN]);
@@ -882,12 +889,14 @@ class Zend_Filter_Input
                         $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();
@@ -899,13 +908,11 @@ class Zend_Filter_Input
             $fieldName = reset($fieldNames);
             $field     = reset($data);
 
-
             $failed = false;
             if (!is_array($field)) {
                 $field = array($field);
             }
 
-
             $notEmptyValidator = $this->_getValidator('NotEmpty');
             $notEmptyValidator->setMessage($this->_getNotEmptyMessage($validatorRule[self::RULE], $fieldName));
             if ($validatorRule[self::ALLOW_EMPTY]) {

+ 6 - 1
library/Zend/Validate/Abstract.php

@@ -142,12 +142,17 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface
     {
         if ($messageKey === null) {
             $keys = array_keys($this->_messageTemplates);
-            $messageKey = current($keys);
+            foreach($keys as $key) {
+                $this->setMessage($messageString, $key);
+            }
+            return $this;
         }
+
         if (!isset($this->_messageTemplates[$messageKey])) {
             require_once 'Zend/Validate/Exception.php';
             throw new Zend_Validate_Exception("No message template exists for key '$messageKey'");
         }
+
         $this->_messageTemplates[$messageKey] = $messageString;
         return $this;
     }

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

@@ -1805,6 +1805,85 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
 
         $this->assertNull($input->field1);
     }
+
+    /**
+     * @group ZF-7034
+     */
+    public function testSettingNotEmptyMessageAndMessagePerKeyAndMessagePerArray()
+    {
+        require_once 'Zend/Validate/NotEmpty.php';
+        require_once 'Zend/Validate/Regex.php';
+        require_once 'Zend/Validate/StringLength.php';
+
+        $filters = array( );
+        $validators = array(
+            'street' => array (
+                new Zend_Validate_NotEmpty (),
+                new Zend_Validate_Regex ( '/^[a-zA-Z0-9]{1,30}$/u' ),
+                new Zend_Validate_StringLength ( 0, 10 ),
+                Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_REQUIRED,
+                Zend_Filter_Input::DEFAULT_VALUE => '',
+                Zend_Filter_Input::BREAK_CHAIN => true,
+                'messages' => array (
+                    0 => 'Bitte geben Sie Ihre Straße ein.',
+                    'Verwenden Sie bitte keine Sonderzeichen bei der Eingabe.',
+                    array (
+                        Zend_Validate_StringLength::TOO_LONG => 'Bitte beschränken Sie sich auf %max% Zeichen'
+                    )
+                )
+            )
+        );
+
+        $data = array(
+            'street' => ''
+        );
+
+        $filter = new Zend_Filter_Input($filters, $validators, array('street' => ''));
+        $this->assertFalse($filter->isValid());
+        $message = $filter->getMessages();
+        $this->assertContains('Bitte geben Sie Ihre Straße ein.', $message['street']['isEmpty']);
+
+        $filter2 = new Zend_Filter_Input($filters, $validators, array('street' => 'Str!!'));
+        $this->assertFalse($filter2->isValid());
+        $message = $filter2->getMessages();
+        $this->assertContains('Verwenden Sie bitte keine Sonderzeichen', $message['street']['regexNotMatch']);
+
+        $filter3 = new Zend_Filter_Input($filters, $validators, array('street' => 'Str1234567890'));
+        $this->assertFalse($filter3->isValid());
+        $message = $filter3->getMessages();
+        $this->assertContains('Bitte beschränken Sie sich auf', $message['street']['stringLengthTooLong']);
+    }
+
+    /**
+     * @group ZF-7394
+     */
+    public function testSettingMultipleNotEmptyMessages()
+    {
+        require_once 'Zend/Validate/NotEmpty.php';
+        require_once 'Zend/Validate/Regex.php';
+        require_once 'Zend/Validate/StringLength.php';
+
+        $filters = array( );
+        $validators = array(
+            'name' => array('NotEmpty','messages' => 'Please enter your name'),
+            'subject' => array('NotEmpty','messages' => 'Please enter a subject'),
+            'email' => array('EmailAddress','messages' => 'Please enter a valid Email address'),
+            'content' => array('NotEmpty','messages' => 'Please enter message contents')
+        );
+
+        $data = array(
+            'name' => '',
+            'subject' => '',
+            'content' => ''
+        );
+
+        $filter = new Zend_Filter_Input($filters, $validators, $data);
+        $this->assertFalse($filter->isValid());
+        $message = $filter->getMessages();
+        $this->assertContains('Please enter your name', $message['name']['isEmpty']);
+        $this->assertContains('Please enter a subject', $message['subject']['isEmpty']);
+        $this->assertContains('Please enter message contents', $message['content']['isEmpty']);
+    }
 }
 
 class MyZend_Filter_Date implements Zend_Filter_Interface