如何阻止Zend Form错误呈现为无序列表?

时间:2011-04-21 15:34:55

标签: php zend-framework zend-form

目前,我的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"));
    

    好吧,也许我没有尝试过。但是,重点是我想不出其他任何事情要尝试:)

1 个答案:

答案 0 :(得分:9)

第一个问题是默认Errors decorator需要数组错误才能运行;你可能有几个附加到该元素的验证器。这就是为什么无序列表在这种情况下运行良好的原因。

但是,您所需的输出表明每个元素都有一条消息,因此问题变为:您希望该消息来自何处?是否要指定单个消息,而不管验证器生成的消息是什么,或者您是否要从验证器生成的所有错误消息中提取第一条消息(但是,我认为只有一个验证器) ,这就是你知道你想要的只有一条消息的方式吗?

在任何一种情况下,我都会看到一个自定义装饰器。在每种情况下,render()方法都会检查元素上的错误,并且在出现错误时,您“抓取错误消息”并呈现您想要的标记。

在前一种情况下 - 您想要指定一条消息,无论验证器本身产生的消息如何 - 您的自定义装饰器都可以接受单个选项'消息'。

在后一种情况下,您只需抓取第一条错误消息。

与往常一样,在编写自定义装饰器时,您可能会将它们放在您自己的伪命名空间中,然后使用该元素注册该命名空间。

或者,我可能误读了你的意图。也许你愿意拥有多个&lt; p&gt;标签。在这种情况下,您可以使用标准Errors装饰器,但是您需要它来调用自定义FormErrors视图助手,扩展标准FormErrors视图助手,它会覆盖受保护的成员,如下所示:

protected $_htmlElementEnd       = '</p></div>';
protected $_htmlElementStart     = '<div%s><p>';
protected $_htmlElementSeparator = '</p><p>';

与往常一样,您可能会将自定义视图助手放入您自己的伪命名空间,并使用视图对象注册该命名空间。

没有完全编写或测试,只是一些想法/想法。希望它有所帮助!