Przeglądaj źródła

ZF-5568: allow tranlation of opt-group labels

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@15670 44c647ce-9c0f-0410-b52a-842ac1e357ba
matthew 16 lat temu
rodzic
commit
6805afad61

+ 5 - 0
library/Zend/Form/Decorator/ViewHelper.php

@@ -238,6 +238,11 @@ class Zend_Form_Decorator_ViewHelper extends Zend_Form_Decorator_Abstract
         $id            = $element->getId();
         $attribs['id'] = $id;
 
+        $helperObject  = $view->getHelper($helper);
+        if (method_exists($helperObject, 'setTranslator')) {
+            $helperObject->setTranslator($element->getTranslator());
+        }
+
         $elementContent = $view->$helper($name, $value, $attribs, $element->options);
         switch ($this->getPlacement()) {
             case self::APPEND:

+ 36 - 0
library/Zend/View/Helper/FormElement.php

@@ -36,6 +36,42 @@ require_once 'Zend/View/Helper/HtmlElement.php';
 abstract class Zend_View_Helper_FormElement extends Zend_View_Helper_HtmlElement
 {
     /**
+     * @var Zend_Translate
+     */
+    protected $_translator;
+
+    /**
+     * Get translator
+     *
+     * @return Zend_Translate
+     */
+    public function getTranslator()
+    {
+         return $this->_translator;
+    }
+
+    /**
+     * Set translator
+     *
+     * @param  $translator|null Zend_Translate
+     * @return Zend_View_Helper_FormElement
+     */
+    public function setTranslator($translator = null)
+    {
+        if (null === $translator) {
+            $this->_translator = null;
+        } elseif ($translator instanceof Zend_Translate_Adapter) {
+            $this->_translator = $translator;
+        } elseif ($translator instanceof Zend_Translate) {
+            $this->_translator = $translator->getAdapter();
+        } else {
+            require_once 'Zend/Form/Exception.php';
+            throw new Zend_Form_Exception('Invalid translator specified');
+        }
+         return $this;
+    }
+
+    /**
      * Converts parameter arguments to an element info array.
      *
      * E.g, formExample($name, $value, $attribs, $options, $listsep) is

+ 5 - 1
library/Zend/View/Helper/FormSelect.php

@@ -111,13 +111,17 @@ class Zend_View_Helper_FormSelect extends Zend_View_Helper_FormElement
                 . ">\n    ";
 
         // build the list of options
-        $list = array();
+        $list       = array();
+        $translator = $this->getTranslator();
         foreach ((array) $options as $opt_value => $opt_label) {
             if (is_array($opt_label)) {
                 $opt_disable = '';
                 if (is_array($disable) && in_array($opt_value, $disable)) {
                     $opt_disable = ' disabled="disabled"';
                 }
+                if (null !== $translator) {
+                    $opt_value = $translator->translate($opt_value);
+                }
                 $list[] = '<optgroup'
                         . $opt_disable
                         . ' label="' . $this->view->escape($opt_value) .'">';

+ 30 - 0
tests/Zend/Form/Element/MultiselectTest.php

@@ -260,6 +260,36 @@ class Zend_Form_Element_MultiselectTest extends PHPUnit_Framework_TestCase
     }
 
     /**
+     * @group ZF-5568
+     */
+    public function testOptGroupTranslationsShouldWorkAfterPopulatingElement()
+    {
+        $translations = array(
+            'ThisIsTheLabel'      => 'Optgroup label',
+            'ThisShouldNotShow'   => 'Foo Value',
+            'ThisShouldNeverShow' => 'Bar Value'
+        );
+        require_once 'Zend/Translate.php';
+        $translate = new Zend_Translate('array', $translations, 'en');
+        $translate->setLocale('en');
+
+        $options = array(
+            'ThisIsTheLabel' => array(
+                'foovalue' => 'ThisShouldNotShow',
+                'barvalue' => 'ThisShouldNeverShow',
+            ),
+        );
+
+        $this->element->setTranslator($translate)
+                      ->addMultiOptions($options);
+
+        $this->element->setValue('barValue');
+
+        $html = $this->element->render($this->getView());
+        $this->assertContains($translations['ThisIsTheLabel'], $html, $html);
+    }
+
+    /**
      * Used by test methods susceptible to ZF-2794, marks a test as incomplete
      *
      * @link   http://framework.zend.com/issues/browse/ZF-2794