我目前有一个包含多个模块的zend框架应用程序。每个模块应使用位于default
模块/views/scripts
文件夹中的相同Zend_Form_Decorator_ViewScript。
没有任何更改,模块默认只在每个模块下面的自己的/views/scripts
文件夹中查找表单装饰器视图脚本,所以要让它们从default
modules文件夹加载它们,我首先需要在表格中应用:
$view = new Zend_View();
$view->setScriptPath(APPLICATION_PATH . '/views/scripts');
$this->setView($view);
在同一个表单中,我创建了多个Zend_Form_SubForm
,我需要再次应用相同的代码。如果这还不够,我需要将该路径应用于每个SubForm中的每个元素以及父窗体。此外,每个元素必须每次定义其ViewScript,如:
$username->setDecorators(array(array('ViewScript', array('viewScript' => '/formScripts/wizardElement.phtml'))));
现在,如果我为同一个文件中的每个元素/子表单/表单定义所有内容,那么一切都有效,但它看起来似乎是多么不必要的工作/代码。
scriptPath
元素,它的子形式和
子表单元素?ViewScripts
?我目前正在从默认的Zend_Form
直接扩展我的表单,我不会有创建自己的抽象表单以扩展我的表单的问题,但尤其是scriptPath
问题,我我不完全确定如何解决这个问题。
申请:
$this->setSubFormDecorators(array(
'Form',
array('ViewScript', array('viewScript' => '/formScripts/wizardSubForm.phtml'))
));
覆盖我之前应用的所有元素特定装饰器。
建议?
答案 0 :(得分:1)
可能是我没有详细说明你的情况,但我建议你创建基本表单,然后为每个模块创建基本表单类,然后你的特定表单扩展相应的模块表单
My_Base_Form extends Zend_Form
{
public function init()
{
//if you need to init something for all forms
parent::init();
}
public function _createSelect($name)
{
$element=new Zend_Form_Element_Select($name);
$element->setDecorators(
//decorators for select
)
$element->viewScript='select.phtml';
return $element;
}
}
My_Default_Form extends My_Base_Form
{
public function init()
{
//what you do to init dirs for this module
$view = new Zend_View();
$view->setScriptPath(APPLICATION_PATH . '/views/scripts');
$this->setView($view);
parent::init();
}
//called automatically by Zend_Form
public function loadDefaultDecorators()
{
parent::loadDefaultDecorators();
$this->setDefaultFormDecorators($this);
$this->setButtonDecorators($this);
}
}
My_Admin_Form extends My_Base_From{}
要不重复设置元素装饰器,您可以创建为您执行此操作的辅助方法 并将其放在基本表单类或模块表单类
中Default_Form_Register extends My_Default_Form
{
public function init()
{
$el=$this->_createSelect($name);
$el->setLabel('Select');
$this->addElement($el);
parent::init();
}
}
您可能需要对子表单使用相同的方法,然后将基类放在库中,您应该没问题。
您可以根据模块或元素类型自由进行常规更改。