Вывод ошибок модели в ajax response

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Drugpunker
Сообщения: 187
Зарегистрирован: 2014.08.13, 19:44

Вывод ошибок модели в ajax response

Сообщение Drugpunker »

Здравствуйте.
Воюю с ajax.
Он пока побеждает.

Хочу выводить модальное окно при запросе на смену email.
Идея такова.
Юзер вводит в форму новый email.
Эта строка проходит валидацию и записывается в базу, а клиенту улетает письмо с get урлом.
И после отправки должно выводиться модальное окно, мол запрос отправлен, глянь свою новую почту.

Поэтому, в форме, пришлось отказаться от

Код: Выделить всё

'enableAjaxValidation' => true,
, чтобы ловить response.
Response нужен, чтобы выводить ошибки валидации (например) нового email.

Делаю так:

Код: Выделить всё

$('#form').on('beforeSubmit', function () {
$.ajax({
            type: form.attr('method'),
            url: form.attr('action'),
            data: form.serializeArray(),
            success: function (data) {
                if (data.error === true) {
                //Здесь должны выводиться ошибки, если есть
                    $('.invalid-feedback').text(data.text);
                } else {
                //Это модальное окно
                    form.siblings('#feedback').show();
                }
            },
            error: function () {
                alert('Возникла неизвестная ошибка');
            },
            })
В контроллере:

Код: Выделить всё

if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = Response::FORMAT_JSON;

            if ($model->load(Yii::$app->request->post())) {

                if($model->validate()) {
                    if ($res = $model->changeEmail()) {
                        return [
                            'text' => $res,
                            'error' => false,
                        ];
                    }
                } else {
                    return [
                        'text' => $model->errors,
                        'error' => true,
                    ];
                }
            }

        }
Так вот ошибки эти выводятся как [object Object]
Оно и понятно, массив же.
Json::encode($model->errors) не помогает, ибо вывод выполняется так:
{"email":["Необходимо ввести новый Email"]}.

А как вывести ошибку именно строкой?
Вернее, как вывести ошибку, добавленную именно строкой, в контроллере?
Давно задавался этим вопросом, но постоянно удавалось обойти его, воспользовавшись иным решением.
А тут уже не отвертеться :)

Если изобретаю велосипед, подскажите пжл что почитать.
Может быть уже существует готовое решение.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вывод ошибок модели в ajax response

Сообщение Dominus »

JS:

Код: Выделить всё

let form = $('#form'),
    invalidFeedback = $('.invalid-feedback'),
    errorMsg,
    values;

form.on('beforeSubmit', function () {      
    errorMsg = '';    
    invalidFeedback.text(errorMsg);
    
    $.ajax({
        type: form.attr('method'),
        url: form.attr('action'),
        data: form.serializeArray(),
        success: function (data) {            
            if (data.error === true) {
                //Здесь должны выводиться ошибки, если есть               
                values = Object.values(data.text);                
                values.forEach(function(item) {                    
                     errorMsg += item + '<br>';
                });                
                invalidFeedback.html(errorMsg);
            } else {                
                //Это модальное окно
                form.siblings('#feedback').show();
                //console.log(data.text);
            }
        },
        error: function () {
            alert('Возникла неизвестная ошибка');
        }
    });
    
    return false;
});
View:

Код: Выделить всё

<div class="invalid-feedback"></div>
<?php $form = ActiveForm::begin([
    'id' => 'form',
    'enableClientValidation' => false,
]); ?>

    <?= $form->field($model, 'name')->textInput(['class' => 'form-control']) ?>

    <?= $form->field($model, 'email')->textInput(['class' => 'form-control']) ?>

    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'form-button']) ?>
    </div>
<?php ActiveForm::end(); ?>
Controller:

Код: Выделить всё

public function actionIndex()
    {
        $model = new Form();
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = Response::FORMAT_JSON;
            if ($model->load(Yii::$app->request->post())) {
                if ($model->validate()) {
                    return [
                        'text' => 'Форма успешно обработана!',
                        'error' => false,
                    ];
                }
                return [
                    'text' => $model->errors,
                    'error' => true,
                ];
            }
        }
        return $this->render('index', ['model' => $model]);
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Drugpunker
Сообщения: 187
Зарегистрирован: 2014.08.13, 19:44

Re: Вывод ошибок модели в ajax response

Сообщение Drugpunker »

Dominus писал(а): 2020.08.04, 00:23 JS:

Код: Выделить всё

let form = $('#form'),
    invalidFeedback = $('.invalid-feedback'),
    errorMsg,
    values;

form.on('beforeSubmit', function () {      
    errorMsg = '';    
    invalidFeedback.text(errorMsg);
    
    $.ajax({
        type: form.attr('method'),
        url: form.attr('action'),
        data: form.serializeArray(),
        success: function (data) {            
            if (data.error === true) {
                //Здесь должны выводиться ошибки, если есть               
                values = Object.values(data.text);                
                values.forEach(function(item) {                    
                     errorMsg += item + '<br>';
                });                
                invalidFeedback.html(errorMsg);
            } else {                
                //Это модальное окно
                form.siblings('#feedback').show();
                //console.log(data.text);
            }
        },
        error: function () {
            alert('Возникла неизвестная ошибка');
        }
    });
    
    return false;
});
View:

Код: Выделить всё

<div class="invalid-feedback"></div>
<?php $form = ActiveForm::begin([
    'id' => 'form',
    'enableClientValidation' => false,
]); ?>

    <?= $form->field($model, 'name')->textInput(['class' => 'form-control']) ?>

    <?= $form->field($model, 'email')->textInput(['class' => 'form-control']) ?>

    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'form-button']) ?>
    </div>
<?php ActiveForm::end(); ?>
Controller:

Код: Выделить всё

public function actionIndex()
    {
        $model = new Form();
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = Response::FORMAT_JSON;
            if ($model->load(Yii::$app->request->post())) {
                if ($model->validate()) {
                    return [
                        'text' => 'Форма успешно обработана!',
                        'error' => false,
                    ];
                }
                return [
                    'text' => $model->errors,
                    'error' => true,
                ];
            }
        }
        return $this->render('index', ['model' => $model]);
    }
Спасибо.
То что нужно.
Буду знать.
Ответить