Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Zend Framework 2中向表单添加错误消息?_Php_Validation_Zend Framework2_Zend Form_Validationerror - Fatal编程技术网

Php 如何在Zend Framework 2中向表单添加错误消息?

Php 如何在Zend Framework 2中向表单添加错误消息?,php,validation,zend-framework2,zend-form,validationerror,Php,Validation,Zend Framework2,Zend Form,Validationerror,我有一个复杂的Zend\Form和多个嵌套的字段集。现在我需要实现一个跨域验证。这意味着,验证规则引用来自不同字段集s的多个元素s。我找到的唯一方法是在MyForm#isValid()中实现此验证,因为它是我可以从中访问每个字段集的唯一位置 MyForm extends Form { public function isValid() { $isFormValid = parent::isValid(); $isCrossFieldsetVaida

我有一个复杂的
Zend\Form
和多个嵌套的
字段集。现在我需要实现一个跨域验证。这意味着,验证规则引用来自不同
字段集
s的多个
元素
s。我找到的唯一方法是在
MyForm#isValid()
中实现此验证,因为它是我可以从中访问每个
字段集的唯一位置

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->get('password')->setMessages(['Wrong password']);

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

}

谢谢你的回答!但无效的不是元素,而是跨多个
元素
s(在不同的
字段集
s)的条件。例如:存在多个不同
字段集的
foo
元素(我们不知道有多少,它们是动态添加的)。必须至少设置/填写一个
foo
。另一个示例:有多个
元素。它们的值之和必须大于
x
。在这两种情况下,
元素
的值本身不能有效或无效。这就是为什么我在寻找一种方法来定义“跨
字段集
s”的验证,并将消息直接添加到
表单
@automatix中。也许这个链接会对您有所帮助。这是一个很好的教程,但它没有回答我的问题。谢谢你的回答!实际上,这样我可以让我的表单保存“表单错误消息”并检索它们。下一步是将它们与
元素
s'消息集成,以便将它们显示在一起。为此,必须重写
元素#getMessages(…)
。我将用它来扩展你的答案。或者有更好的解决办法?