Проверка YJ2 AJAX модели ActiveForm
Когда мы настраиваем проверку Ajax для ActiveForm (для всей формы), мы можем столкнуться с трудностями при проверке ввода, когда наша модель выглядит следующим образом:
[['file'],'file','skipOnEmpty'=>false,'extensions'=>['jpg', 'png', 'jpeg', 'pdf'],'checkExtensionByMimeType'=>false,'maxSize' => 1024 * 1024 * 2,'message'=>'Wrong format'],
Не рекомендуется использовать AJAX для всей формы, когда у нас есть файл ввода.
В этой конкретной ситуации AJAX вернет ошибку при проверке, даже если наш файл выбран правильно. Способ сделать это правильно я опишу в ответе.
ПРИМЕЧАНИЕ. Это решение не использует внешний виджет, например, yii2-widget-fileinput, например, стандартный ввод файла Yii2 в ActiveForm.
1 ответ
Я постараюсь описать этот процесс в самом простом виде.
Сначала нам нужно решить, какие поля мы будем проверять на стороне клиента (здесь нам не нужен ajax) и на стороне сервера (здесь идет ajax).
Проверку AJAX мы будем использовать в основном для уникальных полей, таких как логин / адрес электронной почты. Другие поля проверки на стороне клиента достаточно.
Активный С:
<?php
$form = ActiveForm::begin(
[
'id' => 'form-signup',
'options' => ['encytype' => 'multipart/form-data'],
'validateOnBlur' => false,
'enableClientValidation' => true,
'validationUrl' => Url::toRoute('customer/validation')
]
);
?>
validationUrl -> URL для действия в контроллере, в моем случае это CustomerController и actionValidation.
В контроллере:
public function actionValidation() {
$model = new Customer();
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = 'json';
return ActiveForm::validate($model);
}
}
Поле в форме, которое нам действительно нужно проверить с помощью AJAX
<?= $form->field($model, 'email', ['enableAjaxValidation' => true])->textInput(['maxlength' => true]) ?>