Проверка 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]) ?>
Другие вопросы по тегам