2011-06-22 19 views
0

要素(texbox、select、..)をダイナミックに挿入するフォームを作成する必要があります。今私は隠された要素だけを持つ空のFormファイルを作成し、私のコントローラには特定の条件に従って要素を挿入します。動的に生成された要素Zend_Formを処理する

マイフォームファイル:コントローラで

class Form_Questions extends Zend_Form { 
    public function __construct() { 
     parent::__construct($options); 
     $this->setName('Questions'); 

     // Hidden Label for error output   
     $hiddenlabel = new Zend_Form_Element_Hidden('hiddenlabel'); 
     $hiddenlabel->addDecorator(new Form_Decorator_HiddenLabel()); 

     $this->addElements(array($hiddenlabel)); 
    } 
} 

私のようなものがあります:罰金

...

$form = new Form_Questions();  
$request = $this->getRequest(); 

if ($request->isPost()) 
{ 
    $formData = $request->getPost(); 

    if ($form->isValid($request->getPost())) 
    { 
    die(var_dump($form->getValues())); 
    } 
} 
else 
{ 
    //... add textbox, checkbox, ... 

    // add final submit button 
    $btn_submit = new Zend_Form_Element_Submit('submit'); 
    $btn_submit->setAttrib('id', 'submitbutton'); 
    $form->addElement($btn_submit); 

    $this->view->form = $form; 
} 

フォームが表示されますが、検証は私に大きなトラブルを与えています。私のvar_dump()は、フォームファイルに静的に定義されている隠し要素のみを表示します。私は彼らがPOSTを経由して来ているもの読んで取得することができますaltoughtので、それは、私はそれがZendのが起こっを提出する際に値を格納するために、フォームファイルを使用する場合と同じように動作し

$form->getValue('question1'); 

ような何かをすることはできません、動の要素を保存しません。要素はdinamically作成されているので、私はstandal getValue()の方法を使用してそれらを処理することはできませんので、ポストの後(それらの値)を保持しません。

ポストの後にそれらを「ライブ」する方法に関するアイデアがありがとうと思いますので、通常の形で読むことができます。

答えて

0

質問はdbから来ているという意味では動的なフォームのように聞こえますが、ユーザーが新しい質問を追加するためにフォーム自体を変更するという意味ではありません。

これが当てはまる場合、私は質問フィールドをコントローラに追加しません。むしろ、質問をコンストラクタのフォームに渡してから、フォームのinit()メソッドに質問フィールドとバリデータを追加します。その後、コントローラでは、標準isPost()とそれ以降はisValid()の処理が行われます。

フォームに追加する質問がどういうわけか隠れたラベルの投稿の結果であると言っている場合は、おそらく2つのフォームと2つのアクションが必要です.1つは隠しフィールドフォーム用、もう1つは質問用。

+0

デビッドは非常に良いアイデアです。ほんの少しの概念的な問題です。1.コンストラクタ()またはinit()に要素を直接作成するのとはどういう違いがありますか?私は、この方法でコンストラクタをオーバーライドすることについていくつかの不平を見てきました。同じ人々は、将来の互換性を損なう可能性があると言っています。乾杯。 –

+0

ZFの方は 'init()'を使うことをお勧めします。実際には、親コンストラクタが終了する直前に 'init()'を呼び出すので、おそらく違いはありません。カスタムフォームクラスのコンストラクタで親コンストラクタを呼び出すようにしてください。私は間違いを犯し、なぜ私の要素が現れていないのかを理解していました。 ;-) –

1

isValid()getValues()メソッドを呼び出すフォームは、実際には空のフォームです。そのインスタンスを数行しかインスタンス化せず、その時点で要素を追加していません。

POSTはfieldName => fieldValue型の配列だけを送信し、実際にはZend_Formオブジェクトを送信しないことに注意してください。

達成しようとしていることを知らずに新しい解決策を提案することは困難です。 Zend_Formにすべての要素をすぐに追加してから、ビュースクリプトで必要なもの、つまりecho $this->form->myField;のみを使用する方が一般的には優れています。これにより、isValid()はフォームのすべての要素を処理できます。

+0

私のフォームへの質問は、一連のデータベーステーブルから来ています。質問は、ユーザーのプロフィールに従って表示されるかどうかを示します。 私の元々は、ユーザープロフィールをチェックして、その場で質問を追加することでしたが、私が望むようにうまくいきませんでした。私は方法を考え出すことができませんでした 質問を追加し、少なくとも私が今やっている方法ではなく、ポストの後に最後に持っている。私があなたのアドバイスを取った場合、どのようにして非希望の質問をこのビューに隠すのでしょうか? 歓声、 –

+0

私は必要なときに新しい質問を追加できるようにシステムの管理者が必要なので、データベースに質問を保存します(フォーム要素としてレンダリングされます)。コード。 –

+0

ダビデの答えを読んで、彼はあなたの質問をデータベースに保存するなら、あなたのための良い解決策を持っています。 forの全体ではなく特定の要素を出力したい場合は、echo $ this-> formの代わりに; do echo $ this-> form-> myFieldここで、myFieldは、表示する要素の名前です。 HTML

タグを手動で追加する必要があります。 –

0

私が思いついたのは、私のケースで、私が現在演奏しているコードを考えてみると、私のモデルのメソッドを使ってデータベースから必要なすべての質問を読み込むことでした(fetchQuestions ())、私のコントローラでは、私はレコードセットを通過し、レコードセットの現在の質問に従ってフォーム要素を作成します。 要素は、フォームコンストラクタに渡される配列に積み重ねられます。フォームコンストラクタでは、配列を読み込んですべての動的要素を生成します。私は彼らの意見をフォームに反映しました。

Formコンストラクタをオーバーライドするのは悪い考えではありません。なぜなら、これを自分のフォームに渡すためのset/getメソッドも使用できないからです。