Переопределить POST

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
unknownby
Сообщения: 333
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Переопределить POST

Сообщение unknownby »

Есть форма, при выборе определенных параметров нажимаем "Поиск".
Находятся данные и отображаются через GridView
Определил одно поле как checkbox для выбора конкретных строк в экспорт
Пишу свой экспорт данных в Excel.

После отображения поиска у меня появляется таблица и кнопка

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

$btnExport = Html::a('<i class="glyphicon glyphicon-export"></i> <span class="hidden-md hidden-sm hidden-xs">' . \Yii::t('main', 'button.export') . '</span>', ['multi-export'], [
        'id' => 'btn-multi-exp',
        'class' => 'btn btn-success-dark',
        'data' => [
            'confirm' => \Yii::t('main', 'Are you sure you want to export selected rows?'),
            'method' => 'post',
        ],
        'target' => '_blank',
    ]);
Кнопку вставляю в тулбар

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

'toolbar' => [
                $btnExport,
            ],
Написана JS для отправки через кнопку data-params

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

$js = "
$(document).ready(function(){
    $('#btn-multi-exp').on('click', function(){
        var keyList = $('#my-grid').yiiGridView('getSelectedRows');
        if(keyList != '') {
            var keyOos = ".json_encode($searchModel->myModel->mymodel_id).";
            var keyScope = ".json_encode($searchModel->my_scope).";
            console.log(JSON.stringify({keyList, keyOos, keyScope}));
            $('#btn-multi-exp').attr('data-params', JSON.stringify({keyList, keyOos, keyScope}));
        } else {
            $('#btn-multi-exp').removeAttr('data-params');
        }
    });
});";
Вопрос в том, как передать новые данные, после того, как я первый раз нажал на кнопку.
Получается, что при первой загрузке данных и при первом выделении колонок с нажатием кнопки Экспорт отправляется, например, два идентификатора из грида. Отправляются через POST значения в actionMultiExport.
Если я не перезагружаю страницу (а это не надо), а довыбираю для экспорта еще пару строк из грида, то мой

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

console.log(JSON.stringify({keyList, keyOos, keyScope}));
Показывает, что я выбрал еще пару строк (показано на скриншоте http://prntscr.com/rnrqmm ), однако POST возвращает мне всё равно первые значения, которые были выбраны при первом экспорте (скриншот из дебагера http://prntscr.com/rnrriv )

Со страницы index по кнопке экспорта открываю мульти-экспорт в новом окне, в чем проблема может быть?

azz
Сообщения: 193
Зарегистрирован: 2016.07.06, 17:20

Re: Переопределить POST

Сообщение azz »

А в data-params кнопки точно новые значения записываются? Отдебажте в браузере на вкладке "network", что улетает при первом и втором запросе.

unknownby
Сообщения: 333
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Переопределить POST

Сообщение unknownby »

azz писал(а):
2020.03.29, 02:43
А в data-params кнопки точно новые значения записываются? Отдебажте в браузере на вкладке "network", что улетает при первом и втором запросе.
Вот и нашлась проблема :)
Однако как решить малой кровью? ;)
Получается, что в первый раз прописываются данные в data-params, а дальше они не изменяются, а сохраняются старые данные.
Хотя в логах передаются новые параметры, т.е. не перезаписывается

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

$('#btn-multi-exp').attr('data-params', JSON.stringify({keyList, keyOos, keyScope}));
P.S. Однако лог показывает, что внутри data-params новые данные уже, после нажатия.

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

console.log($('#btn-multi-exp').attr('data-params'));

azz
Сообщения: 193
Зарегистрирован: 2016.07.06, 17:20

Re: Переопределить POST

Сообщение azz »

В jquery для data-* лучше использовать https://api.jquery.com/data/
Вообще у меня есть ощущение что событие клика срабатывает раньше чем доходит до вашего обработчика. Если так, вероятно придётся делать свою кнопку.

unknownby
Сообщения: 333
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Переопределить POST

Сообщение unknownby »

azz писал(а):
2020.03.30, 11:51
В jquery для data-* лучше использовать https://api.jquery.com/data/
Вообще у меня есть ощущение что событие клика срабатывает раньше чем доходит до вашего обработчика. Если так, вероятно придётся делать свою кнопку.
Как раз и рисую собственную кнопку. По событию клика передаются параметры. Хочу переделать чтобы параметры получались внутри кнопки, но пока не понимаю, как сделать это для keyList

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

$btnExport = Html::submitButton('<i class="glyphicon glyphicon-export"></i> <span class="hidden-md hidden-sm hidden-xs">' . \Yii::t('main', 'button.export') . '</span>', ['multi-export'],
        [
            'id' => 'btn-multi-exp',
            'class' => 'btn btn-success-dark',
            'data' => [
                'confirm' => \Yii::t('main', 'Are you sure you want to export selected rows?'),
                'method' => 'post',
                'params' => [
                    'keyList' => '', //тут магия
                    'keyOos' => $searchModel->myModel->mymodel_id,
                    'keyScope' => $searchModel->my_scope,
                ],
            ],
            'target' => '_blank',
        ]);
