代码之家  ›  专栏  ›  技术社区  ›  Matt McCormick

有没有一种简单的方法可以禁用Zend_窗体错误?

  •  2
  • Matt McCormick  · 技术社区  · 16 年前

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

    2 回复  |  直到 7 年前
        1
  •  4
  •   typeoneerror    16 年前

    可以使用 setElementDecorators . 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;
    }
    

    假设您将元素添加到 初始化 将这些修饰符应用于表单中的每个元素。您会注意到在 设置元素装饰器 .您还可以尝试循环遍历表单元素并使用 removeDecorator 只删除错误修饰器。

        2
  •  5
  •   david    7 年前

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

    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.....
    

    然后,无论您在哪里使用表单,您都可以决定如何显示消息(如果您计划在表单之外显示它们)。当然,如果它们应该是表单的一部分,只需创建一个合适的修饰器并将其添加到上面的表单元素init方法中。 Here 是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帮助程序可以在此处找到: http://emanaton.com/code/php/zendprioritymessenger

    推荐文章