Как при включенной enableAjaxValidation избежать автосохранения формы?
В некоторых формах проекта (в 12 из 40) при создании или редактировании в одном/двух/трёх полях стоит серверная валидация, т.к. нужно проверять уникальность поля или связки. Поэтому стоит enableAjaxValidation. Валидация происходит при потере фокуса, при изменении значения в поле и при клике на кнопку сохранить. При этом, как только последнее поле в форме будет заполнено, конечно сработает ajaxValidation и форма на сервере сохранится и произойдёт редирект при успешности операции. Такое поведения меня не устраивает.
Я хочу: Оставить валидацию "на лету", т.е. сохранить и не трогать опции validateOnChange = true и validateOnBlur = true, но при этом, чтобы само сохранение уже всей корректной формы происходило только при нажатии на кнопку "Сохранить", т.е. onSubmit. Как это сделать? Что предусмотреть? В какую сторону копать? Таких методов будет много (12 форм с create/update методами)
Ответы (2 шт):
Ой как знакомо)))))))))))
В какую сторону копать?
Копай в контроллере.
У тебя смотри что происходит:
- Ты такой себе заполняешь форму и на сервер летают запросики аяксовые
- НООООО, когда у тебя нет ошибок валидации, ajax запрос не возвращает пустой массив с ошибками, а действия контроллера выполняются дальше
- В итоге у тебя далее загружается модель постом, проходит валидацию и сохраняется, ну и редирект там дальше идет)))
Поправь аякс валидацию, чтобы ответ от аяксов был всегда, даже если ошибок нет и все заработает как ты хочешь)
Кароч... создаём одєльный екшен для ajax валидацыи:
class MyController extends Controller
{
...
public function actionAjaxValidate()
{
Yii::$app->response->format = Response::FORMAT_JSON;
$form = new MyForm(); //or ActiveRecord model
if (Yii::$app->request->isAjax && $form->load(Yii::$app->request->post())) {
return ActiveForm::validate($form);
}
}
...
}
И дальше изи - на своей форме во view додаём роут куда должна лететь валидация
$form = ActiveForm::begin(
[
...
'validationUrl' => Url::to(['my/ajax-validate'])
...
]
);
Всьо...