2011-07-29 446 views
1

我想知道是否有一種方法可以將一組元素添加到zend窗體中,就好像它們是一個元素一樣,我猜很像是一個子窗體,但它看起來子窗體的功能可能太多了......有沒有辦法將一組元素添加到表單中?

這是我的用例。我創建了一個處理多頁面表單的類。我希望能夠編寫邏輯,根據我所在表單的頁面來更改表單底部的按鈕。 Form Page 1Form Page 2Form page 3

我原本以爲Zend的表格,顯示組將解決我的問題,但你必須先添加項目到窗體,然後將它們添加到顯示組,並通過不能通過顯示組帶有附加元素的功能。我想有可能會像

public function setSubmitButtonGroup($submitButtonGroupElements) 
{ 
    /*Code to set button group*/ 
} 

使用元素的數組的想法只是打我,現在,而不是別的東西,並添加邏輯元素的數組添加到窗體上的功能渲染...但沒有人有任何「更好」的想法或做到這一點?

順便說一句,如果你想知道...我鬆散立足我最初的設計離本節:Zend Framework Advance Form Usage.

回答

0

所以我的問題的複雜性自帶知道多頁表格的哪一頁。使用數組和上面提到的addElements()幫助。

簡單的答案

回答我的問題是後形式「建」可以這麼說,但這樣我就可以添加到使用addElements形式之前被渲染可能被操縱的陣列( )。

長的答案

爲了讓整個畫面,想象每個你打一個或下一個按鈕時,您是通過子窗體的數組遍歷。在這種情況下,需要一個函數來處理按鈕渲染。我結束了使用的情況下statment,儘管它不是世界(在父類Form_MultiPage不能重複使用)最好的實現,但它的工作:

在我的我的mulipage窗體類的extention我

public function setSubmitControls() 
{ 
    $previous = new Zend_Form_Element_Submit('previous',array(
     'label'=>'previous', 
     'required'=>false, 
     'ignore'=>false, 
     'order'=>9000 
    )); 
    $cancel = new Zend_Form_Element_Submit('cancel',array(
     'label'=>'Cancel', 
     'required'=>false, 
     'ignore'=>false, 
     'order'=>9003 
    )); 
    $next = new Zend_Form_Element_Submit('next',array(
     'label'=>'Next', 
     'required'=>false, 
     'ignore'=>false, 
     'order'=>9002 
    )); 
    $finished = new Zend_Form_Element_submit('finish',array(
     'label'=>'Finish', 
     'required'=>false, 
     'ignore'=>false, 
     'order'=>9004 
    )); 
    $submitControls = array(); 
    echo var_dump($this->getCurrentSubForm()->getName()); 
    switch($this->getCurrentSubForm()->getName()) 
    { 
     case 'billInfo': 
      $submitControls = array(
       $next, 
       $cancel 
      ); 
     break; 
     case 'payerInfo': 
      $submitControls = array(
       $previous, 
       $next, 
       $cancel 
      ); 
     break; 
//So on for other subforms 
    } 
    $this->setSubmitButtonGroup($submitControls); 
} 

在我父類,Form_Multipage,我有

public function setSubmitButtonGroup(array $elements) 
{ 
    $this->_submitButton = $elements; 
} 

而且

public function addSubmitButtonGroupToSubForm(Zend_Form_SubForm $subForm) 
{ 
    $subForm->addElements($this->_submitButton); 
    return $subForm; 
} 

當我使用此功能渲染窗體的「頁面」時調用它

public function prepareSubForm($spec) 
{ 
    if (is_string($spec)) { 
     $subForm = $this->{$spec}; 
    } elseif ($spec instanceof Zend_Form_SubForm) { 
     $subForm = $spec; 
    } else { 
     throw new Exception('Invalid argument passed to ' . 
          __FUNCTION__ . '()'); 
    } 
    $subform = $this->setSubFormDecorators($subForm); 
    $subform = $this->addSubmitButtonGroupToSubForm($subForm); 
    $subform = $this->addSubFormActions($subForm); 
    $subform->setMethod($this->getMethod()); 
    return $subForm; 
} 
1

