在ViewScript中显示Zend_Form表单错误

时间:2010-08-11 00:05:40

标签: zend-framework forms

我正在尝试使用ViewScript在表单之前显示所有表单错误。以下是我目前正在尝试在ViewScript中使用的代码:

<div class="errors">
<?php echo $this->formErrors($this->element->getMessages()); ?>
</div>

此调用给出了一条错误消息:

  

警告:htmlspecialchars()要求参数1为字符串,给定数组为

我已经看到这个相同的代码建议其他地方,但它不适合我。如果我打印出$ this-&gt; element-&gt; getMessages(),我会看到错误消息如下:

  

数组([myField] =&gt;数组([isEmpty] =&gt;值是必需的,不能为空))

有什么想法吗?

2 个答案:

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

    );
}

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