1

1 つの親テーブルに 4 つ以上の子テーブルが関連付けられている状況にあります。ユーザーが [保存] ボタンを 1 回だけ押すというユーザー エクスペリエンスを作成する必要があります。つまり、ユーザーは親モデル フィールドにすべてのデータを入力し、4 つの子モデル フィールドすべてにデータを入力してから [保存] ボタンを押します。私の知る限り、モデルに関係があると、関連する行を簡単に挿入できますが、主な問題は、単一のモデルの POST メソッドでビューから複数の行を受け取る方法です (ここでは、基本的に子モデルを意味します)。ビューで子モデルの属性を繰り返して手動で試しましたが、レコードを保存すると、最後の行セットのみが親テーブルとともに子テーブルに格納され、子テーブルの1行が失われます。

Yiiでそれは可能ですか、それとも私はあまりにも希望的です....提案やコメントはありますか????

よろしくお願いします。よろしく、 ファイサル

4

3 に答える 3

2

私は解決策を得ましたが、ここや他のフォーラムからのすべての助けを借りて. Kiranの投稿に従い、 jQuery を使用して追加の HTML 属性を生成してテストしました。送信時に、すべての行を希望どおりに正確に取得しました。コントローラーでは、最初にポスト リクエストで送信されたモデルの総数をカウントし、次に目的の処理のために各モデルを反復処理しました。以下はコード スニペットです。

    if(!empty($_POST))
{
    $v=count($_POST['Address'])+1;
    Yii::log(count($_POST['Address']));
    for ($i=1; $i<$v; $i++){
            $addressModel_1->attributes=$_POST['Address'][$i];
            Yii::log('Dumping Data from '.$i.' model');
            Yii::log($addressModel_1->city);
            Yii::log($addressModel_1->street);
            Yii::log($addressModel_1->state);}}

ビュー側では、jQuery 関数を使用して HTML を生成しました。この関数は、ユーザーがデータを入力できるように別の html セットを追加するだけでした。HTML を生成する際に注意すべき重要なことは、モデルの名前です。そうしないと、コントローラーの目的の場所に着陸しません。

以下は、この関数のコード スニペットです。DOM には既に 2 セットの行があるため、「3」を id としてハードコーディングしていることに注意してください。このコードをさらに改善する予定ですが、ロジックは機能しますのでご安心ください。

function createNewAddress(){
     var newdiv = document.createElement('div');
     var inner_html='<div class="row">';
        inner_html+='<label for="Address_3_street">Street</label>        <input name="Address[3][street]" id="Address_3_street" type="text" maxlength="200" />            </div>';
        inner_html+='<div class="row">';
        inner_html+='<label for="Address_3_city">City</label>        <input name="Address[3][city]" id="Address_3_city" type="text" maxlength="200" />            </div>  ';
        inner_html+='<div class="row">';
        inner_html+='<label for="Address_3_state">State</label>        <input name="Address[3][state]" id="Address_3_state" type="text" maxlength="200" />            </div>';
     newdiv.innerHTML=inner_html;
     $('#user-form').append(newdiv);

}

このようにして、ブラウザからオンザフライで n 個の子行を追加でき、ユーザーは [保存] または [送信] ボタンを 1 回だけ押すだけですべてのデータを保存できます。

皆さんのサポートに感謝します。

よろしく、

ファイサル

于 2012-10-11T18:11:48.470 に答える
0

表形式の入力を使用する必要があります。そうすれば、同じタイプの複数のインスタンスのデータを受信できます。次に、親を保存し、そのIDを使用して子の外部キーを入力できます。

于 2012-10-11T00:29:17.983 に答える
0

すべてのフォーム フィールドの検証を処理する新しい CFormModel を作成し、POST 関数の $model->validate の後に属性を手動で設定できます。例えば:

if ($model->validate){
    $model_one = new ModelOne;
    $model_one->name = $model->model_one_name;
    $model_one->surname = $model->model_one_surname;
    ....

    $model_two = new ModelTwo;
    $model_two->name = $model->model_two_name;
    $model_two->surname = $model->model_two_surname;
    ....
}
于 2012-10-11T08:07:10.690 に答える