关于Zend_Form的建议

时间:2010-10-15 07:40:39

标签: php zend-framework

我正在使用Zend_Framework构建应用程序,我想请教您关于Zend_Form的建议。网站上的所有表单都应该使用表格而不是定义列表进行修饰。我的想法是我应该创建一个公共表单(没有元素),然后在整个站点中实例化它并根据需要添加元素。这种常见形式需要修改标准装饰器,以便使用表而不是定义列表。你怎么建议这样做?覆盖Zend_Form的addElement()方法,以便它改变新元素的装饰器?

但还有另一个警告。如果需要,应该可以选择为特定元素使用不同的装饰器集。所以我有点不解如何做到这一点。你有什么建议吗?

2 个答案:

答案 0 :(得分:2)

没有简单的方法可以覆盖默认的装饰器。我使用的解决方案是覆盖所有元素并重新定义loadDefaultDecorators方法。

问题是每个元素都有一组特定的装饰器。例如,隐藏元素只需要ViewHelper装饰器,而文件元素需要File,Errors,Description,HtmlTag(td),Label(th),HtmlTag(tr)。

您还可以在init方法的末尾使用Zend_Form :: setElementDecorators(在调用addElement之后)。但是你需要为每个表单自定义它......

答案 1 :(得分:1)

使用中间类进行项目范围的配置。然后,您将扩展此类而不是Zend_Form

档案My/Form.php

<?php
abstract class My_Form extends Zend_Form {

    public function __construct ( $options = null ) {
        parent::__construct($options);

        $this->setElementDecorators(array(
                // the base <input, <select, <textarea markup
                'ViewHelper',

                // wrap that into a <div class="input-wrap" />
               array (
                    'HtmlTag',
                    array (
                        'tag'   => 'div',
                        'class' => 'input-wrap',
                    )
                ),

                // append errors in <ul/li>
               'Errors',

                // then prepend <label markup
                'Label',
            ));
    }
}

然后在档案My/Form/Demo.php

<?php
class My_Form_Demo extends My_Form {

    public function init () {
        // Your elements here
    }
}

您也可以为特定元素执行此操作

档案My/Form/Element/Group.php

<?php
class My_Form_Element_Group extends Zend_Form_Element_Select {

    public function init () {
        // Specific options
        $this->addMultiOptions(array(
            'A' => 'group A',
            'B' => 'group B',
        ));

        // This element doesn't need the div.input-wrap
        $this->removeDecorator('HtmlTag');
    }
}