Parcourir la source

Fix ZF-9540: Zend_Form isValid | isValidPartial resets individual SubForm Translator.

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@21665 44c647ce-9c0f-0410-b52a-842ac1e357ba
rob il y a 16 ans
Parent
commit
5d2586c421
2 fichiers modifiés avec 41 ajouts et 4 suppressions
  1. 15 3
      library/Zend/Form.php
  2. 26 1
      tests/Zend/Form/FormTest.php

+ 15 - 3
library/Zend/Form.php

@@ -2041,7 +2041,9 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
             }
         }
         foreach ($this->getSubForms() as $key => $form) {
-            $form->setTranslator($translator);
+            if (null !== $translator && !$form->hasTranslator()) {
+                $form->setTranslator($translator);
+            }
             if (isset($data[$key])) {
                 $valid = $form->isValid($data[$key]) && $valid;
             } else {
@@ -2084,7 +2086,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
                 }
                 $valid = $element->isValid($value, $data) && $valid;
             } elseif (null !== ($subForm = $this->getSubForm($key))) {
-                if (null !== $translator) {
+                if (null !== $translator && !$subForm->hasTranslator()) {
                     $subForm->setTranslator($translator);
                 }
                 $valid = $subForm->isValidPartial($data[$key]) && $valid;
@@ -2093,7 +2095,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
         }
         foreach ($this->getSubForms() as $key => $subForm) {
             if (!in_array($key, $validatedSubForms)) {
-                if (null !== $translator) {
+                if (null !== $translator && !$subForm->hasTranslator()) {
                     $subForm->setTranslator($translator);
                 }
 
@@ -2741,6 +2743,16 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
 
         return $this->_translator;
     }
+    
+    /**
+     * Does this form have its own specific translator?
+     * 
+     * @return bool
+     */
+    public function hasTranslator()
+    {
+        return (bool)$this->_translator;
+    }    
 
     /**
      * Get global default translator object

+ 26 - 1
tests/Zend/Form/FormTest.php

@@ -3883,7 +3883,32 @@ class Zend_Form_FormTest extends PHPUnit_Framework_TestCase
         $this->assertEquals(2, count($messages));
         $this->assertEquals('Element message', $messages['foo']['isEmpty']);
         $this->assertEquals('Form message', $messages['bar']['isEmpty']);
-    }    
+    }
+
+    /**
+     * @group ZF-9540
+     */
+    public function testSubFormTranslatorPreferredOverDefaultTranslator()
+    {
+        $defaultTranslations = array('isEmpty' => 'Default message');
+        $subformTranslations = array('isEmpty' => 'SubForm message');
+                
+        $defaultTranslate = new Zend_Translate('array', $defaultTranslations);
+        $subformTranslate = new Zend_Translate('array', $subformTranslations);
+        
+        Zend_Registry::set('Zend_Translate', $defaultTranslate);
+        $this->form->addSubForm(new Zend_Form_SubForm(), 'subform');
+        $this->form->subform->setTranslator($subformTranslate);
+        $this->form->subform->addElement('text', 'foo', array('required'=>true));
+
+        $this->assertFalse($this->form->isValid(array('subform' => array('foo'=>''))));
+        $messages = $this->form->getMessages();
+        $this->assertEquals('SubForm message', $messages['subform']['foo']['isEmpty']);
+        
+        $this->assertFalse($this->form->isValidPartial(array('subform' => array('foo'=>''))));
+        $messages = $this->form->getMessages();
+        $this->assertEquals('SubForm message', $messages['subform']['foo']['isEmpty']);
+    }
 
     /**
      * Used by test methods susceptible to ZF-2794, marks a test as incomplete