【问题标题】:How to add an error message to the form in Zend Framework 2?如何在 Zend Framework 2 中向表单添加错误消息?
【发布时间】:2016-12-31 11:45:21
【问题描述】:

我有一个复杂的Zend\Form,其中包含多个嵌套的Fieldsets。现在我需要实现一个交叉Fieldset-validation。这意味着,验证规则引用来自不同Fieldsets 的多个Elements。我发现这样做的唯一方法是在 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 错误消息?

【问题讨论】:

    标签: php validation zend-framework2 zend-form validationerror


    【解决方案1】:

    需要为表单元素加入消息。

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

    【讨论】:

    • 感谢您的回答!但这不是无效的元素,而是多个Elements(在不同的Fieldsets 中)的条件。例如:有多个fooElements(我们不知道有多少,它们是动态添加的)不同的Fieldsets。必须设置/填充至少一个foo。另一个例子:有多个bar 元素。它们的值之和必须大于x。在这两种情况下,Element 的值本身都不能有​​效或无效。这就是为什么我正在寻找一种方法来定义“跨越Fieldsets”的验证并将消息直接添加到Form
    • @automatix 也许这个链接会对你有所帮助。 circlical.com/blog/2015/7/6/…
    • 这是一个很好的教程,但它没有回答我的问题。
    【解决方案2】:

    错误消息链接到表单的元素,而不是直接链接到表单。因此,正如 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;
        }
    
    }
    

    【讨论】:

    • 感谢您的回答!实际上,这样我可以让我的表单保存“表单错误消息”并检索它们。下一步是将它们与Elements 的消息集成,以便它们一起显示。为此,Element#getMessages(...) 必须被覆盖。我会用它来扩展你的答案。或者也许有更好的解决方案?
    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多