1

对于失败的表单验证消息,我似乎无法让 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

如何覆盖错误以显示更友好的内容,例如“请输入有效的电子邮件地址”而不是上面的细节?

4

1 回答 1

2

好的,设法为此提出了解决方案。我没有像上面 Sam 建议的那样对所有验证器失败使用与错误相同的字符串,而是覆盖了 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 的扩展,重写了 render 函数以包含以下内容:

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

然后,我使用我在此处发布到我的问题的解决方案将帮助程序插入到我的应用程序中。

于 2013-06-06T10:36:06.903 回答