Просмотр исходного кода

ZF-4915: flatten error messages for aggregate terms

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@18554 44c647ce-9c0f-0410-b52a-842ac1e357ba
matthew 16 лет назад
Родитель
Сommit
1c6470515d

+ 33 - 2
library/Zend/Form/Element.php

@@ -98,6 +98,13 @@ class Zend_Form_Element implements Zend_Validate_Interface
     protected $_errors = array();
 
     /**
+     * Separator to use when concatenating aggregate error messages (for 
+     * elements having array values)
+     * @var string
+     */
+    protected $_errorMessageSeparator = '; ';
+
+    /**
      * Element filters
      * @var array
      */
@@ -1413,6 +1420,28 @@ class Zend_Form_Element implements Zend_Validate_Interface
     }
 
     /**
+     * Get errorMessageSeparator
+     *
+     * @return string
+     */
+    public function getErrorMessageSeparator()
+    {
+        return $this->_errorMessageSeparator;
+    }
+
+    /**
+     * Set errorMessageSeparator
+     *
+     * @param  string $separator
+     * @return Zend_Form_Element
+     */
+    public function setErrorMessageSeparator($separator)
+    {
+        $this->_errorMessageSeparator = $separator;
+        return $this;
+    }
+
+    /**
      * Mark the element as being in a failed validation state
      *
      * @return Zend_Form_Element
@@ -2126,12 +2155,14 @@ class Zend_Form_Element implements Zend_Validate_Interface
             if (null !== $translator) {
                 $message = $translator->translate($message);
             }
-            if ($this->isArray() || is_array($value)) {
+            if (($this->isArray() || is_array($value))
+                && !empty($value)
+            ) {
                 $aggregateMessages = array();
                 foreach ($value as $val) {
                     $aggregateMessages[] = str_replace('%value%', $val, $message);
                 }
-                $messages[$key] = $aggregateMessages;
+                $messages[$key] = implode($this->getErrorMessageSeparator(), $aggregateMessages);
             } else {
                 $messages[$key] = str_replace('%value%', $value, $message);
             }

+ 17 - 0
tests/Zend/Form/Element/MultiCheckboxTest.php

@@ -263,6 +263,23 @@ class Zend_Form_Element_MultiCheckboxTest extends PHPUnit_Framework_TestCase
         $this->assertFalse($this->element->isValid('test'));
     }
     /**#@-*/
+
+    /**
+     * No assertion; just making sure no error occurs
+     *
+     * @group ZF-4915
+     */
+    public function testRetrievingErrorMessagesShouldNotResultInError()
+    {
+        $this->element->addMultiOptions(array(
+                          'foo' => 'Foo',
+                          'bar' => 'Bar',
+                          'baz' => 'Baz',
+                      ))
+                      ->addErrorMessage('%value% is invalid');
+        $this->element->isValid(array('foo', 'bogus'));
+        $html = $this->element->render($this->getView());
+    }
 }
 
 // Call Zend_Form_Element_MultiCheckboxTest::main() if this source file is executed directly.

+ 17 - 0
tests/Zend/Form/ElementTest.php

@@ -1987,6 +1987,23 @@ class Zend_Form_ElementTest extends PHPUnit_Framework_TestCase
     }
 
     /**
+     * @group ZF-4915
+     */
+    public function testElementShouldAllowSettingDefaultErrorMessageSeparator()
+    {
+        $this->element->setErrorMessageSeparator('|');
+        $this->assertEquals('|', $this->element->getErrorMessageSeparator());
+    }
+
+    /**
+     * @group ZF-4915
+     */
+    public function testElementShouldUseSemicolonAndSpaceAsDefaultErrorMessageSeparator()
+    {
+        $this->assertEquals('; ', $this->element->getErrorMessageSeparator());
+    }
+
+    /**
      * Used by test methods susceptible to ZF-2794, marks a test as incomplete
      *
      * @link   http://framework.zend.com/issues/browse/ZF-2794