Php 有没有一种简单的方法来禁用Zend_表单错误?

Php 有没有一种简单的方法来禁用Zend_表单错误?,php,zend-framework,zend-form,Php,Zend Framework,Zend Form,我正在使用Zend框架。对于特定表单,没有足够的空间显示表单元素旁边的错误。相反,我希望能够在表单上方显示错误。我想我可以通过将$form->getErrorMessages()传递到视图来实现这一点,但是如何禁止错误消息显示在每个元素上?您可以使用setElementDecorators向表单元素添加decoratorsZend_Form在init之后有一个名为loadDefaultDecorators的函数调用。在您的子类中,您可以这样重写: /** * Load the default

我正在使用Zend框架。对于特定表单,没有足够的空间显示表单元素旁边的错误。相反,我希望能够在表单上方显示错误。我想我可以通过将
$form->getErrorMessages()
传递到视图来实现这一点,但是如何禁止错误消息显示在每个元素上?

您可以使用
setElementDecorators
向表单元素添加decorators
Zend_Form
init
之后有一个名为
loadDefaultDecorators
的函数调用。在您的子类中,您可以这样重写:

/**
 * Load the default decorators for forms.
 */
public function loadDefaultDecorators()
{
    // -- wipe all
    $this->clearDecorators();

    // -- just add form elements
    // -- this is the default
    $this->setDecorators(array(
       'FormElements',
        array('HtmlTag', array('tag' => 'dl')),
        'Form'
    ));

    // -- form element decorators
    $this->setElementDecorators(array(
        "ViewHelper",
        array("Label"),
        array("HtmlTag", array(
            "tag"   => "div",
            "class" =>"element",
        )),
    ));

    return $this;
}

假设您在
init
中添加了元素,则会将这些装饰器应用于表单中的每个元素。您将注意到
setElementDecorators
中没有“Errors”decorator。您还可以尝试循环遍历表单元素,并使用
removeDecorator
仅删除错误装饰器。

上述建议没有考虑默认装饰器可能会更改。与其清除修饰符,然后重新应用除不需要的修饰符以外的所有修饰符,不如在表单初始化时禁用不需要的修饰符,如:

class My_Form_Login extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post');        

        $username = new Zend_Form_Element_Text('auth_username');
        $username->setLabel('Username')
            ->setRequired(true)
            ->addValidator('NotEmpty')
            ->removeDecorator('Errors')
            ->addErrorMessage("Please submit a username.");
    etc.....
然后,您可以在使用表单的任何位置决定如何显示消息(如果您计划在表单之外显示消息)。当然,如果它们应该是表单的一部分,只需创建一个合适的decorator并将其添加到上面的表单元素init方法中。是ZendCasts.com上关于表单装饰器的一个不错的教程

除了表单本身之外显示消息的示例

$elementMessages = $this->view->form->getMessages();

// if there actually are some messages
if (is_array($elementMessages)) 
{
    foreach ($elementMessages as $element)
    {
        foreach ($element as $message)
        {
            $this->view->priorityMessenger($message, 'notice');
        }
    }
}

上面使用的priorityMessenger帮助程序可在此处找到:

如果要将错误消息分组到一个容器中,而不是内联错误,请检查以下内容: