2011-07-29 16 views
1

ある要素であるかのように、ある要素のグループをzendフォームに追加する方法があったら、それはサブフォームによく似ていると思いますが、サブフォームの機能があまりにも多いようですフォームに要素のグループを追加する方法はありますか?

ここは私の使用例です。私は、複数ページのフォームを扱うクラスを作成しました。私はフォームのページに基づいて、フォームの下部にボタンを変更するロジックを書くことができるようにしたいと思います。 Form Page 1Form Page 2Form page 3

私はもともとZendのフォーム-DisplayGroupは私の問題を解決するだろうと思っていますが、最初のフォームに項目を追加する必要があり、その後、表示グループに追加し、通過表示グループを渡すことはできません要素が付いた関数。私は要素の配列を使用してのアイデアはちょうど上のフォームに要素の配列を追加するために今何か他のものに反対し、ロジックを追加として私を襲っ

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

ようなものになるだろう機能を持っていると思いますレンダリング...しかし、誰かが "良い"アイデアを持っているのですか?

はところで、誰もが疑問に思っている場合...私は緩く、このセクションのオフに私の最初の設計を基づかよ:Zend Framework Advance Form Usage.

答えて

0

をシャッフル。配列と上記のaddElements()を使うと助けになりました。

単純な答え

は私の問題への答えは(私はaddElementsを使用してフォームに追加することができるように、フォームは、いわば「建て」された後に操作することができますが、それがレンダリングされる前に配列しました)。

ロング回答

全体像を取得するには、次または前のボタンを押すたびに、あなたがサブフォームの配列を横断している想像してみてください。この場合、ボタンレンダリングを処理する関数が必要になります。それは世界で最高の実装ではないのですけれども、私は(親クラスForm_MultiPageで再利用可能ではない)、ケースなステートメントを使用して終了、それが働いた:

私mulipageフォームクラスの私の拡張子に私は

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

あなた自身3つのparamsを受け取る工場、フォーム要素、現在のコントローラと作ることができます現在のアクション。その工場では、コントローラー/アクションの組み合わせに基づいてビルダーを呼び出し、フォームを渡すことができます。

ビルダーには、異なるコンポーネントに格納されている対応するコントローラ/アクションの要件に基づいて、1つ、2つまたは3つのボタンを追加します。完了したら、フォームを工場に戻し、工場はフォームを返却します。あなたは、あなたが抽象クラスで、メソッドbuildFormに必要な場合がありますすべての異なるcompomentsを初期化することができインスタンス化を自動化したい場合は

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

()だけがその現在のインターフェイスのために必要な要素を追加します。 (私はむしろ、この種の「魔法」に頼るよりも、各ビルダーのコードを繰り返しますが、実行可能な方法です)。

+0

OOOOOO ...とフォームの「ページ」をレンダリングするときに呼び出され。私はそれが挑戦できる選択肢がどこにあるのか分かりました。しかし、あなたのアイデアはシンプルで、簡単で、簡単ですが、それはまた私がそれをやっている方法の完全な再設計を必要とするでしょう。 –

1

私はあなたの問題を正しく理解していますが、これは私がいくつかのことをする方法です。

Zend_Formオブジェクトでは、配列に `addElements($ elements) 'を持つグループとして要素を追加できます。 Submitボタンなどの場合、私は$ 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() '関数をありがとう。私はそれを完全に忘れていました...はい、私はあなたがここにあるものに非常に似ているアイデアに取り組んできましたが、それほど複雑ではない(これは不必要に複雑ではない)。基本的に 'setSubmitButtonGroup(array $ elements)'という関数として 'addElements()'を実装しました。私は自分の疑問に今すぐ答えられない。素晴らしいアイデアをありがとう! –

+0

喜んで助けてください。複雑さには需要がある;) –

関連する問題