Pārlūkot izejas kodu

[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 gadi atpakaļ
vecāks
revīzija
0915ad0947

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

@@ -396,6 +396,27 @@ $input->setOptions($options);
 ]]></programlisting>
 
             <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
                 associative array, mapping field names to field values. Field
                 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;
 
     /**
+     * Translation object
+     * @var Zend_Translate
+     */
+    protected $_translator;
+
+    /**
+     * Is translation disabled?
+     * @var Boolean
+     */
+    protected $_translatorDisabled = false;
+
+    /**
      * @param array $filterRules
      * @param array $validatorRules
      * @param array $data       OPTIONAL
@@ -558,6 +570,74 @@ class Zend_Filter_Input
         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
      */
@@ -662,6 +742,15 @@ class Zend_Filter_Input
     protected function _getMissingMessage($rule, $field)
     {
         $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('%field%', $field, $message);
         return $message;
@@ -673,6 +762,15 @@ class Zend_Filter_Input
     protected function _getNotEmptyMessage($rule, $field)
     {
         $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('%field%', $field, $message);
         return $message;

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

@@ -1188,9 +1188,6 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
             'field2' => 'MyDigits',
             'field3' => 'digits'
         );
-        $options = array(
-            Zend_Filter_Input::INPUT_NAMESPACE => 'TestNamespace'
-        );
 
         $ip = get_include_path();
         $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files';
@@ -1309,9 +1306,6 @@ class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
         $data = array(
             'field1' => ' ab&c '
         );
-        $options = array(
-            Zend_Filter_Input::ESCAPE_FILTER => 'StringTrim'
-        );
         $input = new Zend_Filter_Input(null, null, $data);
         $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' => ''));
         $this->assertFalse($filter->isValid());
         $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 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