Ver Fonte

Fix ZF-9275: Zend_Form_Element overrides Zend_Validate DefaultTranslator

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@21725 44c647ce-9c0f-0410-b52a-842ac1e357ba
rob há 16 anos atrás
pai
commit
30c2e1b450
3 ficheiros alterados com 52 adições e 1 exclusões
  1. 10 0
      library/Zend/Form.php
  2. 22 1
      library/Zend/Form/Element.php
  3. 20 0
      library/Zend/Validate/Abstract.php

+ 10 - 0
library/Zend/Form.php

@@ -2789,6 +2789,16 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
     }
 
     /**
+     * Is there a default translation object set?
+     * 
+     * @return boolean
+     */
+    public static function hasDefaultTranslator()
+    { 
+        return (bool)self::$_translatorDefault;
+    }
+    
+    /**
      * Indicate whether or not translation should be disabled
      *
      * @param  bool $flag

+ 22 - 1
library/Zend/Form/Element.php

@@ -1332,6 +1332,21 @@ class Zend_Form_Element implements Zend_Validate_Interface
             array_unshift($validators, $notEmpty);
             $this->setValidators($validators);
         }
+        
+        // Find the correct translator. Zend_Validate_Abstract::getDefaultTranslator()
+        // will get either the static translator attached to Zend_Validate_Abstract
+        // or the 'Zend_Translate' from Zend_Registry. 
+        if (Zend_Validate_Abstract::hasDefaultTranslator() && 
+            !Zend_Form::hasDefaultTranslator()) 
+        {
+            $translator = Zend_Validate_Abstract::getDefaultTranslator();
+            if ($this->hasTranslator()) {
+                // only pick up this element's translator if it was attached directly.
+                $translator = $this->getTranslator();
+            }
+        } else {
+            $translator = $this->getTranslator();
+        }
 
         $this->_messages = array();
         $this->_errors   = array();
@@ -1339,7 +1354,13 @@ class Zend_Form_Element implements Zend_Validate_Interface
         $isArray         = $this->isArray();
         foreach ($this->getValidators() as $key => $validator) {
             if (method_exists($validator, 'setTranslator')) {
-                $validator->setTranslator($this->getTranslator());
+                if (method_exists($validator, 'hasTranslator')) {
+                    if (!$validator->hasTranslator()) {                    
+                        $validator->setTranslator($translator);
+                    }
+                } else {
+                    $validator->setTranslator($translator);
+                }
             }
 
             if (method_exists($validator, 'setDisableTranslator')) {

+ 20 - 0
library/Zend/Validate/Abstract.php

@@ -353,6 +353,16 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface
     }
 
     /**
+     * Does this validator have its own specific translator?
+     * 
+     * @return bool
+     */
+    public function hasTranslator()
+    {
+        return (bool)$this->_translator;
+    }  
+    
+    /**
      * Set default translation object for all validate objects
      *
      * @param  Zend_Translate|Zend_Translate_Adapter|null $translator
@@ -393,6 +403,16 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface
     }
 
     /**
+     * Is there a default translation object set?
+     * 
+     * @return boolean
+     */
+    public static function hasDefaultTranslator()
+    { 
+        return (bool)self::$_defaultTranslator;
+    }
+    
+    /**
      * Indicate whether or not translation should be disabled
      *
      * @param  bool $flag