Hay un par de formas de abordar esto. Veo que ha escrito en el foro Yu, así que supongo que has buscado por allí también, pero en caso de que no tiene:
Lo que he hecho es (justo para un simple formulario ActiveRecord de 2 pasos) tomó una sola acción y la dividió en bloques condicionales basados en el nombre del botón, que Yii POSTs en un formulario envía (nota: no funciona con ajax submits). Luego, dependiendo del botón al que se presionó, presento la forma correcta y establezco el escenario correcto en mi modelo para fines de validación.
Un campo oculto de "paso" como el que tiene podría servir para el mismo propósito que la comprobación del nombre de submitButton. Tal vez guarde el "paso" en el estado de formulario en lugar de agregar un campo oculto, pero cualquiera estaría bien.
Algunas personas usan el atributo stateful activeForm para guardar los datos de un solo paso en el asistente, o puede usar la sesión, o incluso guardar en una tabla de base de datos temporal. En mi ejemplo completamente no probado, estoy usando la funcionalidad de formulario con estado.
Aquí hay un ejemplo de lo que básicamente hice para un formulario ActiveRecord. Esto va en el "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));
} ?>
Las formas se vería algo como esto:
Form1:
<?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(); ?>
Forma 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(); ?>
espero que sea ¡servicial!
Tome un vistazo a 'chtml :: statefulForm' y una [hilo en el foro de Yu] (http://www.yiiframework.com/forum/index.php?/topic/ 8413-wizard-forms /) –