我正在尝试使用ViewScript在表单之前显示所有表单错误。以下是我目前正在尝试在ViewScript中使用的代码:
<div class="errors">
<?php echo $this->formErrors($this->element->getMessages()); ?>
</div>
此调用给出了一条错误消息:
警告:htmlspecialchars()要求参数1为字符串,给定数组为
我已经看到这个相同的代码建议其他地方,但它不适合我。如果我打印出$ this-&gt; element-&gt; getMessages(),我会看到错误消息如下:
数组([myField] =&gt;数组([isEmpty] =&gt;值是必需的,不能为空))
有什么想法吗?
答案 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);