Yii 2 не парсится модель при отправке через AJAX

105
21 марта 2021, 18:50

Есть такая модель:

namespace app\models;    
use yii\base\Model;    
class AjaxTest extends Model
{
    public $text;    
}

Есть действие контроллера, которое формирунет страницу с формой:

public function actionIndex()
{
    return $this->render('index',['model'=> new AjaxTest()]);
}

Сама форма:

<?php
$form = \yii\widgets\ActiveForm::begin([
    'id' => 'form',
    'action' => '/man/test',
    'enableAjaxValidation' => false,
    'validationUrl' => 'my-validation-url'
]);
?>
<?= $form->field($model, 'text')->textInput(); ?>
<?= Html::submitButton('Save'); ?>
<?php $form->end(); ?>

Есть отправка формы через AJAX на JS:

$(document).ready(function() {
    $('#form').on('beforeSubmit', function () {
        var $yiiform = $(this);
        // отправляем данные на сервер
        $.ajax({
                type: $yiiform.attr('method'),
                url: $yiiform.attr('action'),
                data: $yiiform.serializeArray()
            }
        )
        .done(function(data) {
           if(data.success) {
              // данные сохранены
            } else {
              // сервер вернул ошибку и не сохранил наши данные
            }
        })
        .fail(function () {
             // не удалось выполнить запрос к серверу
        })
        return false; // отменяем отправку данных формы
    })
})

Есть действие контроллера, которое принимает данные формы по AJAX^

public function actionTest()
{
    $model = new AjaxTest();
    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    if (Yii::$app->request->isAjax) {            
        $data = Yii::$app->request->post();            
        if ($model->load($data)) {
            return [
                "data" => $model->text,
                "error" => null
            ];
        } else {
            return [
                "data" => null,
                "error" => "error1"
            ];
        }
    }else{
        return [
            "data" => null,
            "error" => "error2"
        ];
    }
}

Данные приходят:

{ "_csrf":"BvO32H7Bg1m8swSJQgMvbUQt3SMMXHMmJzgp8sSjXlN1nYaJOLnNKfr0Xrp0dxwjMFrofGspP3VWYHqErus9IA==", "AjaxTest":{"text":"123"} }

Вопрос

Если всё отправляется и приходит, то почему $model->text всегда null (хотя должен быть "123")? Что я делаю не так?

Answer 1

Как оказалось, ларчик просто открывался. Нужно было прописать rules для единственного поля модели, чтобы всё заработало.

class AjaxTest extends Model
{
    public $text;
    public function rules()
    {
        return [
            [
                [
                    'text'
                ],
                'string'
            ]
        ];
    }
}

P.S. Спасибо fedornabilkin за подсказку.

READ ALSO
Не выводятся данные с компонента 1C-Bitrix

Не выводятся данные с компонента 1C-Bitrix

Пишу свой компонент для вывода номеров телефонов, адресов и разных ссылок! То-есть всего у меня добавлено 3 поля

90
Как убрать бэкслэши из ответа json

Как убрать бэкслэши из ответа json

Мне нужно получить ссылку на аватарку пользователя ,через ответ jsonОтвет выглядит примерно так

107
Java Logger (java.util.logging)

Java Logger (java.util.logging)

Мой лог выводиться в таком виде:

104
Как лучше найти и вывести одинаковые элементы из двух списков?

Как лучше найти и вывести одинаковые элементы из двух списков?

Дано два списка строками с целыми числами через пробелНеобходимо вывести уникальные элементы(1 раз - 1 элемент), которые присутствуют и в первом...

88