ZF2 - 在表单上只显示一个错误

时间:2013-06-06 09:29:37

标签: forms validation input zend-framework2

我似乎无法让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

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

1 个答案:

答案 0 :(得分: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));

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