有几种方法可以解决这个问题。我看到你在Yii论坛上发帖,所以我假设你也在那里搜索过,但如果你还没有:
我所做的是(只是一个简单的2步ActiveRecord表单)采取一个动作,并根据按钮名称将其划分为条件块,Yii POSTT在表单提交(注意:不适用于ajax提交)。然后,根据点击的按钮,我呈现正确的表单,并在模型上设置正确的方案以进行验证。
像您一样的隐藏“步骤”字段可能与检查 submitButton 名称具有相同的用途。我可能会将“步骤”保存到表单状态,而不是添加隐藏字段,但两者都可以。
有些人使用有状态 activeForm 属性来保存向导中单个步骤中的数据,或者您可以使用会话,甚至可以保存到临时数据库表中。在下面我完全未经测试的示例中,我使用的是有状态表单功能。
以下是我基本上为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(); ?>
我希望这是有帮助的!