2013-06-06 4 views
1

Я не могу заставить ZF2 показывать только одно сообщение об ошибке для сообщений об ошибках, связанных с ошибкой.ZF2 - Показать только одну ошибку в формах

Например, EmailAddress валидатор может передать обратно до 7 сообщений и обычно показывает следующее, если пользователь сделал опечатку:

oli.meffff' is not a valid hostname for the email address 
The input appears to be a DNS hostname but cannot match TLD against known list 
The input appears to be a local network name but local network names are not allowed 

Как я могу переопределить ошибку, чтобы показать что-то немного более дружелюбным , например, «Пожалуйста, введите действительный адрес электронной почты», а не такие, как указано выше?

+0

после проверки '$ form-> get ('email') -> setMessage ('Wrong E-Mail dude!');' Кроме этого вам нужно будет установить сообщения, которые вы не хотите видеть to '''' – Sam

+0

Спасибо Сэм. Будет ли помощник вида не создавать разметку для пустых сообщений? Я стилю элементы 'li' по умолчанию здесь. Думаю, я мог бы написать специальный хелпер вида formElementErrors. – MrNorm

+0

Erm да, если вы поедете со вторым вариантом, будет создана разметка. Но если вы выполняете 'setMessage()' с вашего контроллера, будет отображаться только ваше пользовательское сообщение (iirc) – Sam

ответ

2

ОК, удалось найти решение для этого. Вместо того, чтобы использовать ту же строку, что и ошибка для всех отказов валидатора, как предложил Сэм выше, я переопределил сообщения об ошибках в InputFilter для этих элементов, а затем использовал специальный помощник просмотра формы для отображения только первого сообщения.

Вот помощник:

<?php 
namespace Application\Form\View\Helper; 

use Traversable; 
use \Zend\Form\ElementInterface; 
use \Zend\Form\Exception; 

class FormElementSingleErrors extends \Zend\Form\View\Helper\FormElementErrors 
{ 
    /** 
    * Render validation errors for the provided $element 
    * 
    * @param ElementInterface $element 
    * @param array $attributes 
    * @throws Exception\DomainException 
    * @return string 
    */ 
    public function render(ElementInterface $element, array $attributes = array()) 
    { 
     $messages = $element->getMessages(); 
     if (empty($messages)) { 
      return ''; 
     } 
     if (!is_array($messages) && !$messages instanceof Traversable) { 
      throw new Exception\DomainException(sprintf(
       '%s expects that $element->getMessages() will return an array or Traversable; received "%s"', 
       __METHOD__, 
       (is_object($messages) ? get_class($messages) : gettype($messages)) 
      )); 
     } 

     // We only want a single message 
     $messages = array(current($messages)); 

     // Prepare attributes for opening tag 
     $attributes = array_merge($this->attributes, $attributes); 
     $attributes = $this->createAttributesString($attributes); 
     if (!empty($attributes)) { 
      $attributes = ' ' . $attributes; 
     } 

     // Flatten message array 
     $escapeHtml  = $this->getEscapeHtmlHelper(); 
     $messagesToPrint = array(); 
     array_walk_recursive($messages, function ($item) use (&$messagesToPrint, $escapeHtml) { 
      $messagesToPrint[] = $escapeHtml($item); 
     }); 

     if (empty($messagesToPrint)) { 
      return ''; 
     } 

     // Generate markup 
     $markup = sprintf($this->getMessageOpenFormat(), $attributes); 
     $markup .= implode($this->getMessageSeparatorString(), $messagesToPrint); 
     $markup .= $this->getMessageCloseString(); 

     return $markup; 
    } 

} 

Это просто расширение FormElementErrors с функцией визуализации переопределен, чтобы включить это:

// We only want a single message 
$messages = array(current($messages)); 

Я затем вставить помощника в моем приложении с использованием раствора I отправлено в мой выпуск here.

Смежные вопросы