Browse Source

ZF-9551: correct errors created by validating a subform with identically named element

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@21699 44c647ce-9c0f-0410-b52a-842ac1e357ba
matthew 16 years ago
parent
commit
50bf11a5f3
2 changed files with 29 additions and 17 deletions
  1. 11 17
      library/Zend/Form.php
  2. 18 0
      tests/Zend/Form/FormTest.php

+ 11 - 17
library/Zend/Form.php

@@ -2077,29 +2077,23 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
 
         $translator        = $this->getTranslator();
         $valid             = true;
-        $validatedSubForms = array();
 
-        foreach ($data as $key => $value) {
-            if (null !== ($element = $this->getElement($key))) {
+        foreach ($this->getElements() as $key => $element) {
+            if (isset($data[$key])) {
                 if (null !== $translator && !$element->hasTranslator()) {
                     $element->setTranslator($translator);
                 }
-                $valid = $element->isValid($value, $data) && $valid;
-            } elseif (null !== ($subForm = $this->getSubForm($key))) {
-                if (null !== $translator && !$subForm->hasTranslator()) {
-                    $subForm->setTranslator($translator);
-                }
-                $valid = $subForm->isValidPartial($data[$key]) && $valid;
-                $validatedSubForms[] = $key;
+                $valid = $element->isValid($data[$key], $data) && $valid;
             }
         }
-        foreach ($this->getSubForms() as $key => $subForm) {
-            if (!in_array($key, $validatedSubForms)) {
-                if (null !== $translator && !$subForm->hasTranslator()) {
-                    $subForm->setTranslator($translator);
-                }
-
-                $valid = $subForm->isValidPartial($data) && $valid;
+        foreach ($this->getSubForms() as $key => $form) {
+            if (null !== $translator && !$form->hasTranslator()) {
+                $form->setTranslator($translator);
+            }
+            if (isset($data[$key]) && !$form->isArray()) {
+                $valid = $form->isValidPartial($data[$key]) && $valid;
+            } else {
+                $valid = $form->isValidPartial($data) && $valid;
             }
         }
 

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

@@ -1491,6 +1491,24 @@ class Zend_Form_FormTest extends PHPUnit_Framework_TestCase
         $this->assertTrue($this->form->isValid($foo));
     } 
 
+    public function testIsValidPartialEqualSubFormAndElementName()
+    {
+        $this->form->addSubForm(new Zend_Form_SubForm(), 'foo')
+                   ->foo->addElement('text', 'foo')
+                        ->foo->setRequired(true)
+                             ->addValidator('Identical',
+                                            false,
+                                            array('Foo Value'));
+        $foo = array('foo' =>
+                     array('foo' => 'Foo Value'));
+
+        $this->assertTrue($this->form->isValidPartial($foo));
+
+        $this->form->foo->setIsArray(false);
+
+        $this->assertTrue($this->form->isValidPartial($foo));
+    } 
+
 
     // Display groups