Ver código fonte

[ZF-3736] Zend_Filter_Input:

- added translation for the validator messages from Filter_Input


git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@18618 44c647ce-9c0f-0410-b52a-842ac1e357ba
thomas 16 anos atrás
pai
commit
0915ad0947

+ 21 - 0
documentation/manual/en/module_specs/Zend_Filter_Input.xml

@@ -396,6 +396,27 @@ $input->setOptions($options);
 ]]></programlisting>
 ]]></programlisting>
 
 
             <para>
             <para>
+                And you can also add a translator which gives you the ability to provide multiple
+                languages for the messages which are returned by
+                <classname>Zend_Filter_Input</classname>.
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$translate = new Zend_Translate_Adapter_Array(array(
+    Zend_Filter_Input::MISSING_MESSAGE => "Where is the field?"
+);
+
+$input = new Zend_Filter_Input($filters, $validators, $data);
+$input->setTranslator($translate);
+]]></programlisting>
+
+            <para>
+                When you are using an application wide translator, then it will also be used by
+                <classname>Zend_Filter_Input</classname>. In this case you will not have to set the
+                translator manually.
+            </para>
+
+            <para>
                 The results of the <methodname>getUnknown()</methodname> method is an
                 The results of the <methodname>getUnknown()</methodname> method is an
                 associative array, mapping field names to field values. Field
                 associative array, mapping field names to field values. Field
                 names are used as the array keys in this case, instead of rule
                 names are used as the array keys in this case, instead of rule

+ 98 - 0
library/Zend/Filter/Input.php

@@ -145,6 +145,18 @@ class Zend_Filter_Input
     protected $_processed = false;
     protected $_processed = false;
 
 
     /**
     /**
+     * Translation object
+     * @var Zend_Translate
+     */
+    protected $_translator;
+
+    /**
+     * Is translation disabled?
+     * @var Boolean
+     */
+    protected $_translatorDisabled = false;
+
+    /**
      * @param array $filterRules
      * @param array $filterRules
      * @param array $validatorRules
      * @param array $validatorRules
      * @param array $data       OPTIONAL
      * @param array $data       OPTIONAL
@@ -558,6 +570,74 @@ class Zend_Filter_Input
         return $this;
         return $this;
     }
     }
 
 
+    /**
+     * Set translation object
+     *
+     * @param  Zend_Translate|Zend_Translate_Adapter|null $translator
+     * @return Zend_Filter_Input
+     */
+    public function setTranslator($translator = null)
+    {
+        if ((null === $translator) || ($translator instanceof Zend_Translate_Adapter)) {
+            $this->_translator = $translator;
+        } elseif ($translator instanceof Zend_Translate) {
+            $this->_translator = $translator->getAdapter();
+        } else {
+            require_once 'Zend/Validate/Exception.php';
+            throw new Zend_Validate_Exception('Invalid translator specified');
+        }
+
+        return $this;
+    }
+
+    /**
+     * Return translation object
+     *
+     * @return Zend_Translate_Adapter|null
+     */
+    public function getTranslator()
+    {
+        if ($this->translatorIsDisabled()) {
+            return null;
+        }
+
+        if ($this->_translator === null) {
+            require_once 'Zend/Registry.php';
+            if (Zend_Registry::isRegistered('Zend_Translate')) {
+                $translator = Zend_Registry::get('Zend_Translate');
+                if ($translator instanceof Zend_Translate_Adapter) {
+                    return $translator;
+                } elseif ($translator instanceof Zend_Translate) {
+                    return $translator->getAdapter();
+                }
+            }
+        }
+
+        return $this->_translator;
+    }
+
+    /**
+     * Indicate whether or not translation should be disabled
+     *
+     * @param  bool $flag
+     * @return Zend_Filter_Input
+     */
+    public function setDisableTranslator($flag)
+    {
+        $this->_translatorDisabled = (bool) $flag;
+        return $this;
+    }
+
+    /**
+     * Is translation disabled?
+     *
+     * @return bool
+     */
+    public function translatorIsDisabled()
+    {
+        return $this->_translatorDisabled;
+    }
+
     /*
     /*
      * Protected methods
      * Protected methods
      */
      */
