Kaynağa Gözat

ZF-9863: Fix FormErrors Decorator ArrayNotation handling

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@22231 44c647ce-9c0f-0410-b52a-842ac1e357ba
alab 15 yıl önce
ebeveyn
işleme
36420ccb86

+ 14 - 3
library/Zend/Form/Decorator/FormErrors.php

@@ -366,9 +366,20 @@ class Zend_Form_Decorator_FormErrors extends Zend_Form_Decorator_Abstract
     protected function _recurseForm(Zend_Form $form, Zend_View_Interface $view)
     {
         $content = '';
-        $errors  = $form->getMessages();
-        if ($form instanceof Zend_Form_SubForm) {
-            $name = $form->getName();
+
+        $errors = $form->getMessages();
+        
+        if ($form->isArray()) {
+            $name = $form->getElementsBelongTo();
+            $path = trim(strtr((string)$name, array('[' => '/', ']' => '')), '/');
+            $segs = ('' !== $path) ? explode('/', $path) : array();
+            foreach ($segs as $seg) {
+                if (!array_key_exists($seg, (array)$errors)) {
+                    return '';
+                }
+                $errors = $errors[$seg];
+            }
+        } else if ($form instanceof Zend_Form_SubForm) {
             if ((1 == count($errors)) && array_key_exists($name, $errors)) {
                 $errors = $errors[$name];
             }

+ 2 - 0
tests/Zend/Form/Decorator/AllTests.php

@@ -32,6 +32,7 @@ require_once 'Zend/Form/Decorator/DescriptionTest.php';
 require_once 'Zend/Form/Decorator/ErrorsTest.php';
 require_once 'Zend/Form/Decorator/FieldsetTest.php';
 require_once 'Zend/Form/Decorator/FileTest.php';
+require_once 'Zend/Form/Decorator/FormErrorsTest.php';
 require_once 'Zend/Form/Decorator/FormTest.php';
 require_once 'Zend/Form/Decorator/HtmlTagTest.php';
 require_once 'Zend/Form/Decorator/ImageTest.php';
@@ -64,6 +65,7 @@ class Zend_Form_Decorator_AllTests
         $suite->addTestSuite('Zend_Form_Decorator_ErrorsTest');
         $suite->addTestSuite('Zend_Form_Decorator_FieldsetTest');
         $suite->addTestSuite('Zend_Form_Decorator_FileTest');
+        $suite->addTestSuite('Zend_Form_Decorator_FormErrorsTest');
         $suite->addTestSuite('Zend_Form_Decorator_FormTest');
         $suite->addTestSuite('Zend_Form_Decorator_HtmlTagTest');
         $suite->addTestSuite('Zend_Form_Decorator_ImageTest');

+ 20 - 0
tests/Zend/Form/Decorator/FormErrorsTest.php

@@ -254,6 +254,26 @@ class Zend_Form_Decorator_FormErrorsTest extends PHPUnit_Framework_TestCase
         }
     }
 
+    public function testRenderIsArrayForm()
+    {
+        $this->setupForm();
+        $this->form->setName('foo')
+                   ->setIsArray(true);
+        $content = 'test content';
+        $test = $this->decorator->render($content);
+        $this->assertContains($content, $test);
+        foreach ($this->form->getMessages() as $name => $messages) {
+            while (($message = current($messages))) {
+                if (is_string($message)) {
+                    $this->assertContains($message, $test, var_export($messages, 1));
+                }
+                if (false === next($messages) && is_array(prev($messages))) {
+                    $messages = current($messages);
+                }
+            }
+        }
+    }
+
     /**
      * @dataProvider markupOptionMethodsProvider
      */