これにアプローチする方法はいくつかあります。あなたがYiiフォーラムに投稿しているのを見たので、あなたもそこで検索したと思いますが、そうでない場合は:
私が行ったことは(単純な2ステップのActiveRecordフォームの場合)、単一のアクションを実行し、ボタン名に基づいて条件付きブロックに分割し、フォーム送信でYii POSTを実行します(注:ajax送信では機能しません) )。次に、どのボタンが押されたかに応じて、正しいフォームをレンダリングし、検証のためにモデルに正しいシナリオを設定します。
あなたが持っているような隠された「ステップ」フィールドは、submitButton名をチェックするのと同じ目的を果たすことができます。隠しフィールドを追加する代わりに、「ステップ」をフォーム状態に保存することもできますが、どちらでもかまいません。
一部の人々は、ステートフルactiveForm属性を使用して、ウィザードの1つのステップからデータを保存します。または、セッションを使用したり、一時データベーステーブルに保存したりすることもできます。以下の完全にテストされていない例では、ステートフルフォーム機能を使用しています。
これは、私がActiveRecordフォームに対して基本的に行ったことの例です。これは「actionCreate」に含まれます。
<?php if (isset($_POST['cancel'])) {
$this->redirect(array('home'));
} elseif (isset($_POST['step2'])) {
$this->setPageState('step1',$_POST['Model']); // save step1 into form state
$model=new Model('step1');
$model->attributes = $_POST['Model'];
if($model->validate())
$this->render('form2',array('model'=>$model));
else {
$this->render('form1',array('model'=>$model));
}
} elseif (isset($_POST['finish'])) {
$model=new Model('finish');
$model->attributes = $this->getPageState('step1',array()); //get the info from step 1
$model->attributes = $_POST['Model']; // then the info from step2
if ($model->save())
$this->redirect(array('home'));
else {
$this->render('form2',array('model'=>$model));
} else { // this is the default, first time (step1)
$model=new Model('new');
$this->render('form1',array('model'=>$model));
} ?>
フォームは次のようになります。
フォーム1:
<?php $form=$this->beginWidget('CActiveForm', array(
'enableAjaxValidation'=>false,
'id'=>'model-form',
'stateful'=>true,
));
<!-- form1 fields go here -->
echo CHtml::submitButton("Cancel",array('name'=>'cancel');
echo CHtml::submitButton("On to Step 2 >",array('name'=>'step2');
$this->endWidget(); ?>
フォーム2:
<?php $form=$this->beginWidget('CActiveForm', array(
'enableAjaxValidation'=>false,
'id'=>'model-form',
'stateful'=>true,
));
<!-- form2 fields go here -->
echo CHtml::submitButton("Back to Step 1",array('name'=>'step1');
echo CHtml::submitButton("Finish",array('name'=>'finish');
$this->endWidget(); ?>
お役に立てば幸いです。