如何在Zend Framework 2的表单中添加错误信息?

3

我有一个复杂的 Zend\Form,内部嵌套多个 Fieldset。现在我需要实现跨 Fieldset 的验证。也就是说,验证规则涉及来自不同 Fieldset 的多个 Element。我找到唯一的方法是在 MyForm#isValid() 中实现此验证,因为它是我可以访问每个 Fieldset 的唯一位置。

MyForm extends Form
{
    public function isValid()
    {
        $isFormValid = parent::isValid();
        $isCrossFieldsetVaidationOk = // my additional validation logic
        return $isFormValid && $isCrossFieldsetVaidationOk;
    }
}

尚未测试,但它会起作用。问题在于添加错误消息。

我已经尝试过。

$this->setMessages(array_merge(
    $this->getMessages(), ['my new message'])
);

但它没起作用。

我该如何添加 Form 错误消息?

2个回答

6

需要为表单元素添加一个消息。

$form->get('password')->setMessages(['Wrong password']);

谢谢您的回答!但是无效的不是元素,而是跨多个Element(在不同的Fieldset中)的条件。 例如:有多个不同Fieldset中的foo Element(我们无法知道有多少,它们是动态添加的)。 至少必须设置/填写一个foo。 另一个例子:有多个bar元素。 它们的值之和必须大于“x”。 在这两种情况下,“Element”的值本身不能有效或无效。 这就是为什么我正在寻找一种定义“通过”Fieldset的验证方式,并直接将消息添加到“表单”中的方法。 - automatix
@automatix 或许这个链接能够帮到你。http://circlical.com/blog/2015/7/6/zend-framework-2-forms-factories-inputfilters-and-hydration - newage
这是一个不错的教程,但它没有回答我的问题。 - automatix

3
错误消息与表单不直接关联,而是与表单元素关联。所以像newage所说的那样,您必须为特定元素设置消息(因此他的答案有效,我已经点赞了 :-))。
但是,由于您扩展了表单,因此可以直接在表单中设置自己的错误消息方法:
MyForm extends Form
{

    protected $errorMessages = [];

    public function isValid()
    {
        $isFormValid = parent::isValid();
        $isCrossFieldsetValidationOk = // your additional validation logic

        if (!$isCrossFieldsetValidationOk) {
            $this->addErrorMessage('Oh oh... Cross-fieldset validation error...');
        }
        return $isFormValid && $isCrossFieldsetValidationOk;
    }

    public function addErrorMessage($text)
    {
        $this->errorMessages[] = $text ;
        return $this; // For a fluent setter
    }

    public function getErrorMessages()
    {
        return $this->errorMessages ;
    }

    public function getMessages($elementName = null)
    {
        if ($elementName) {
            $messages = parent::getMessages($elementName);
        } else {
            $messages = array_merge($this->getErrorMessages(), parent::getMessages($elementName));
        }
        return $messages;
    }

}

谢谢您的回答!实际上,这样我可以使我的表单保存“表单错误消息”并检索它们。下一步是将它们与Element的消息集成在一起,以便一起显示。为此,必须重写Element#getMessages(...)。我会用它来扩展您的答案。或者也许有更好的解决方案? - automatix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接