我正在使用Zend_Framework构建应用程序,我想请教您关于Zend_Form的建议。网站上的所有表单都应该使用表格而不是定义列表进行修饰。我的想法是我应该创建一个公共表单(没有元素),然后在整个站点中实例化它并根据需要添加元素。这种常见形式需要修改标准装饰器,以便使用表而不是定义列表。你怎么建议这样做?覆盖Zend_Form的addElement()方法,以便它改变新元素的装饰器?
但还有另一个警告。如果需要,应该可以选择为特定元素使用不同的装饰器集。所以我有点不解如何做到这一点。你有什么建议吗?
答案 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');
}
}