Как при включенной enableAjaxValidation избежать автосохранения формы?

В некоторых формах проекта (в 12 из 40) при создании или редактировании в одном/двух/трёх полях стоит серверная валидация, т.к. нужно проверять уникальность поля или связки. Поэтому стоит enableAjaxValidation. Валидация происходит при потере фокуса, при изменении значения в поле и при клике на кнопку сохранить. При этом, как только последнее поле в форме будет заполнено, конечно сработает ajaxValidation и форма на сервере сохранится и произойдёт редирект при успешности операции. Такое поведения меня не устраивает.

Я хочу: Оставить валидацию "на лету", т.е. сохранить и не трогать опции validateOnChange = true и validateOnBlur = true, но при этом, чтобы само сохранение уже всей корректной формы происходило только при нажатии на кнопку "Сохранить", т.е. onSubmit. Как это сделать? Что предусмотреть? В какую сторону копать? Таких методов будет много (12 форм с create/update методами)


Ответы (2 шт):

Автор решения: Михаил Динов

Ой как знакомо)))))))))))

В какую сторону копать?

Копай в контроллере.

У тебя смотри что происходит:

  • Ты такой себе заполняешь форму и на сервер летают запросики аяксовые
  • НООООО, когда у тебя нет ошибок валидации, ajax запрос не возвращает пустой массив с ошибками, а действия контроллера выполняются дальше
  • В итоге у тебя далее загружается модель постом, проходит валидацию и сохраняется, ну и редирект там дальше идет)))

Поправь аякс валидацию, чтобы ответ от аяксов был всегда, даже если ошибок нет и все заработает как ты хочешь)

→ Ссылка
Автор решения: UKRman

Кароч... создаём одєльный екшен для 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'])
       ...

   ]
);

Всьо...

→ Ссылка