0

Zend Framework 1.12を使用して、複数のフォームを含むページを作成しています。単一のマスターフォームとサブフォームを使用します。したがって、検証コードの部分は1つだけです。これらのサブフォームは、データベース内のさまざまなテーブルを指します。そのフォームに関する行がデータベースにある場合、フォームはデフォルトでデータベースから値を取得し、ユーザーがそのデータを変更できるようにすることを目的としています。また、データベースに行がない場合は、このフォームの入力がdbに挿入されます。最初に、dbから値を取得し、それらをフォーム要素の値として表示できます。しかし、私がそれを変更して、

$form->getValues();

ページに入力(または編集)された値にアクセスできません。デフォルトでフォームに入力されたデータベースの値に再度アクセスします。このフォームは常に編集できるはずです。また、さまざまな種類のデータ用に複数のフォームがあり、同じことを実行します。私は何を間違っている必要がありますか?何か案が?

(追加)ここに私のコントローラーコードの関連部分の要約があります:

$masterform = new Application_Form_GeneralForm(); // a class which extends Zend_Form
$form1 = new Application_Form_SmallForm(); // a class which extends Zend_Form_Subform
$masterform->addSubform($form1, 'form1');
                         // so far, for form 1, no problem. My second form will be 
                         // added to the masterform after this first form is submitted,
                         // which works fine.

$form2 = new Application_Form_AnotherSmallForm(); // a class which extends Zend_Form_Subform

$request = $this->getRequest();
if ($request->isPost()){
    if ($generalform->isValid($request->getPost())) {
         $form2->loadValues(); // the part that form elements are filled with data 
                               // taken from db, a method defined in `AnotherSmallForm` 
                               // class. Just assigning values to elements with `setValue()`

         $form2->saveValues(); // Here is the problem, another method to save the 
// current values to db. (defined in form class). I have to do this in this fragment of code, so i don't know to 
// use which order ( saveValues() and loadValues() methods' order )` 

         $masterform->addSubform($form2, 'form2');
    }
}

したがって、最初のステップ:$form1が$masterformに追加されます。

2番目のステップ:$ masterformが送信され(現在は$ form1のみが含まれています)、$form2が$masterformに追加されます。追加される前に、$form2の値がフォーム要素内にロードされます。

3番目のステップ:$ masterformが送信されました($form1と$form2も同様です)。$ form2の値に変更があった場合は、この送信によってdbで更新する必要があります。

これがこのコードの目標ですが、3番目のステップのために達成できませんでした。

4

2 に答える 2

0

私はついにそれを理解しました。サブフォームが相互に関連する条件で作成される場合でも、それらはif($request->isPost())条件ブロックから作成する必要があります。したがって、ステップを追加する必要がある場合(私が行う必要があるように、$form1が送信された後に$form2が作成され、$ form1がページに残っている場合)、要件が直接かつ個別に満たされているかどうかをテストする必要があります。私のこのアプローチはうまくいきません。次のようになります。

$masterform = new Application_Form_GeneralForm(); 
$form1 = new Application_Form_SmallForm();
$masterform->addSubform($form1, 'form1');                          

$form2 = new Application_Form_AnotherSmallForm(); 

if (/* the requirement you want to check if $form2 should be added or not, 
    and this could easily be checking some value which is submitted with 
    $form1, so you have already checked if $form1 has been submitted */ ) 
    $masterform->addSubform($form2, 'form2'); // we add it if requirement is met

$request = $this->getRequest();
if ($request->isPost()){
    if ($generalform->isValid($request->getPost())) {
         $form2->saveValues(); // be sure it saves the final values added to form
         ////.......
    }
}

そして、私はここにいるのをやめ、フォームクラスloadValues()のメソッド内でそのメソッドを呼び出します。init()したがって、konradwwwが言ったように、saveValues()が最初に発生し、次にloadValues()が発生するはずです。これは、フォームクラスでloadValues()を使用することで実行できます。これは、とにかくフォームの開始プロセスに属します。

于 2012-12-03T12:14:24.640 に答える
0

投稿値を送信した後、デフォルトの db 値で書き直しています。

if ($request->isPost()){
.........................
    $form2->loadValues(); // here you're rewriting it!
    $form2->saveValues(); 

単純に順序を変更します。最初に saveValues()、次に loadValues()。

于 2012-11-29T15:56:43.663 に答える