Можно попробовать организовать со сценариями.
Вот что у меня получилось:
Model:
Код: Выделить всё
class StepsForm extends Model
{
const SCENARIO_STEP_1 = 'step_1';
const SCENARIO_STEP_2 = 'step_2';
const SCENARIO_STEP_3 = 'step_3';
const SCENARIO_STEP_LAST = 'stepLast';
public $field1;
public $field2;
public $field3;
public $field4;
public $name; // будем хранить сценарий
/**
* @inheritdoc
*/
public function rules()
{
return [
[['field1'], 'required', 'on' => self::SCENARIO_STEP_1],
[['field1', 'field2'], 'required', 'on' => self::SCENARIO_STEP_2],
[['field1', 'field2', 'field3'], 'required', 'on' => self::SCENARIO_STEP_3],
[['field1', 'field2', 'field3', 'field4'], 'required', 'on' => self::SCENARIO_STEP_LAST],
['name', 'safe'],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'field1' => 'Значение 1',
'field2' => 'Значение 2',
'field3' => 'Значение 3',
'field4' => 'Значение 4',
];
}
}
Controller:
Код: Выделить всё
public function actionIndex()
{
return $this->render('index');
}
public function actionCreate()
{
$model = new StepsForm();
if ($post = Yii::$app->request->post()) {
$model->scenario = $post['StepsForm']['name'];
}
if ($model->load($post)) {
if ($model->name == $model::SCENARIO_STEP_1) {
$model->scenario = $model::SCENARIO_STEP_2;
return $this->render('step_2', [
'model' => $model,
]);
}
if ($model->name == $model::SCENARIO_STEP_2) {
$model->scenario = $model::SCENARIO_STEP_3;
return $this->render('step_3', [
'model' => $model,
]);
}
if ($model->name == $model::SCENARIO_STEP_3) {
$model->scenario = $model::SCENARIO_STEP_LAST;
return $this->render('step_4', [
'model' => $model,
]);
}
if ($model->name == $model::SCENARIO_STEP_LAST) {
Yii::$app->session->setFlash('success', 'Форма отправлена! Все значения успешно получены.');
return $this->render('index', [
'model' => $model,
]);
}
}
$model->scenario = $model::SCENARIO_STEP_1;
return $this->render('step_1', [
'model' => $model,
]);
}
View: index.php
Код: Выделить всё
<p>
<?php if ($model) {
\yii\helpers\VarDumper::dump($model->attributes, 10, 1);
} ?>
</p>
<p>
<?= Html::a('Начинаем', ['create'], ['class' => 'btn btn-primary']) ?>
</p>
View: step_1.php
Код: Выделить всё
<?php $form = ActiveForm::begin(['id' => 'step-form-1']); ?>
<?= $form->field($model, 'field1')->textInput() ?>
<?= $form->field($model, 'name')->hiddenInput([
'value' => $model->scenario,
])->label(false) ?>
<div class="form-group">
<?= Html::submitButton('Далее', ['class' => 'btn btn-primary', 'name' => 'test-button']) ?>
</div>
<?php ActiveForm::end(); ?>
View: step_2.php
Код: Выделить всё
<?php $form = ActiveForm::begin(['id' => 'step-form-2']); ?>
<?= $form->field($model, 'field2')->textInput() ?>
<?= $form->field($model, 'name')->hiddenInput([
'value' => $model->scenario,
])->label(false) ?>
<?= $form->field($model, 'field1')->hiddenInput()->label(false) ?>
<div class="form-group">
<?= Html::submitButton('Далее', ['class' => 'btn btn-primary', 'name' => 'test-button']) ?>
</div>
<?php ActiveForm::end(); ?>
View: step_3.php
Код: Выделить всё
<?php $form = ActiveForm::begin(['id' => 'step-form-3']); ?>
<?= $form->field($model, 'field3')->textInput() ?>
<?= $form->field($model, 'name')->hiddenInput([
'value' => $model->scenario,
])->label(false) ?>
<?= $form->field($model, 'field1')->hiddenInput()->label(false) ?>
<?= $form->field($model, 'field2')->hiddenInput()->label(false) ?>
<div class="form-group">
<?= Html::submitButton('Далее', ['class' => 'btn btn-primary', 'name' => 'test-button']) ?>
</div>
<?php ActiveForm::end(); ?>
View: step_4.php
Код: Выделить всё
<?php $form = ActiveForm::begin(['id' => 'step-form-4']); ?>
<?= $form->field($model, 'field4')->textInput() ?>
<?= $form->field($model, 'name')->hiddenInput([
'value' => $model->scenario,
])->label(false) ?>
<?= $form->field($model, 'field1')->hiddenInput()->label(false) ?>
<?= $form->field($model, 'field2')->hiddenInput()->label(false) ?>
<?= $form->field($model, 'field3')->hiddenInput()->label(false) ?>
<div class="form-group">
<?= Html::submitButton('Готово', ['class' => 'btn btn-primary', 'name' => 'test-button']) ?>
</div>
<?php ActiveForm::end(); ?>
Как то так.)