Abr_ya
@Abr_ya

Yii2 как в контроллере понять, что в форме нажата кнопка Save?

Поднимаю модалку, рендерю в ней часть формы, отвечающую за апдейт.
Не могу разобраться с адекватным поведением в модалке: когда валидировать, когда сохранять, когда закрывать модалку?
Аякс включил, валидацию и включал, и выключал, сейчас не об этом, как мне кажется.
Вопрос: как мне в контроллере проверить, что была нажата кнопка Save в форме?
Мне кажется, это бы упростило всё, примерно так:
if (нажали save) {
    if (валидация успешна) {
        пишем данные, закрываем модалку
    } else {
        выводим результат валидации (рендерим аякс? или встроенная валидация?)
    }
} else {
    тут просто валидация, например
}

Или не туда копаю?

UPD:
Всем спасибо за помощь! Судя по всему, действительно не туда меня повело. У меня контроллер написан так, что форма начала вести себя именно так, как мне хотелось бы, когда я убрал из её бегина вот этот параметр:
'enableAjaxValidation' => true,
Как оказалось, это совершенно не мешает встроенной валидации "на лету" от фреймворка!
  • Вопрос задан
  • 394 просмотра
Решения вопроса 1
myks92
@myks92 Куратор тега Yii
Нашёл решение — пометь вопрос ответом!
1. Кнопка Save тут ни причем.

2. У модели есть 2 метода $model->save() и $model->validate()
$model->save() - сохраняет и валидирует
$model->validate() - только валидирует данные.

У вас должно быть немного иначе:
if ($model->validate()) {
        ///здесь ваш код
        $model->save()
        пишем данные, закрываем модалку
    } else {
        выводим результат валидации (рендерим аякс? или встроенная валидация?)
    }
}


С загрузкой данных из формы
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
///code
   $model->save()
}


Валидацию вы выбираете сами. Я думаю, что простые правила валидации валидируются ajax. А сложные уже после нажатия кнопки и запроса на сервер. Например, длину текста валидируем на клиенте. А сложную логику после запроса

Вопрос: как мне в контроллере проверить, что была нажата кнопка Save в форме?

Зачем вам проверять нажата ли кнопка? Это вопрос JS. А в контроллере вы смотрите на переданные данные из формы. Если они есть, то вы их обрабатываете. Если их нет, то вы показываете форму.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
YekitKsv
@YekitKsv
Developer
Вот так
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
   // you code
}
Ответ написан
Комментировать
serginhold
@serginhold
данные post запросом сохраняются, по этому обычно в контролере пишут:
if ($request->isPost()) {}

ну или проверить передачу значения:
if ($request->post($имяКнопки)) {}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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