Zend:使用用户定义的html标记包装FormErrors

时间:2011-05-29 08:27:18

标签: php zend-framework zend-form

Zend talk。默认情况下,使用FormErrors装饰器生成的错误列表具有以下标记:

<ul class="form-errors>
 <li>
  <b>[element label or name]</b>
  <ul>
    <li>[error message]</li>
    <li>[error message]</li>
  </ul>
 </li>
</ul>

问题:如何使用以下结构?

<span class='myErrors'>
 &bull;[error message]</br>
</span>

更新:我尝试过:

array('FormErrors', array(
'markupListStart' => "<span class='myErrors'>",
'markupListEnd' => '</span>',
'markupListItemStart' => '',
'markupListItemEnd' => '</br>',
'ignoreSubForms'=> false,
'showCustomFormErrors' => true,
'onlyCustomFormErrors'=> false,
'markupElementLabelEnd'   => '',
'markupElementLabelStart' => ''
));

但我仍然有不需要的标签和标签。这是源代码:

<span class='myErrors'>
 [element label or name]
 <ul class="errors">
  <li>
  [error message]
  </li>
</ul>
</br>
</span>

2 个答案:

答案 0 :(得分:1)

简单的事情就是创建自己的装饰器。您可以使用Zend装饰器并修改代码。但我建议将消息​​放在

元素而不是为了语义,span毕竟是一个内联元素,你想要多行。

如果您不想创建新的装饰器,可以尝试使用Zend FormErrors选项中的数据传递数组

protected $_defaults = array(
    'ignoreSubForms'          => false,
    'showCustomFormErrors'    => true,
    'onlyCustomFormErrors'    => false,
    'markupElementLabelEnd'   => '</b>',
    'markupElementLabelStart' => '<b>',
    'markupListEnd'           => '</ul>',
    'markupListItemEnd'       => '</li>',
    'markupListItemStart'     => '<li>',
    'markupListStart'         => '<ul class="form-errors">',
);

使用适当的标签创建类似的数组。

答案 1 :(得分:1)

你需要两件事:装饰者和视图助手。默认情况下,Zend Form使用'Errors'装饰器,它使用FormErrors视图助手。您需要覆盖它以实现您的需要。用这个简单的例子来说明这一点:

class Admin_Form_Authors extends Zend_Form
{

    public function init()
    {

        $name = new Zend_Form_Element_Text('name');
        $name->setLabel('name')
             ->setRequired(true)
             ->addFilter('StripTags')
             ->addFilter('StringTrim')
             ->addValidator('NotEmpty')
             ->setDecorators(array(
                'ViewHelper',
                array(new My_Form_Error_Decorator(),array('class' => 'my-error','escape' => true)),
                'Label',
                'HtmlTag'
                ));

        $submit = new Zend_Form_Element_Submit('submit');
        $submit->setAttrib('id','submitbutton');

        $this->addElements(array($name,$submit));
    }
}

正如你所看到的,我用于$name表单元素的第二个装饰器是My_Form_Error_Decorator类的新对象,它看起来像这样:

class My_Form_Error_Decorator extends Zend_Form_Decorator_Abstract
{
    public function render($content)
     {
        $element = $this->getElement();
        $view    = $element->getView();
        if (null === $view) {
            return $content;
        }

        $errors = $element->getMessages();
        if (empty($errors)) {
            return $content;
        }

        $separator = $this->getSeparator();
        $placement = $this->getPlacement();
        $viewhelp = new My_Form_Error_View_Helper();
        $errors = $viewhelp->myErrorViewer($errors, $this->getOptions());

        switch ($placement) {
            case self::APPEND:
                return $content . $separator . $errors;
            case self::PREPEND:
                return $errors . $separator . $content;
        }
     }

}

这实际上与默认的'Errors'装饰器几乎是相同的装饰器,我改变的唯一一行是$errors = $viewhelp->myErrorViewer($errors, $this->getOptions());这里我告诉装饰者使用My_Form_Error_View_Helper视图助手,反过来看起来像这样:

class My_Form_Error_View_Helper extends Zend_View_Helper_FormElement
{
    public function myErrorViewer($errors, array $options = null)
    {

        if (empty($options['class'])) {
            $options['class'] = 'errors';
        }

        $start = "<span%s>";
        $end = "</br></span>";
        if (strstr($start, '%s')) {
            $start   = sprintf($start, " class='{$options['class']}'");
        }

        $html  = $start
               . array_pop($errors)
               . $end;

        return $html;
    }
}

我再次从原始FormErrors View Helper借用了大部分此功能。这绝不是您应该实现的解决方案,但希望这为您提供了如何使用装饰器和查看帮助程序来自定义表单输出的正确途径。我推荐以下两个关于装饰器和视图助手的读物(它们本身就是一个很大的主题)

Decorators View Helpers