Yii2 как правильно создать сложные формы с зависимостями и валидировать их?

Нужно создать большую форму, с шагами и с возможностью показывать и не показывать определенные поля в зависимости от выбора пользователя. Какие варианты есть что бы этого добиться?
И так же интересно как валидировать с зависимостями на стороне yii2
  • Вопрос задан
  • 2583 просмотра
Пригласить эксперта
Ответы на вопрос 2
Это первое решение, которое пришло мне в голову. Поправьте, если в чем то ошибся.
Данный код не проверялся на работоспособность, это только концепция.

Controller
class ControllerForm extends \yii\web\Controller
{
    public function actionCreate()
    {
        $post = Yii::$app->request->post();
        $step = Yii::$app->request->post('step', 'step1');
        $model = ModelForm::model($step);
        $model->attributes = $post;

        if ($model->load($post) && $model->validate()) {
            if ($step === 'stepLast' && $model->save()) {
                return $this->redirect(Url::toRoute(['index']));
            }
        }

        return $this->render('form', ['model' => $model]);
    }
}


Model
class ModelForm extends ActiveRecord
{
    public function rules()
    {
        return [
            [['field1', 'field2'], 'required', 'on' => 'step1'],
            [['field3'], 'required', 'on' => 'step2'],
            [['field1', 'field2', 'field3'], 'safe', 'on' => ['step1', 'step2', 'stepLast']]
        ];
    }
}


View
$form = ActiveForm::begin([
    'layout' => 'horizontal',
]);
 echo $form->field($model, 'name', ['options' => ['class' => 'name '.$model->scenario]]);
ActiveForm::end();


Css
.name.step1 {
     display: block;
}

.name.step2 {
     display: none;
}


UP1
В документации Yii2 есть информация о использовании нескольких моделей на форме
www.yiiframework.com/doc-2.0/guide-input-multiple-...
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Так же как и обычно. Можно еще ajax валидацию сделать. Можно на каждый шаг отдельную модель запилить и подгружать шаги через ajax. Вариантов много. Вы бы описали проблему, которую видите конкретнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы