在ViewScript中显示Zend_Form表单错误

5
我正在尝试使用ViewScript在表单前显示所有表单错误。以下是我目前尝试在ViewScript中使用的代码:
<div class="errors">
<?php echo $this->formErrors($this->element->getMessages()); ?>
</div>

这个调用给了我一个错误消息:

警告:htmlspecialchars()期望参数1为字符串,但给出了数组

我已经在其他地方看到过相同的代码,但它对我不起作用。如果我打印出 $this->element->getMessages(),我会看到以下错误消息:

数组([myField] => Array([isEmpty] => Value is required and can't be empty))

有什么想法吗?
2个回答

7

getMessages() 返回一个数组,其中以表单元素名称为键名,并包含该元素错误的数组。因此,基本上不用使用 formErrors 视图助手:

Array ( [isEmpty] => Value is required and can't be empty )

你正在处理它:
Array ( [myField] => Array ( [isEmpty] => Value is required and can't be empty ) )

您应该像这样做:
$arrMessages = $this->myForm->getMessages();
foreach($arrMessages as $field => $arrErrors) {
    echo sprintf(
        '<ul><li>%s</li>%s</ul>',
        $this->myForm->getElement($field)->getLabel(),
        $this->formErrors($arrErrors)

    );
}

2
我最终做了一个类似的东西,但我更喜欢你的解决方案。奇怪的是,没有可用于一次性处理所有表单错误的函数,只能一次处理一个字段的错误。 - Jeremy Hicks

-1

正如Mark在他的回答中指出的那样,getMessages()方法返回一个以表单元素名称为键的数组,每个键都包含该元素的错误数组; 他的解决方案是:

$arrMessages = $this->myForm->getMessages();
foreach($arrMessages as $field => $arrErrors) {
    echo sprintf(
        '<ul><li>%s</li>%s</ul>',
        $this->myForm->getElement($field)->getLabel(),
        $this->formErrors($arrErrors)

    );
}

只要getMessages()返回一个二维数组,这个代码就可以运行。然而,如果表单基于由Doctrine(或其他插件)生成的关系数据集,与字段相关的错误消息也可能是一个数组,而上面的代码将崩溃,因为它在处理$arrErrors时把它视为字符串,但实际上它是一个数组。

如果有第二个数据集,则可以在第一个foreach语句嵌套中引入一个foreach语句来捕获错误消息,但是当getMessages()返回一个二维数组时,这种方法不起作用;如果数据集超过两层,则此方法同样无效。

在我们不知道错误消息来自多深的关系数据方案中,一种可扩展的解决方案是

$arrMessages = $this->myForm->getMessages();
print_r ($arrMessages);

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