@kirillantv

Как в yii2 реализовать несколько последовательных форм через AJAX?

Добрый день, господа. Нужен батин совет. Имею Yii2 и объект (например, товар), данные которого (категории, атрибуты) записываются в разные таблицы БД. Для каждой таблицы БД хочу сделать отдельную форму, к каждой из которых нельзя перейти, не провалидировав предыдущую.
Так вот. Вопрос в том, как это всё организовать наиболее православно, чтобы формы переключались друг за другом с помощью AJAX. Я вижу два возможных пути:
1. Реализовать всё в одном контроллере, а валидацию сделать с помощью
$form = ActiveForm::begin([
    'id' => $model->formName(),
    'enableAjaxValidation' => true,
    'validationUrl' => Url::toRoute(['items/validation'])

И запретить доступ к следующему разделу через js.
2. Либо подгружать каждую последующую страницу с помощью $this->renderAjax. Однако получается, что в этом случае придется хранить где-то уже заполненные данные? Например, в куках.

P.S. Буду предельно рад примерам подобного рода реализаций на yii2. Но больше интересует правильный подход.
  • Вопрос задан
  • 893 просмотра
Решения вопроса 2
qonand
@qonand
Software Engineer
используйте для этого какой-нибудь визард форм, например этот или посмотрите в сторону вот этого js-плагина
Ответ написан
Комментировать
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Вы пытаетесь решить на backend то чем должен заниматься frontend. Это обычный wizard форм. Есть куча jquery скриптов. И когда выберете один из них - тогда уже имея его логику работы, подгоните логику backend.
Причем форма может быть 1. А ее поля разбиты просто на два таба. Просто к 1 модели добавляете публичное свойство или свойства. И в afterSave разруливаете сохранение связанных данных.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@myphpscript
Как вариант, можно создать класс (от yii\base\Model) со всеми нужными полями, на каждый шаг сделать сценарий с правилами валидации. В контроллере указываем нужный сценарий, делаем проверку, если ок сохраняем модель в сессию и выводим следующую форму. В след. шаге берем из сессии форму и делаем тоже самое. Можно без проблем вернуться к предыдущему шагу, введенные ранее данные будет загружены. На последнем делаем $model->save(), в котором сохраняем данные во все нужные таблицы. Обернуть в транзакцию лишнем не будет.
Ответ написан
Комментировать
sanchezzzhak
@sanchezzzhak
Ля ля ля...
самый простой вариант это PJAX

Делаете все также как и без ajax
выводите форму 1
отправили форму 1
отобразили результата в виде формы если ошибка то показываете форму 1 итд.

В нужном месте между формой ставите
Pjax::begin
форма
Pjax::end
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы