自定义表单装饰器中的 Zend 框架类

Posted

技术标签:

【中文标题】自定义表单装饰器中的 Zend 框架类【英文标题】:Zend Framework Class in Custom Form Decorator 【发布时间】:2012-04-10 11:08:15 【问题描述】:

我正在使用位于以下位置的自定义表单装饰器:http://code.google.com/p/digitalus-cms/source/browse/trunk/library/Digitalus/Form/Decorator/Composite.php?r=767

文件底部(第 70 行)是:

 $output = '<div class="form_element">'
                . $label
                . $input
                . $errors
                . $desc
                . '</div>';

我想让 DIV 类动态并在我在控制器中创建元素时传递。我使用的任何内置 ZEND 函数只修改 LABEL 或 INPUT。这是我创建元素的示例:

$decorator = new Composite();

        $this->addElement('text', 'start', array(
            'label'      => 'Start Number',
            'required'   => true,
            'filters'    => array('StringTrim'),
            'validators' => array(
                'alnum',
            ),
            'decorators' => array($decorator)
        ));

任何想法都将不胜感激。感谢您花时间查看!

【问题讨论】:

【参考方案1】:

现在确定为什么所有的 CSS 类都是硬编码的,如果允许你更改当前的装饰器,只需修复 render() 方法:

class Digitalus_Form_Decorator_Composite

    /* ... */
    public function render($content)
    
        $element = $this->getElement();
        if (!$element instanceof Zend_Form_Element) 
            return $content;
        
        if (null === $element->getView()) 
            return $content;
        

        $separator = $this->getSeparator();
        $placement = $this->getPlacement();
        $label     = $this->buildLabel();
        $input     = $this->buildInput();
        $errors    = $this->buildErrors();
        $desc      = $this->buildDescription();

        $output = '<div class="'.$this->getOption('class').'">'
                . $label
                . $input
                . $errors
                . $desc
                . '</div>';

        switch ($placement) 
            case (self::PREPEND):
                return $output . $separator . $content;
            case (self::APPEND):
            default:
                return $content . $separator . $output;
        
    
    /* ... */

在元素创建期间:

$element->setDecorators(array(
    /* ... */
    array(array('div'=>'Composite'), array('class' => 'my_class_name'))
    /* ... */
)));

如果您不想编辑现有的装饰器,只需扩展它并覆盖 render() 方法...

【讨论】:

+1 不错的答案,你领先我一分钟 :) 我的想法与 getOptions 和构造函数相同。 谢谢,通常我只是帮助zf,这里比较安静:) 太棒了 - 就像一个魅力!只需在初始化我的表单时定义 addPrefixPath ,一切都很好。非常感谢。

以上是关于自定义表单装饰器中的 Zend 框架类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 zend from 在 zend 框架 2 中添加自定义属性

对 Zend_Form 中的特定子表单使用自定义 isValid() 函数

Zend 表单装饰问题

Zend 表单显示组装饰器

检索 Zend 框架中的子表单元素?

Zend Framework 表单、装饰器和验证:我应该回到纯 HTML 吗?