Ver Fonte

ZF-9697: isValid|Partial getValidValues strips context fix + Unit Tests

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@21923 44c647ce-9c0f-0410-b52a-842ac1e357ba
alab há 15 anos atrás
pai
commit
e6a2369738
2 ficheiros alterados com 50 adições e 9 exclusões
  1. 10 9
      library/Zend/Form.php
  2. 40 0
      tests/Zend/Form/FormTest.php

+ 10 - 9
library/Zend/Form.php

@@ -1365,17 +1365,17 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
             $eBelongTo = $this->getElementsBelongTo();
             $data = $this->_dissolveArrayValue($data, $eBelongTo);
         }
-        
+        $context = $data;
         foreach ($this->getElements() as $key => $element) {
             $check = $data;
             if (($belongsTo = $element->getBelongsTo()) !== $eBelongTo) {
                 $check = $this->_dissolveArrayValue($data, $belongsTo);
             }
             if (isset($check[$key])) {
-                if($element->isValid($check[$key], $check)) {
+                if($element->isValid($check[$key], $context)) {
                     $merge = array();
                     if ($belongsTo !== $eBelongTo && '' !== (string)$belongsTo) {
-                            $key = $belongsTo . '[' . $key . ']';
+                        $key = $belongsTo . '[' . $key . ']';
                     }
                     $merge = $this->_attachToArray($element->getValue(), $key);
                     $values = array_merge_recursive($values, $merge);
@@ -2120,7 +2120,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
             $eBelongTo = $this->getElementsBelongTo();
             $data = $this->_dissolveArrayValue($data, $eBelongTo);
         }
-
+        $context = $data;
         foreach ($this->getElements() as $key => $element) {
             if (null !== $translator && !$element->hasTranslator()) {
                 $element->setTranslator($translator);
@@ -2130,9 +2130,9 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
                 $check = $this->_dissolveArrayValue($data, $belongsTo);
             }
             if (!isset($check[$key])) {
-                $valid = $element->isValid(null, $check) && $valid;
+                $valid = $element->isValid(null, $context) && $valid;
             } else {
-                $valid = $element->isValid($check[$key], $check) && $valid;
+                $valid = $element->isValid($check[$key], $context) && $valid;
                 $data = $this->_dissolveArrayUnsetKey($data, $belongsTo, $key);
             }
         }
@@ -2174,8 +2174,9 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
             $data = $this->_dissolveArrayValue($data, $eBelongTo);
         }
 
-        $translator        = $this->getTranslator();
-        $valid             = true;
+        $translator = $this->getTranslator();
+        $valid      = true;
+        $context    = $data;
 
         foreach ($this->getElements() as $key => $element) {
             $check = $data;
@@ -2186,7 +2187,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
                 if (null !== $translator && !$element->hasTranslator()) {
                     $element->setTranslator($translator);
                 }
-                $valid = $element->isValid($check[$key], $check) && $valid;
+                $valid = $element->isValid($check[$key], $context) && $valid;
                 $data = $this->_dissolveArrayUnsetKey($data, $belongsTo, $key);
             }
         }

+ 40 - 0
tests/Zend/Form/FormTest.php

@@ -2718,6 +2718,46 @@ class Zend_Form_FormTest extends PHPUnit_Framework_TestCase
         }
     }
 
+   /**
+    * @Group ZF-9697
+    */
+    public function _setup9697()
+    {
+        $callback = create_function('$value, $options',
+                                    'return (isset($options["bar"]["quo"]["foo"]) &&
+                                             "foo Value" === $options["bar"]["quo"]["foo"]);');
+
+        $this->form->addElement('text', 'foo')
+                   ->foo->setBelongsTo('bar[quo]');
+
+        $this->form->addElement('text', 'quo')
+                   ->quo->setBelongsTo('bar[quo]')
+                        ->addValidator('Callback',
+                                       false,
+                                       $callback);
+
+        return array('bar' => array('quo' => array('foo' => 'foo Value',
+                                                   'quo' => 'quo Value')));
+    }
+
+    public function testIsValidKeepsContext()
+    {
+        $data = $this->_setup9697();
+        $this->assertTrue($this->form->isValid($data));
+    }
+
+    public function testIsValidPartialKeepsContext()
+    {
+        $data = $this->_setup9697();
+        $this->assertTrue($this->form->isValidPartial($data));
+    }
+
+    public function testGetValidValuesKeepsContext()
+    {
+        $data = $this->_setup9697();
+        $this->assertSame($data, $this->form->getValidValues($data));
+    }
+
     /**#@+
      * @group ZF-2988
      */