目前,我的Zend表单上的错误消息在元素下面呈现如下:
<ul class="errors">
<li>A password is required.</li>
</ul>
我不喜欢这个。我怎样才能做到这样呢:
<div class="errors">
<p>A password is required.</p>
</div>
我尝试过的事情:
删除并重新声明错误装饰器:
$password->removeDecorator("Errors");
$password->addDecorator("Errors", array("tag" => "div"));
不起作用;我明白了:
<ul tag="div" class="errors">
<li>A password is required.</li>
</ul>
在HtmlTag
装饰器周围包裹其他Errors
装饰器。所有这一切都是为列表添加样式。例如,我尝试添加<strong></strong>
标记,但不是替换列表,而是将标记包裹起来,生成粗体列表。
使用Intercal的PLEASE
运算符很好地问:
PLEASE $password->removeDecorator("Errors");
PLEASE $password->addDecorator("Errors", array("tag" => "div"));
好吧,也许我没有尝试过。但是,重点是我想不出其他任何事情要尝试:)
答案 0 :(得分:9)
第一个问题是默认Errors decorator需要数组错误才能运行;你可能有几个附加到该元素的验证器。这就是为什么无序列表在这种情况下运行良好的原因。
但是,您所需的输出表明每个元素都有一条消息,因此问题变为:您希望该消息来自何处?是否要指定单个消息,而不管验证器生成的消息是什么,或者您是否要从验证器生成的所有错误消息中提取第一条消息(但是,我认为只有一个验证器) ,这就是你知道你想要的只有一条消息的方式吗?
在任何一种情况下,我都会看到一个自定义装饰器。在每种情况下,render()
方法都会检查元素上的错误,并且在出现错误时,您“抓取错误消息”并呈现您想要的标记。
在前一种情况下 - 您想要指定一条消息,无论验证器本身产生的消息如何 - 您的自定义装饰器都可以接受单个选项'消息'。
在后一种情况下,您只需抓取第一条错误消息。
与往常一样,在编写自定义装饰器时,您可能会将它们放在您自己的伪命名空间中,然后使用该元素注册该命名空间。
或者,我可能误读了你的意图。也许你愿意拥有多个&lt; p&gt;标签。在这种情况下,您可以使用标准Errors
装饰器,但是您需要它来调用自定义FormErrors
视图助手,扩展标准FormErrors
视图助手,它会覆盖受保护的成员,如下所示:
protected $_htmlElementEnd = '</p></div>';
protected $_htmlElementStart = '<div%s><p>';
protected $_htmlElementSeparator = '</p><p>';
与往常一样,您可能会将自定义视图助手放入您自己的伪命名空间,并使用视图对象注册该命名空间。
没有完全编写或测试,只是一些想法/想法。希望它有所帮助!