你可以讓自己的工廠接收三個參數,可以你的表單元素,電流控制器和目前的行動。然後在該工廠中,您可以根據控制器/操作組合調用構建器,並傳遞表單。

在您的構建器中,您可以根據存儲在不同組件中的相應控制器/操作要求添加1,2或3個按鈕。完成後,您將表單退回工廠,工廠返回表單。

My_Form // your Zend_Form object 

My_Form_Factory // Your new factory (see below) 

My_Form_Factory_Builder_Controller_Action // One of your builder (see below) 

My_Form_Factory_Component // Extends the corresponding Zend_Form_Elements 

// basic factory that can be called like My_Factory::factory($form, $controller, $action) 
class My_Form_Factory { 
    static public function factory($form, $controller, $action) 
     $builderClass = "My_Form_Factory_Builder_" . $controller . '_' . $action; 
     $builder = new $builderClass($form); 
     return $builder->buildForm(); 
} 

// Basic builder 
class My_Form_Factory_Builder_Controller_Action 
{ 
    protected $_form; 
    protected $_previousComponent ; 
    protected $_nextComponent ; 
    protected $_cancelComponent ; 

    public function __construct($form) 
    { 
     $this->_form = $form; 
     $this->_previousComponent = new My_Form_Factory_Component_Previous(); 
     $this->_nextComponent = new My_Form_Factory_Component_Next(); 
     $this->_cancelComponent = new My_Form_Factory_Component_Cancel(); 
    } 

    public function buildForm() 
    { 
     $this->_form->addElement($previousCompnent); 
     $this->_form->addElement($nextComponent); 
     $this->_form->addElement($cancelComponent); 

     return $this->_form; 
    } 
} 

如果你想使自動化,你可以初始化所有你可能需要在一個抽象類和方法buildForm不同的元件庫的instanciation()只添加您需要爲當前界面的元素。 (我寧願重複每個構建器中的代碼,而不是依賴這種「魔法」,但它是一種可行的方法)。

+0

oooooo ...閃亮。我可以看到哪裏可以抗拒選擇。但是這也需要對我做的方式進行徹底的重新設計,儘管你的想法很簡單,簡單而直接。 –

1

不知道我正確理解你的問題,但這是我如何做一些事情。

在Zend_Form對象中,您可以使用數組中的addElements($ elements)將組添加爲一個組。對於提交按鈕等。我有一個類,我從中獲得$ elements數組,然後我只需將其彈出即可。我還添加了一個displayGroup,但單獨並簡單地控制按鈕的位置。因爲表單是一個對象,所以你可以做如下簡單的事情,但我總是添加一個引用來顯示我的意圖。

更新:洗牌按鈕操作

function addButtons(&$form,$nextName = null) { 
    $buttons = $this->getButtons(); // this will be an array with your buttons 
    // make sure you have the element names in your buttons arrays 
    if (is_string($nextName)) { 
     $buttons['nextButton']->setLabel($nextName); 
    } elseif (is_bool($nextName) && false === $nextName) { 
     unset($buttons['nextButton']; 
    } 
    // repeat for other buttons 

    $form->addElements($buttons); 
    $elementNames = array_keys($buttons); 
    $form->addDisplayGroup($elementNames,'buttonGroup',array('legend'=>'Click some buttons')); 

} 

$this->addButtons($form,'Finish'); 
+0

感謝'addElements()'函數。我完全忘了那個......是的,我一直在研究一個和你在這裏非常相似的想法,除非沒有那麼複雜(不是這樣不必要地複雜)。我剛剛實現'addElements()'基本上是一個名爲'setSubmitButtonGroup(array $ elements)'的函數。我現在不能回答我自己的問題導致ima n00b:P。感謝你這麼好的想法! –

+0

很高興提供幫助。複雜性伴隨着需求;) –

相關問題