Parcourir la source

Fix ZF-9364: Zend_Form isValid|isValidPartial overwrites Translator of SubForms and Elements

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@21617 44c647ce-9c0f-0410-b52a-842ac1e357ba
rob il y a 16 ans
Parent
commit
0c2e67c321
2 fichiers modifiés avec 53 ajouts et 2 suppressions
  1. 2 2
      library/Zend/Form.php
  2. 51 0
      tests/Zend/Form/FormTest.php

+ 2 - 2
library/Zend/Form.php

@@ -2031,7 +2031,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
         }
 
         foreach ($this->getElements() as $key => $element) {
-            if (null !== $translator) {
+            if (null !== $translator && !$element->getTranslator()) {
                 $element->setTranslator($translator);
             }
             if (!isset($data[$key])) {
@@ -2079,7 +2079,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
 
         foreach ($data as $key => $value) {
             if (null !== ($element = $this->getElement($key))) {
-                if (null !== $translator) {
+                if (null !== $translator && !$element->getTranslator()) {
                     $element->setTranslator($translator);
                 }
                 $valid = $element->isValid($value, $data) && $valid;

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

@@ -3797,6 +3797,57 @@ class Zend_Form_FormTest extends PHPUnit_Framework_TestCase
 
         $this->assertEquals(array('sub' => array('valid' => 1234)), $this->form->getValidValues($data));
     }
+        
+    /**
+     * @group ZF-9494
+     */
+    public function testElementTranslatorNotOveriddenbyFormTranslator()
+    {
+        $translations = array(
+            'isEmpty' => 'Element message',
+        );
+        $translate = new Zend_Translate('array', $translations);
+        $this->form->addElement('text', 'foo', array('required'=>true, 'translator'=>$translate));
+        $this->assertFalse($this->form->isValid(array('foo'=>'')));
+        $messages = $this->form->getMessages();
+        $this->assertEquals(1, count($messages));
+        $this->assertEquals('Element message', $messages['foo']['isEmpty']);
+        
+        $this->assertFalse($this->form->isValidPartial(array('foo'=>'')));
+        $messages = $this->form->getMessages();
+        $this->assertEquals(1, count($messages));
+        $this->assertEquals('Element message', $messages['foo']['isEmpty']);
+    }  
+    
+    /**
+     * @group ZF-9364
+     */
+    public function testElementTranslatorPreferredOverFormTranslator()
+    {
+        $formTanslations = array(
+            'isEmpty' => 'Form message',
+        );
+        $elementTanslations = array(
+            'isEmpty' => 'Element message',
+        );
+        $formTranslate = new Zend_Translate('array', $formTanslations);
+        $elementTranslate = new Zend_Translate('array', $elementTanslations);
+        $this->form->setTranslator($formTranslate);
+        $this->form->addElement('text', 'foo', array('required'=>true, 'translator'=>$elementTranslate));
+        $this->form->addElement('text', 'bar', array('required'=>true));
+
+        $this->assertFalse($this->form->isValid(array('foo'=>'', 'bar'=>'')));
+        $messages = $this->form->getMessages();
+        $this->assertEquals(2, count($messages));
+        $this->assertEquals('Element message', $messages['foo']['isEmpty']);
+        $this->assertEquals('Form message', $messages['bar']['isEmpty']);
+        
+        $this->assertFalse($this->form->isValidPartial(array('foo'=>'', 'bar'=>'')));
+        $messages = $this->form->getMessages();
+        $this->assertEquals(2, count($messages));
+        $this->assertEquals('Element message', $messages['foo']['isEmpty']);
+        $this->assertEquals('Form message', $messages['bar']['isEmpty']);
+    }    
 
     /**
      * Used by test methods susceptible to ZF-2794, marks a test as incomplete