Получить ключи можно при помощи JS

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

var keyList = $('#my-grid').yiiGridView('getSelectedRows');
Как JS правильно запихнуть в кнопку к параметру


unknownby
Сообщения: 333
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Переопределить POST

Сообщение unknownby »

azz писал(а):
2020.03.30, 13:45
https://qna.habr.com/q/481275
Увидел уже много разных примеров реализации и этот тоже видел. В данном случае ajax, а у меня открытие action в новом окне с POST данными, по выполнению действия у меня идет файл на скачку с экспортом данных.
Ну попробую сделать через AJAX, может получится :D

azz
Сообщения: 193
Зарегистрирован: 2016.07.06, 17:20

Re: Переопределить POST

Сообщение azz »

Через аякс вы не скачаете файл. JS код из примера нужно заменить на отсылку формы с нужными параметрами

unknownby
Сообщения: 333
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Переопределить POST

Сообщение unknownby »

azz писал(а):
2020.03.30, 15:05
Через аякс вы не скачаете файл. JS код из примера нужно заменить на отсылку формы с нужными параметрами
В первом сообщении я показал код JS который работает, но после первой отправки он перестает передавать в actionMultiExport новые параметры, а передает старые параметры. Может в рабочем примере, что-то исправить? Есть варианты?
Данная строка отрабатывает хорошо

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

$('#btn-multi-exp').attr('data-params', JSON.stringify({keyList, keyOos, keyScope}));
Новые данные прописываются без вопросов, но не идут на actionMultiExport

P.S. переделал JS

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

$js = "
$(document).ready(function(){
    $('#btn-multi-exp').on('click', function(){
        var keyList = $('#my-grid').yiiGridView('getSelectedRows');
        var keyOos = ".json_encode($searchModel->muModel->mymodel_id).";
        var keyScope = ".json_encode($searchModel->my_scope).";
        if(keyList == '') {
            return false;
        }
        $.post('multi-export',
            {
                keyList: keyList,
                keyOos: keyOos,
                keyScope: keyScope,
            }
        );
   });
});
";
Упростил кнопку

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

$btnExport = Html::a('<i class="glyphicon glyphicon-export"></i> <span class="hidden-md hidden-sm hidden-xs">' . \Yii::t('main', 'button.export') . '</span>',
        ['multi-export'],
        [
            'id' => 'btn-multi-exp',
            'class' => 'btn btn-success-dark',
            'data' => [
                'confirm' => \Yii::t('main', 'Are you sure you want to export selected rows?'),
                'method' => 'post',
            ],
            'target' => '_blank',
        ]);
У меня два раза событие отправки POST, первый срабатывает как (AJAX), а другой обычный и тот у которого AJAX как раз хорошо передает параметры, как достать их :D

azz
Сообщения: 193
Зарегистрирован: 2016.07.06, 17:20

Re: Переопределить POST

Сообщение azz »

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

Упростил кнопку
Убрать Html::a и сделать на js, что бы на ней висело лишь одно событие. Либо убрать все навешанные обработчики, и оставить лишь свой

unknownby
Сообщения: 333
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Переопределить POST

Сообщение unknownby »

azz писал(а):
2020.03.30, 16:17
Убрать Html::a и сделать на js, что бы на ней висело лишь одно событие. Либо убрать все навешанные обработчики, и оставить лишь свой
Есть вариант, как вставить в параметр keyList выбранные чекбоксы?

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

$btnExport = Html::a('<i class="glyphicon glyphicon-export"></i> <span class="hidden-md hidden-sm hidden-xs">' . \Yii::t('main', 'button.export') . '</span>',
        ['multi-export'],
        [
            'id' => 'btn-multi-exp',
            'class' => 'btn btn-success-dark',
            'data' => [
                'confirm' => \Yii::t('main', 'Are you sure you want to export selected rows?'),
                'method' => 'post',
                'params' => [
                    'keyList' => "<script>var keyList = $('#my-grid').yiiGridView('getSelectedRows');</script>",
                    'keyOos' => $searchModel->MyModel->mymodel_id,
                    'keyScope' => $searchModel->my_scope
                ],
            ],
            'target' => '_blank',
        ]
    );
Перепробовал кучу вариантов уже

P.S. может можно через JS как-то вставить в data-params-keyList значение выбранных чекбоксов?

azz
Сообщения: 193
Зарегистрирован: 2016.07.06, 17:20

Re: Переопределить POST

Сообщение azz »

Есть вариант, как вставить в параметр keyList выбранные чекбоксы?
Не знаю. Выше написал, как бы я поступил, исходя из соображения что клик по кнопке и отправка формы срабатывает раньше кастомного ивента...

Ответить