Index: tests/Zend/Form/FormTest.php
===================================================================
--- tests/Zend/Form/FormTest.php (revision 21644)
+++ tests/Zend/Form/FormTest.php (working copy)
@@ -3847,6 +3847,42 @@
$this->assertEquals(2, count($messages));
$this->assertEquals('Element message', $messages['foo']['isEmpty']);
$this->assertEquals('Form message', $messages['bar']['isEmpty']);
+ }
+
+ /**
+ * @group ZF-9364
+ */
+ public function testElementTranslatorPreferredOverDefaultTranslator()
+ {
+ $defaultTranslations = array(
+ 'isEmpty' => 'Default message',
+ );
+ $formTranslations = array(
+ 'isEmpty' => 'Form message',
+ );
+ $elementTranslations = array(
+ 'isEmpty' => 'Element message',
+ );
+ $defaultTranslate = new Zend_Translate('array', $defaultTranslations);
+ $formTranslate = new Zend_Translate('array', $formTranslations);
+ $elementTranslate = new Zend_Translate('array', $elementTranslations);
+
+ Zend_Registry::set('Zend_Translate', $defaultTranslate);
+ $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']);
}
/**
Index: library/Zend/Form.php
===================================================================
--- library/Zend/Form.php (revision 21644)
+++ library/Zend/Form.php (working copy)
@@ -2031,7 +2031,7 @@
}
foreach ($this->getElements() as $key => $element) {
- if (null !== $translator && !$element->getTranslator()) {
+ if (null !== $translator && !$element->hasTranslator()) {
$element->setTranslator($translator);
}
if (!isset($data[$key])) {
@@ -2079,7 +2079,7 @@
foreach ($data as $key => $value) {
if (null !== ($element = $this->getElement($key))) {
- if (null !== $translator && !$element->getTranslator()) {
+ if (null !== $translator && !$element->hasTranslator()) {
$element->setTranslator($translator);
}
$valid = $element->isValid($value, $data) && $valid;
Index: library/Zend/Form/Element.php
===================================================================
--- library/Zend/Form/Element.php (revision 21644)
+++ library/Zend/Form/Element.php (working copy)
@@ -413,6 +413,16 @@
}
return $this->_translator;
}
+
+ /**
+ * Does this element have its own specific translator?
+ *
+ * @return bool
+ */
+ public function hasTranslator()
+ {
+ return (bool)$this->_translator;
+ }
/**
* Indicate whether or not translation should be disabled
That would be better fixed in the isValid() method of Zend_Form_Element which is overriding the translator for validators. Hence, it would allow us to use the resources/translators arrays and our custom translator for the elements.
#line 1330 in Zend_Form_Element:
[code]
foreach ($this->getValidators() as $key => $validator) {
if (method_exists($validator, 'setTranslator')) { $validator->setTranslator($this->getTranslator()); }
[/code]