Ajax submit ActiveForm

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Ajax submit ActiveForm

Сообщение 6pblcb »

Не получается разобраться, как сделать ajax submit ActiveForm, с enableClientValidation = true (и всеми остальными дефолтными параметрами).

Укажите плз направление или дайте пример кода (:
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Re: Ajax submit ActiveForm

Сообщение 6pblcb »

Можно было бы сделать по простому, через beforeSubmit, если бы функция вызывалась не тут.

Т.е. ИМХО - сейчас вызов функции не в том месте. Нужно, перенести вот сюда:

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

if (data.validated) {
    if (data.settings.beforeSubmit != undefined) {
        return data.settings.beforeSubmit($form);
    }
    // continue submitting the form since validation passes
    return true;
}
 
потому что по факту, submit формы происходит именно там, только когда форма валидна.

Такая перестановка позволит написать подобное:

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

<?php $form = ActiveForm::begin([
            'beforeSubmit' => new \yii\web\JsExpression('function(form) {
                jQuery.ajax({
                    url: "'. $this->context->createUrl('create') .'",
                    type: "POST",
                    dataType: "json",
                    data: form.serialize(),
                    success: function(response) {
                        ...
                    },
                    error: function(response) {
                        ...
                    }
                });
                return false;
            }')
        ]); 
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Re: Ajax submit ActiveForm

Сообщение 6pblcb »

Хотя это не решает в полной мере первоначального вопроса.

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

if (data.validated) {
    data.validated = false; // Нужны еще 2 строки, для сохранения clientSide валидации
    data.submitting = false;
    if (data.settings.beforeSubmit != undefined) {
        return data.settings.beforeSubmit($form);
    }
    // continue submitting the form since validation passes
    return true;
}
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Re: Ajax submit ActiveForm

Сообщение 6pblcb »

YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Ajax submit ActiveForm

Сообщение maleks »

можете показать текущий рабочий код для аякс сабмита формы?
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Re: Ajax submit ActiveForm

Сообщение 6pblcb »

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

<?php $form = ActiveForm::begin([
            'beforeSubmit' => new \yii\web\JsExpression('
            function(form) {
                jQuery.ajax({
                    url: "'. $this->context->createUrl('create') .'",
                    type: "POST",
                    dataType: "json",
                    data: form.serialize(),
                    success: function(response) {
                        console.log(response);
                    },
                    error: function(response) {
                        console.log(response);
                    }
                });
                return false;
            }')
        ]);
 
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Ajax submit ActiveForm

Сообщение maleks »

спасибо, пригодится.
rus72ru
Сообщения: 27
Зарегистрирован: 2013.12.06, 14:03

Re: Ajax submit ActiveForm

Сообщение rus72ru »

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

    'beforeSubmit' => new \yii\web\JsExpression('
            function(form) {
                jQuery.ajax({
                    url: "'. Yii::$app->UrlManager->createUrl('post/create') .'",
                    type: "POST",
                    dataType: "json",
                    data: form.serialize(),
                    success: function(response) {
                        alert(response.post-id_user);
                        console.log(response);
                    },
                    error: function(response) {
                        //console.log(response);
                    }
                });
                return false;
            }') 

выдает ошибку Uncaught ReferenceError: id_user is not defined
хотя ответ приходит такой в response

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

{"post-id_user":["User cannot be blank."],"post-title":["\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a cannot be blank."],"post-text":["\u0422\u0435\u043a\u0441\u0442 cannot be blank."],"post-category":["\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f cannot be blank."]} 
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Re: Ajax submit ActiveForm

Сообщение 6pblcb »

response['post-id_user']
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
ORey
Сообщения: 19
Зарегистрирован: 2013.07.30, 14:29

Re: Ajax submit ActiveForm

Сообщение ORey »

К слову, beforeSubmit не сработает в случае отсутствия клиентской валидации.

Тикет создал, а пока можно либо грубо хакнуть ActiveForm, либо в скрипте отлавливать присутствие объекта yii.activeForm и в случае отсутствия такового - перевешиваться на .on('submit').
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Re: Ajax submit ActiveForm

Сообщение 6pblcb »

Вообще я "за" custom event. Ещё бы PR кто ни будь запили на всё это дело ;)
ps: есть ещё вот такой issue
ps2: нет ни какой сложности перехватить submit если clientValidation = false. Для меня, вполне нормальное поведение когда мы изменяем одно, другое тоже нужно изменить. Имхо это просто не самый удачный пример. А вообще ещё раз повторюсь я всецело "за" custom event. Вообще не люблю мешанину из php и js.
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
ORey
Сообщения: 19
Зарегистрирован: 2013.07.30, 14:29

Re: Ajax submit ActiveForm

Сообщение ORey »

6pblcb писал(а):ps2: нет ни какой сложности перехватить submit если clientValidation = false. Для меня, вполне нормальное поведение когда мы изменяем одно, другое тоже нужно изменить
На самом деле это жесть.

Дело тут вот в чем: если клиентская валидация присутствует (хотя бы одно поле требует валидации) - то к onsubmit прицепиться просто так не получится: на этом событии валидация висит. Ок, цепляемся к beforeSubmit и благополучно забываем про это.

Через некоторое время кто-нибудь слегка меняет правила валидации модели таким образом, что на клиенте ничего больше не валидируется.
Засада в том, что в этом случае скрипты activeform ВООБЩЕ не будут созданы, соответственно событие beforeSubmit некому будет озвучить.
Вот таким нехитрым способом, поменяв серверную валидацию модели, мы ломаем клиентский интерфейс.

Варианты обхода:
- вешаться на onsubmit, но предварительно проверять наличие activeForm и ее свойства validated.
- проверять наличие activeForm и вешаться либо на onsubmit, либо на beforeSubmit, в зависимости.
- побузить в гитхабе и выпросить возможность рендерить скрипты activeform при наличии обработчиков событий. Мой тикет подвис в under discussion, я как-то не очень понимаю, что это значит.

Что касается мешанины из php и js - я ее тоже не люблю, но в случае с обработчиками - достаточно написать что-то вроде 'beforeSubmit' => 'myHandler', и нет никакой мешанины. Function myHandler() соответственно определить уже в обычном блоке script.
Аватара пользователя
mistbow
Сообщения: 64
Зарегистрирован: 2013.11.05, 20:26
Контактная информация:

Re: Ajax submit ActiveForm

Сообщение mistbow »

А нельзя все-таки нативно это все сделать? Зачем еще js код дописывать? Почему fw сам не может скрипт правильно настроить?
MysteryDragon
Сообщения: 4
Зарегистрирован: 2013.06.25, 15:52

Re: Ajax submit ActiveForm

Сообщение MysteryDragon »

Внимание случайно набредших на это обсуждение в пост-релизные времена Yii2 хочу обратить на ссылку о неактульности данного приёма в таком виде:
http://www.yiiframework.ru/forum/viewtopic.php?t=19932

Следует вешать событие на форму через jQuery самостоятельно (описано в анонсе RC-версии).
Ответить