From 455ab01b3e741c7918144de7ba227594725cf791 Mon Sep 17 00:00:00 2001 From: Matthew Weier O'Phinney Date: Wed, 16 May 2018 12:18:21 -0500 Subject: [PATCH] Implements `setTranslateMessages()` for en/dis-abling translations This patch modifies `FormElementErrors` to add a new method, `setTranslateMessages(bool $flag)`. By default, and per #104, translations are enabled. However, by calling the method with `false`, you can disable translations. --- src/View/Helper/FormElementErrors.php | 88 +++++++++++++++++----- test/View/Helper/FormElementErrorsTest.php | 8 +- 2 files changed, 75 insertions(+), 21 deletions(-) diff --git a/src/View/Helper/FormElementErrors.php b/src/View/Helper/FormElementErrors.php index bc0b7f0d..243dd0e2 100644 --- a/src/View/Helper/FormElementErrors.php +++ b/src/View/Helper/FormElementErrors.php @@ -28,6 +28,11 @@ class FormElementErrors extends AbstractHelper */ protected $attributes = []; + /** + * @var bool Whether or not to translate error messages during render. + */ + protected $translateErrorMessages = true; + /** * Invoke helper as functor * @@ -49,6 +54,10 @@ public function __invoke(ElementInterface $element = null, array $attributes = [ /** * Render validation errors for the provided $element * + * If {@link $translateErrorMessages} is true, and a translator is + * composed, messages retrieved from the element will be translated; if + * either is not the case, they will not. + * * @param ElementInterface $element * @param array $attributes * @throws Exception\DomainException @@ -60,7 +69,9 @@ public function render(ElementInterface $element, array $attributes = []) if (empty($messages)) { return ''; } - if (! is_array($messages) && ! $messages instanceof Traversable) { + + $messages = $messages instanceof Traversable ? iterator_to_array($messages) : $messages; + if (! is_array($messages)) { throw new Exception\DomainException(sprintf( '%s expects that $element->getMessages() will return an array or Traversable; received "%s"', __METHOD__, @@ -68,6 +79,12 @@ public function render(ElementInterface $element, array $attributes = []) )); } + // Flatten message array + $messages = $this->flattenMessages($messages); + if (empty($messages)) { + return ''; + } + // Prepare attributes for opening tag $attributes = array_merge($this->attributes, $attributes); $attributes = $this->createAttributesString($attributes); @@ -75,24 +92,9 @@ public function render(ElementInterface $element, array $attributes = []) $attributes = ' ' . $attributes; } - // Flatten message array - $escapeHtml = $this->getEscapeHtmlHelper(); - $messagesToPrint = []; - $translator = $this->getTranslator(); - $textDomain = $this->getTranslatorTextDomain(); - $messageCallback = function ($item) use (&$messagesToPrint, $escapeHtml, $translator, $textDomain) { - $item = $translator ? $translator->translate($item, $textDomain) : $item; - $messagesToPrint[] = $escapeHtml($item); - }; - array_walk_recursive($messages, $messageCallback); - - if (empty($messagesToPrint)) { - return ''; - } - // Generate markup $markup = sprintf($this->getMessageOpenFormat(), $attributes); - $markup .= implode($this->getMessageSeparatorString(), $messagesToPrint); + $markup .= implode($this->getMessageSeparatorString(), $messages); $markup .= $this->getMessageCloseString(); return $markup; @@ -185,4 +187,56 @@ public function getMessageSeparatorString() { return $this->messageSeparatorString; } + + /** + * Set the flag detailing whether or not to translate error messages. + * + * @param bool $flag + * @return self + */ + public function setTranslateMessages($flag) + { + $this->translateErrorMessages = (bool) $flag; + return $this; + } + + /** + * @param array $messages + * @return array + */ + private function flattenMessages(array $messages) + { + return $this->translateErrorMessages && $this->getTranslator() + ? $this->flattenMessagesWithTranslator($messages) + : $this->flattenMessagesWithoutTranslator($messages); + } + + /** + * @param array $messages + * @return array + */ + private function flattenMessagesWithoutTranslator(array $messages) + { + $messagesToPrint = []; + array_walk_recursive($messages, function ($item) use (&$messagesToPrint) { + $messagesToPrint[] = $item; + }); + return $messagesToPrint; + } + + /** + * @param array $messages + * @return array + */ + private function flattenMessagesWithTranslator(array $messages) + { + $translator = $this->getTranslator(); + $textDomain = $this->getTranslatorTextDomain(); + $messagesToPrint = []; + $messageCallback = function ($item) use (&$messagesToPrint, $translator, $textDomain) { + $messagesToPrint[] = $translator->translate($item, $textDomain); + }; + array_walk_recursive($messages, $messageCallback); + return $messagesToPrint; + } } diff --git a/test/View/Helper/FormElementErrorsTest.php b/test/View/Helper/FormElementErrorsTest.php index 4679c6c1..9c84740d 100644 --- a/test/View/Helper/FormElementErrorsTest.php +++ b/test/View/Helper/FormElementErrorsTest.php @@ -128,12 +128,12 @@ function ($message) { $this->helper->setTranslatorTextDomain('default'); + // Disable translation... + $this->helper->setTranslateMessages(false); + $markup = $this->helper->render($form->get('test_element')); - $this->assertRegexp( - '##s', - $markup - ); + $this->assertRegexp('#^