Zend框架表单,子表单和装饰器

时间:2011-06-09 16:11:09

标签: php zend-framework zend-form

我目前有一个包含多个模块的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'))            
));

覆盖我之前应用的所有元素特定装饰器。

建议?

1 个答案:

答案 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();
     }
}

您可能需要对子表单使用相同的方法,然后将基类放在库中,您应该没问题。

您可以根据模块或元素类型自由进行常规更改。