ajax \ pjax получение данных, валидация, сохранение

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

ajax \ pjax получение данных, валидация, сохранение

Сообщение n.osenni »

На странице есть форма. На submit висит js: при сабмите данные отправляются экшену actionAddNewPeople в котроллере SiteController по адресу - /site/add-new-people

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

jQuery('#peoples_form').submit(function (e) {
    e.preventDefault();
    var peopleModel=$(this).serialize();

    aj('/site/add-new-people', {'peopleModel': peopleModel}, s_success); //ajax
});

function s_success(result) {
    console.log(result);
}

function aj(url1, data, success, async='false', datatype='html') {
    $.ajax({
        type: "POST",
        url: url1,
        async: async,
        timeout: 20000,
        dataType: datatype,
        data: data,
        success: success,
        error: function(err){console.log(err);}
    });
}
На стороне php пытаюсь принять данные и сохранить их в бд, но данные не принимаются моделью People, т.к. (подозреваю) находятся в непригодном виде - в виде строки, а нужно в виде массива. Точнее в базу ничего не добавляется. А модель не выкидывает никаких предупреждений. Строка, которая приходит в виде одного единственного значения массива peopleModel представлена ниже. Пробовал urldecode и json_decode - без результата (ожидаемо).

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

_csrf=vk2P3oAnKy855oOydhIt_xcX6ZFuHp1t3AJkGg9eFTlv3-2I0kuToH7bBm3V32uvZFnLhu8-UCkp99pmEv7qug%3D%3D&People%5Bsurname%5D=111&People%5Bfirst_name%5D=&People%5Bmiddle_name%5D=&People%5Bbirth_year%5D=121&People%5Bissue_date%5D=&People%5Bissued_by%5D=&People%5Bpassport_number%5D=111&People%5Bregistration%5D=&People%5Bgender%5D=111&People%5Bclient_note%5D=
Если на стороне js сделать не просто serialize(), а serializeArray(), то данные летят в виде массива, но всё равно не в том виде, в котором нужно. Да, их можно перекрутить, но нет разве более элегантного решения?

Экшн выглядит вот так

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

use yii\web\NotFoundHttpException;

public function actionAddNewPeople()
{
    if (!Yii::$app->request->isAjax) throw new NotFoundHttpException();

    try {
        $peopleModel=new People();
        $peopleModel->load(Yii::$app->request->post('peopleModel'));
        //$peopleModel->validate();
        $peopleModel->save();
    } catch (Exception $e){
        throw new NotFoundHttpException();
    }

    return true;
}
Так как все же правильно принять данные из формы по ajax, провалидировать, выкинуть исключения, если нужно, записать данные в бд? Что нужно первей - $peopleModel->load(данные Post) или $peopleModel->validate(данные Post). И как вообще тут быть?

Смотрел в сторону использования pjax (если обернуть форму тегами Pjax::begin(); и Pjax::end();), но как бы тогда выглядел action контроллера с валидацией полученных данных и т.п?
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: ajax \ pjax получение данных, валидация, сохранение

Сообщение yiijeka »

между прочим AcviteForm это всё делает автоматически

В вашем случае $peopleModel->load не срабатывает, из за того, что ожидаются данные вида

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

['People["attribute1"]'=>123, 'People["attribute2"]'=>321...]
и ещё возможно вам нужно использовать json парсер http://www.yiiframework.com/doc-2.0/yii ... arser.html

http://www.yiiframework.ru/forum/viewtopic.php?t=31366
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: ajax \ pjax получение данных, валидация, сохранение

Сообщение someweb »

serializeArray() и
http://www.yiiframework.com/doc-2.0/yii ... d()-detail
load() gets the 'FormName' from the model's formName() method (which you may override), unless the $formName parameter is given. If the form name is empty, load() populates the model with the whole of $data, instead of $data['FormName']
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
n.osenni
Сообщения: 14
Зарегистрирован: 2017.08.17, 01:19

Re: ajax \ pjax получение данных, валидация, сохранение

Сообщение n.osenni »

yiijeka писал(а): 2017.08.17, 08:11 между прочим AcviteForm это всё делает автоматически
что именно делает он автоматически?

Я готов перекрутить всю логику, только подскажите, как сделать всё это проще и удобнее.
Ответить