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

Zend_Filter_Input: improved missing fields processing. Closes [ZF-6761].

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

+ 11 - 4
library/Zend/Filter/Input.php

@@ -831,12 +831,19 @@ class Zend_Filter_Input
                 $data[$field] = $this->_data[$field];
             } else if (isset($validatorRule[self::DEFAULT_VALUE])) {
                 /** @todo according to this code default value can't be an array. It has to be reviewed */
-            	if (is_array($validatorRule[self::DEFAULT_VALUE])) {
-                    if (isset($validatorRule[self::DEFAULT_VALUE][$key])) {
+            	if (!is_array($validatorRule[self::DEFAULT_VALUE])) {
+            		// Default value is a scalar
+                    $data[$field] = $validatorRule[self::DEFAULT_VALUE];
+                } else {
+                	// Default value is an array. Search for corresponding key
+            		if (isset($validatorRule[self::DEFAULT_VALUE][$key])) {
                         $data[$field] = $validatorRule[self::DEFAULT_VALUE][$key];
+                    } else if ($validatorRule[self::PRESENCE] == self::PRESENCE_REQUIRED) {
+                    	// Default value array is provided, but it doesn't have an entry for current field
+                    	// and presence is required
+                        $this->_missingFields[$validatorRule[self::RULE]][] =
+                           $this->_getMissingMessage($validatorRule[self::RULE], $field);
                     }
-                } else {
-                    $data[$field] = $validatorRule[self::DEFAULT_VALUE];
                 }
             } else if ($validatorRule[self::PRESENCE] == self::PRESENCE_REQUIRED) {
                 $this->_missingFields[$validatorRule[self::RULE]][] =

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

@@ -659,6 +659,30 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('field8default', $input->field8, 'Expected field8 to be non-null');
     }
 
+    /**
+     * @group ZF-6761
+     */
+    public function testValidatorMissingDefaults()
+    {
+        $validators = array(
+            'rule1'   => array('presence' => 'required',
+                               'fields'   => array('field1', 'field2'),
+                               'default'  => array('field1default'))
+        );
+        $data = array();
+        $input = new Zend_Filter_Input(null, $validators, $data);
+
+        $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
+        $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
+        $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
+        $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
+
+        $missing = $input->getMissing();
+        $this->assertType('array', $missing);
+        $this->assertEquals(array('rule1'), array_keys($missing));
+        $this->assertEquals(array("Field 'field2' is required by rule 'rule1', but the field is missing"), $missing['rule1']);
+    }
+
     public function testValidatorDefaultDoesNotOverwriteData()
     {
         $validators = array(