YII で登録フォームを開発しています。私のフォームには、Mode1 として登録するか、Mode2 として登録するかを選択する無線オプションがあります。ユーザーがモード 1 を選択した場合、データは table1 に入力するか、table2 に入力する必要があります。YII では、各モデルが 1 つのテーブルを扱います。ここで私のフォームは 2 つのテーブルを扱います。
では、このようなフォームを処理してデータを検証し、YII のテーブルに入力するにはどうすればよいでしょうか?
YII で登録フォームを開発しています。私のフォームには、Mode1 として登録するか、Mode2 として登録するかを選択する無線オプションがあります。ユーザーがモード 1 を選択した場合、データは table1 に入力するか、table2 に入力する必要があります。YII では、各モデルが 1 つのテーブルを扱います。ここで私のフォームは 2 つのテーブルを扱います。
では、このようなフォームを処理してデータを検証し、YII のテーブルに入力するにはどうすればよいでしょうか?
最も簡単な方法は、フォームのモデルを 1 つ作成することです (同じフィールドがあると仮定しますか?)。このクラスはCFormModelを拡張します(以下の例では、このモデルをGlobalFormModelと呼んでいます) 。
このモデルには、他の 2 つのモデルと同じ属性と、modeと呼ばれる 1 つの新しい属性があります 。フォームが送信されると、コントローラーでどのモードに基づいてフォームを処理し、正しいモデルに対して検証することができますか。
$model = new GlobalFormModel
if(isset($_POST['GlobalFormModel'])){
$model->attributes = $_POST['GlobalFormModel'];
if ($model->mode == 1){
$newmodel = new FormOne;
$newmodel->attributes = $model->attributes;
} else {
$newmodel = new FormTwo;
$newmodel->attributes = $model->attributes;
}
... // validate and save $newmodel
}
$this->render("yourview",array("model"=>$model));
ここで、FormOne は最初のテーブルに関連付けられたモデルであり、FormTwo は 2 番目のテーブルに関連付けられたモデルです。まず、GlobalFormModel (ビューに渡される) の新しいインスタンスを作成します。フォームが送信されたかどうかを確認します (ここで検証するか、2 つのモデルのいずれかを読み込んだ後に検証することができます)。モードを確認し、正しいモデルをロードします。