Activeform Ajax Submit

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
at13
Сообщения: 9
Зарегистрирован: 2014.11.07, 13:29

Activeform Ajax Submit

Сообщение at13 »

Как отправить данные формы с помощью Ajax?

Пожалуйста, поделитесь нормальным примером для ActiveForm
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Activeform Ajax Submit

Сообщение Insolita »

Я все таки своими скриптами сабмиты делаю, еще с альфа-версий, и к релизу так никаких существенных изменеий пользоваться ивентами ActiveForm не заметила.
форма

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

<?php
$form = ActiveForm::begin(
        [
            'id' => 'modalform',
             'enableClientValidation' => true, 
             'enableAjaxValidation' => false,
            'action' => ($model->isNewRecord
                ? \yii\helpers\Url::to(['create'])
                : \yii\helpers\Url::to(
                    ['update', 'id' => $model->{$model->getPk()}]
                ))
        ]
    );
    echo $form->errorSummary([$model]);
    ?>
    <div id="resp_success" style="display: none" class="alert alert-success"></div>
    <div id="resp_error" class="alert alert-danger" style="display: none"></div>
    <?= $form->field($model, 'field1')->textInput() ?>
    <?= $form->field($model, 'field2')->textInput() ?>
    <div class="form-group">
        <span class="pull-right">
                    <?= Html::a(Yii::t('backend', 'Cancel'),['index'],
                        [
                            'class' => 'btn btn-danger close_modal',
                            'id' => 'cancelmodal' 
                        ]
                    ) ?></span>
        <?= Html::submitButton(
            $model->isNewRecord ? Yii::t('backend', 'Create') : Yii::t('backend', 'Update'),
            [
                'class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary',
                'id' => 'dirsubmit_' . ($model->isNewRecord ? 'addmodal' : 'updmodal')
            ]
        ) ?>
    </div>
    <?php ActiveForm::end(); ?>
Js (ну на самом деле это все виджетом универсально подключается)

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

$(document).on('click','#dirsubmit_addmodal',function (e) {
		e.preventDefault(); 
		$('#resp_success').hide();
		$('#resp_error').hide();
                var form=$(this).closest('form');$.post(form.attr('action'),form.serialize(),
                         function(resp){
                               if(resp.state==true){
                                   jQuery('#resp_error').hide();
                                   $('#resp_success').html('OK! Добавляйте следующее!').show();
                                   form.trigger('reset');
                                   $.pjax.reload({'container':'#GRID_PJAX_SELECTOR'});
                               }else{
                                   jQuery('#resp_success').hide(); 
                                   jQuery('#resp_error').html(resp.error).show();
                               }
                        });
});
$(document).on('click','#dirsubmit_updmodal',function (e) {
		e.preventDefault(); 
		$('#resp_success').hide();
		$('#resp_error').hide();
                var form=$(this).closest('form');
                $.post(form.attr('action'),form.serialize(),
                         function(resp){
                               if(resp.state==true){
                                   jQuery('#resp_error').hide();
                                   $.themodal.close();
                               }else{
                                   jQuery('#resp_success').hide(); jQuery('#resp_error').html(resp.error).show();
                               }
                        });
});
Экшн создания

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

class CreateAction extends Action
{
    /**
     * @var \yii\db\ActiveRecord $modelClass
     */
    public $modelClass;
    /**
     * @var \yii\web\Controller the controller that owns this action
     */
    public $controller;

    public function init()
    {
        if ($this->modelClass === null) {
            throw new InvalidConfigException('"modelClass" cannot be empty.');
        }
        parent::init();
    }

    /**
     * @inheritdoc
     * @throws \yii\web\BadRequestHttpException
     */
    public function run()
    {
        $model = new $this->modelClass;
        $model->scenario = 'create';
        if (Yii::$app->request->isPost) {
            Yii::$app->response->format = (Yii::$app->request->isAjax) ? Response::FORMAT_JSON : Response::FORMAT_HTML;
            if ($model->load(Yii::$app->request->post()) && $model->save()) {
                return (Yii::$app->request->isAjax)
                    ? ['state' => true, 'error' => '']
                    : $this->controller->redirect(
                        Url::to(['index'])
                    );
            } else {
                return (Yii::$app->request->isAjax) ? ['state' => false, 'error' => Helper::errorSummary($model)]
                    : $this->controller->render('create', ['model' => $model]);
            }
        } elseif (Yii::$app->request->isAjax) {
            return $this->controller->renderAjax('_form', ['model' => $model]);
        } else {
            return $this->controller->render('create', ['model' => $model]);
        }
    }
} 
 
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Activeform Ajax Submit

Сообщение futbolim »

Интересная у Вас логика работы скрипта ;)

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

if (Yii::$app->request->isPost) {...} 
elseif (Yii::$app->request->isAjax) {...}
 
german.igortcev
Сообщения: 251
Зарегистрирован: 2014.08.18, 14:01

Re: Activeform Ajax Submit

Сообщение german.igortcev »

Можно через onclick

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

'class' => 'btn btn-danger',
            'onclick' => "
               $.ajax({
                 url: \"/group/default/empty\",
                 type: \"post\",
                 data: {lesson_id : 1},
                 success: function(response) {
                 
                      window.location.reload(true);


                    }

                });"
 
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Activeform Ajax Submit

Сообщение chungachguk »

PJAX'ом никто не пользуется? А то я что не пойму по какому принципу рендерится представление в контроллере
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Activeform Ajax Submit

Сообщение Insolita »

