要素(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()の方法を使用してそれらを処理することはできませんので、ポストの後(それらの値)を保持しません。
ポストの後にそれらを「ライブ」する方法に関するアイデアがありがとうと思いますので、通常の形で読むことができます。
デビッドは非常に良いアイデアです。ほんの少しの概念的な問題です。1.コンストラクタ()またはinit()に要素を直接作成するのとはどういう違いがありますか?私は、この方法でコンストラクタをオーバーライドすることについていくつかの不平を見てきました。同じ人々は、将来の互換性を損なう可能性があると言っています。乾杯。 –
ZFの方は 'init()'を使うことをお勧めします。実際には、親コンストラクタが終了する直前に 'init()'を呼び出すので、おそらく違いはありません。カスタムフォームクラスのコンストラクタで親コンストラクタを呼び出すようにしてください。私は間違いを犯し、なぜ私の要素が現れていないのかを理解していました。 ;-) –