【问题标题】:Zend Framework Class in Custom Form Decorator自定义表单装饰器中的 Zend 框架类
【发布时间】: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)
        ));

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

【问题讨论】:

    标签: php forms zend-framework frameworks 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 ,一切都很好。非常感谢。
    猜你喜欢
    • 2011-07-13
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2010-11-12
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多