futbolim писал(а):Интересная у Вас логика работы скрипта ;)

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

if (Yii::$app->request->isPost) {...} 
elseif (Yii::$app->request->isAjax) {...}
 
это кусок из проекта, где формы могут отображаться и как модальные с аякс-сабмитом, и как обычные страницы в зависимости от настроек
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Activeform Ajax Submit

Сообщение Insolita »

chungachguk писал(а):PJAX'ом никто не пользуется? А то я что не пойму по какому принципу рендерится представление в контроллере
в принципе используется, но не для форм
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Activeform Ajax Submit

Сообщение chungachguk »

Печально. Вот для форм я примеров в инете не находил
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Activeform Ajax Submit

Сообщение futbolim »

Insolita писал(а):
futbolim писал(а):Интересная у Вас логика работы скрипта ;)

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

if (Yii::$app->request->isPost) {...} 
elseif (Yii::$app->request->isAjax) {...}
 
это кусок из проекта, где формы могут отображаться и как модальные с аякс-сабмитом, и как обычные страницы в зависимости от настроек
Я о том, что POST может прилетать посредством AJAX и обычно. Или все программисты команды знают и помнят, что AJAX-ом отправлять ТОЛЬКО GET?
Напоминает это:

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

if($a = 1)
Т.е. страшный кошмар программиста.
На пальцах:

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

if (Yii::$app->request->isPost) {...} // Если сюда прилетит AJAX POST-ом, он попадёт и сюда
elseif (Yii::$app->request->isAjax) {...}  // и сюда
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Activeform Ajax Submit

Сообщение zelenin »

какие вопросы по pjax и формам? пробовал, сделал кое-что
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Activeform Ajax Submit

Сообщение lynicidn »

$a=0
if (!$a){
$a=1
} elseif ($a ===1) {
не сработает, т.к. сработала первая часть if
}
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Activeform Ajax Submit

Сообщение lynicidn »

>Я о том, что POST может прилетать посредством AJAX и обычно. Или все программисты команды знают и помнят, что AJAX-ом отправлять ТОЛЬКО GET?
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Activeform Ajax Submit

Сообщение Insolita »

futbolim писал(а):
Я о том, что POST может прилетать посредством AJAX и обычно. Или все программисты команды знают и помнят, что AJAX-ом отправлять ТОЛЬКО GET?
почему аяксом отправлять только гет - если запрос идёт POST он всегда попадает в первую ветку условия - не зависимо аякс или нет, и в ней учитываются оба варианта, дальше то код посмотрите

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

if (Yii::$app->request->isPost) {
            Yii::$app->response->format = (Yii::$app->request->isAjax) ? Response::FORMAT_JSON : Response::FORMAT_HTML;
            ...
             
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Activeform Ajax Submit

Сообщение chungachguk »

zelenin писал(а):какие вопросы по pjax и формам? пробовал, сделал кое-что
В общем было что-то типа такого.
Есть контроллер, в нём action в конце которого было обычное $this->render('page'). Делаю запрос на этот action и рендерится представление в котором было, что-то типа

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

Pjax::begin();
// Вывод ActiveForm
Pjax::end();
 
Форма соответственно отправляет запрос на этот же самый action. В консоли браузера отправка такого запроса присутствовала и ajax срабатывал. Так вот в этом action было условие

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

if (Yii::$app->request->isPjax) {
    $this->render('page_ajax');
} else {
    $this->render('page');
}
 
Так вот. Условие срабатывало, но рендерилось представление page, а не page_ajax. И тут возник вопрос почему собственно так? И получается, что pjax обновил всю страницу, а не ту часть, где выводится форма. Возможно мне стоило сделать $this->renderAjax('page_ajax')? Я извиняюсь, что готового кода нет, потому пишу и домысливаю по памяти.
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Activeform Ajax Submit

Сообщение Insolita »

стоило сделать $this->renderAjax('page_ajax')
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Activeform Ajax Submit

Сообщение chungachguk »

Insolita писал(а):стоило сделать $this->renderAjax('page_ajax')
Да? Спасибо. Надо будет не забыть. А то проникся магией yii2 и кажется, что даже в таком месте он уже за меня всё решил как надо :D
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Activeform Ajax Submit

Сообщение Insolita »

метод render - рендерит вьюху со всеми скриптами и лейаутами
метод renderPartial - рендерит вьюху as is, метод renderAjax - промежуточный вариант рендерит вьюху без лейаута, но при этом подрубает css и скрипты. Просто проведите эксперимент - возьмите любой ваш экшн - и поменяйте render\renderAjax\renderPartial и сравните результаты, если в исходниках разбираться лень Хотя к теме это конечно не относится. еще зависит от того что в самом вашем page_ajax и еще иногда таймаут советуют ставить в настройках Pjax - это все-таки к тме pjax а не сабмит наверное
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Activeform Ajax Submit

Сообщение chungachguk »

Кстати, попробовал. В контроллере обычный render, никаких изменений для обработки Ajax и вроде бы всё нормально рендерится. Т.е. при ajax запросе обновляется только сама форма, а не вся страница. Интересное кино
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Activeform Ajax Submit

Сообщение Insolita »

https://github.com/yiisoft/yii2/blob/ma ... ax.php#L92 таки виджет чистит дополнительно страницу... значит если не всегда отрабатывает - таймаут увеличить-поставить
Последний раз редактировалось Insolita 2014.11.21, 18:30, всего редактировалось 1 раз.
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Activeform Ajax Submit

Сообщение chungachguk »

Не понял, что за дополнительная страница?
Ответить