2011-06-09 113 views
1

我目前有一個zend框架應用程序與多個模塊。每個模塊應使用相同的Zend_Form_Decorator_ViewScript,位於default模塊/views/scripts文件夾中。Zend框架表單,子表單和裝飾器

沒有任何變化,在默認情況下模塊只追求形式裝飾viewscripts位於每個模塊下自己/views/scripts文件夾,因此讓他們從default模塊文件夾中加載它們,我首先需要在表單中應用此:

$view = new Zend_View(); 
$view->setScriptPath(APPLICATION_PATH . '/views/scripts'); 
$this->setView($view); 

在同樣的表格中,我創建了多個Zend_Form_SubForm s,爲此我需要再次應用相同的代碼。如果這還不夠,我需要將該路徑應用於每個子表單中的每個單獨元素以及父表單。此外,每一個元素都必須有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

您是否嘗試過使用setElementDecorators來將裝飾器設置爲之前添加的所有元素? – max4ever 2011-06-17 08:03:08

回答

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{} 

不重複設置元素裝飾您可以創建helper方法爲你做的 ,並把它的基本形式類或模塊形式類

Default_Form_Register extends My_Default_Form 
{ 
    public function init() 
    { 
     $el=$this->_createSelect($name); 
     $el->setLabel('Select'); 
     $this->addElement($el); 
     parent::init(); 
    } 
} 

您可能需要使用子窗體相同的方法,然後把基地類在你的圖書館,你應該沒問題。

您可以根據模塊或元素類型自由地進行常見更改。