@@ -662,6 +742,15 @@ class Zend_Filter_Input
     protected function _getMissingMessage($rule, $field)
     protected function _getMissingMessage($rule, $field)
     {
     {
         $message = $this->_defaults[self::MISSING_MESSAGE];
         $message = $this->_defaults[self::MISSING_MESSAGE];
+
+        if (null !== ($translator = $this->getTranslator())) {
+            if ($translator->isTranslated($message)) {
+                $message = $translator->translate($message);
+            } elseif ($translator->isTranslated(self::MISSING_MESSAGE)) {
+                $message = $translator->translate(self::MISSING_MESSAGE);
+            }
+        }
+
         $message = str_replace('%rule%', $rule, $message);
         $message = str_replace('%rule%', $rule, $message);
         $message = str_replace('%field%', $field, $message);
         $message = str_replace('%field%', $field, $message);
         return $message;
         return $message;
@@ -673,6 +762,15 @@ class Zend_Filter_Input
     protected function _getNotEmptyMessage($rule, $field)
     protected function _getNotEmptyMessage($rule, $field)
     {
     {
         $message = $this->_defaults[self::NOT_EMPTY_MESSAGE];
         $message = $this->_defaults[self::NOT_EMPTY_MESSAGE];
+
+        if (null !== ($translator = $this->getTranslator())) {
+            if ($translator->isTranslated($message)) {
+                $message = $translator->translate($message);
+            } elseif ($translator->isTranslated(self::NOT_EMPTY_MESSAGE)) {
+                $message = $translator->translate(self::NOT_EMPTY_MESSAGE);
+            }
+        }
+
         $message = str_replace('%rule%', $rule, $message);
         $message = str_replace('%rule%', $rule, $message);
         $message = str_replace('%field%', $field, $message);
         $message = str_replace('%field%', $field, $message);
         return $message;
         return $message;

+ 54 - 10
tests/Zend/Filter/InputTest.php

@@ -1188,9 +1188,6 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
             'field2' => 'MyDigits',
             'field2' => 'MyDigits',
             'field3' => 'digits'
             'field3' => 'digits'
         );
         );
-        $options = array(
-            Zend_Filter_Input::INPUT_NAMESPACE => 'TestNamespace'
-        );
 
 
         $ip = get_include_path();
         $ip = get_include_path();
         $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files';
         $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files';
@@ -1309,9 +1306,6 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
         $data = array(
         $data = array(
             'field1' => ' ab&c '
             'field1' => ' ab&c '
         );
         );
-        $options = array(
-            Zend_Filter_Input::ESCAPE_FILTER => 'StringTrim'
-        );
         $input = new Zend_Filter_Input(null, null, $data);
         $input = new Zend_Filter_Input(null, null, $data);
         $input->setDefaultEscapeFilter('StringTrim');
         $input->setDefaultEscapeFilter('StringTrim');
 
 
@@ -1863,10 +1857,6 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
             )
             )
         );
         );
 
 
-        $data = array(
-            'street' => ''
-        );
-
         $filter = new Zend_Filter_Input($filters, $validators, array('street' => ''));
         $filter = new Zend_Filter_Input($filters, $validators, array('street' => ''));
         $this->assertFalse($filter->isValid());
         $this->assertFalse($filter->isValid());
         $message = $filter->getMessages();
         $message = $filter->getMessages();
@@ -1913,6 +1903,60 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
         $this->assertContains('Please enter a subject', $message['subject']['isEmpty']);
         $this->assertContains('Please enter a subject', $message['subject']['isEmpty']);
         $this->assertContains('Please enter message contents', $message['content']['isEmpty']);
         $this->assertContains('Please enter message contents', $message['content']['isEmpty']);
     }
     }
+
+    /**
+     * @group ZF-3736
+     */
+    public function testTranslateNotEmptyMessages()
+    {
+        require_once 'Zend/Translate/Adapter/Array.php';
+        $translator = new Zend_Translate_Adapter_Array(array('missingMessage' => 'Still missing'));
+
+        $validators = array(
+            'rule1'   => array('presence' => 'required',
+                               'fields'   => array('field1', 'field2'),
+                               'default'  => array('field1default'))
+        );
+        $data = array();
+        $input = new Zend_Filter_Input(null, $validators, $data);
+        $input->setTranslator($translator);
+
+        $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
+
+        $missing = $input->getMissing();
+        $this->assertType('array', $missing);
+        $this->assertEquals(array('rule1'), array_keys($missing));
+        $this->assertEquals(array("Still missing"), $missing['rule1']);
+    }
+
+    /**
+     * @group ZF-3736
+     */
+    public function testTranslateNotEmptyMessagesByUsingRegistry()
+    {
+        require_once 'Zend/Translate/Adapter/Array.php';
+        $translator = new Zend_Translate_Adapter_Array(array('missingMessage' => 'Still missing'));
+        require_once 'Zend/Registry.php';
+        Zend_Registry::set('Zend_Translate', $translator);
+
+        $validators = array(
+            'rule1'   => array('presence' => 'required',
+                               'fields'   => array('field1', 'field2'),
+                               'default'  => array('field1default'))
+        );
+        $data = array();
+        $input = new Zend_Filter_Input(null, $validators, $data);
+
+        $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
+        $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
+        $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
+        $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
+
+        $missing = $input->getMissing();
+        $this->assertType('array', $missing);
+        $this->assertEquals(array('rule1'), array_keys($missing));
+        $this->assertEquals(array("Still missing"), $missing['rule1']);
+    }
 }
 }
 
 
 class MyZend_Filter_Date implements Zend_Filter_Interface
 class MyZend_Filter_Date implements Zend_Filter_Interface