AJAX grid delete

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Pirr
Сообщения: 16
Зарегистрирован: 2014.02.10, 11:50

AJAX grid delete

Сообщение Pirr »

Доброго времени всем, маленькая загвоздка вышла. Не выходит сделать обновление грида после удаления айтема.
К примеру добавление работает, реализовал вот так:

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

index.php
<div id="tst-widget">
    <div>
        <?= $this->render('_form', [
            'model' => $model,
        ]) ?>
    </div>

    <?php Pjax::begin(['formSelector' => '#tst-form']); ?>
        <?= $this->render('_grid', [
            'dataProvider' => $dataProvider,
        ]) ?>
    <?php Pjax::end();?>
</div>
В форме ничего особенного, текст-инпут и submit. Отправка формы методом POST при этом в заголовках вставляется такое

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

X-PJAX: true
X-PJAX-Container: #w0
На что контроллер отвечает

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

return $this->renderAjax('index',[
                'model'=>$model,
                'dataProvider'=>$dataProvider
            ]);
И на странице успешно обновляется только грид.
А вот удалить так же не выходит, кнопка для удаления в гриде:

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

...
'buttons' => [
                'delete'=>function ($url, $model) {
                        $url = Url::toRoute(['ajaxremove', 'id'=>$model->id]);
                        $a = Html::a('', '#',[
                            'class'=>'delete icon',
                            'data-id' => $model->id,
                            'data-href' => $url,
                            //'data-pjax'=>'false' - тут жонглирование не спасает
                        ]);
                        return $a;
                    },
            ],
...
При удалении получается что то вроде
Request URL:http://admin.ef.com/catalogs/default/ajaxremove?id=85
Request Method:POST
В ответ с контроллера я уже что только не пробовал и JSON и renderPartial/Ajax и просто render. В итоге в response я вижу свой обновленный грид, но на странице он таки не обновляется.
Pirr
Сообщения: 16
Зарегистрирован: 2014.02.10, 11:50

Re: AJAX grid delete

Сообщение Pirr »

Сам победил
После delete контроллер возвращает

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

return  $this->renderAjax('_grid',[
                'dataProvider'=> $this->getModels()
        ]);
В скрипте добавил

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

success: function (response) {
   $('#items').html(response); // <div id='items> обертка грида
}
Просто как то надеялся что PJAX сам все сделает. Либо я его не умею готовить, что тоже правда.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: AJAX grid delete

Сообщение astronin »

а эту страницу, случайно не аяксом ли получаете? если так, то обратите внимание на "X-PJAX-Container: #w0", в данном случае это "#w0" id элемента куда будет вставляться возвращенный результат от сервака.
лечиться это так, следующее нужно поставить перед вызовом виджетов в странице, возвращаемой аяксом:

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

Widget::$counter = 100; 
(ну в общем любое большое число)
чтоб на этой странице генератор виджетов сгенерил новые уникальные id-шки
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AJAX grid delete

Сообщение zelenin »

astronin писал(а):а эту страницу, случайно не аяксом ли получаете? если так, то обратите внимание на "X-PJAX-Container: #w0", в данном случае это "#w0" id элемента куда будет вставляться возвращенный результат от сервака.
лечиться это так, следующее нужно поставить перед вызовом виджетов в странице, возвращаемой аяксом:

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

Widget::$counter = 100;
(ну в общем любое большое число)
чтоб на этой странице генератор виджетов сгенерил новые уникальные id-шки

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

    Pjax::begin([
        'id' => ($pjax_id = 'pjax-id'),
    ]);
 
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: AJAX grid delete

Сообщение astronin »

Не путайте, указав id для одного виджета, не указываешь id для всех остальных виджетов полученных ajax-ом, для которых сработает генерация id с неправильным счетчиком.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AJAX grid delete

Сообщение zelenin »

astronin писал(а):Не путайте, указав id для одного виджета, не указываешь id для всех остальных виджетов полученных ajax-ом, для которых сработает генерация id с неправильным счетчиком.
а зачем это?
Pirr
Сообщения: 16
Зарегистрирован: 2014.02.10, 11:50

Re: AJAX grid delete

Сообщение Pirr »

astronin писал(а):а эту страницу, случайно не аяксом ли получаете? если так, то обратите внимание на "X-PJAX-Container: #w0", в данном случае это "#w0" id элемента куда будет вставляться возвращенный результат от сервака.
лечиться это так, следующее нужно поставить перед вызовом виджетов в странице, возвращаемой аяксом:

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

Widget::$counter = 100;
(ну в общем любое большое число)
чтоб на этой странице генератор виджетов сгенерил новые уникальные id-шки
Нет страница не аяксом изначально получается. А вообще метод сработал, PJAX сам все теперь делает.
Спасибо.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: AJAX grid delete

Сообщение astronin »

zelenin писал(а):
astronin писал(а):Не путайте, указав id для одного виджета, не указываешь id для всех остальных виджетов полученных ajax-ом, для которых сработает генерация id с неправильным счетчиком.
а зачем это?
затем, что id виджетов на странице, полученной аяксом без подобной добавки, будут начинаться с 0(или 1), т.е. точно так же как и на главной странице, что приведет к дублированию параметра id и JS вставит новые данные не туда куда нужно.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AJAX grid delete

Сообщение zelenin »

astronin писал(а):
zelenin писал(а):
astronin писал(а):Не путайте, указав id для одного виджета, не указываешь id для всех остальных виджетов полученных ajax-ом, для которых сработает генерация id с неправильным счетчиком.
а зачем это?
затем, что id виджетов на странице, полученной аяксом без подобной добавки, будут начинаться с 0(или 1), т.е. точно так же как и на главной странице, что приведет к дублированию параметра id и JS вставит новые данные не туда куда нужно.
ну так принудительно проставить id виджету, как я указал выше. Или нет?
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: AJAX grid delete

Сообщение astronin »

виджет[АМ], не одному
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AJAX grid delete

Сообщение zelenin »

astronin писал(а):виджет[АМ], не одному
причем тут виджетЫ вообще?
все работает автоматически. Если не работает с каким-то виджетом, надо приндительно ему задать id без хаков.
Не о всех же виджетах речь идет.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: AJAX grid delete

Сообщение astronin »

zelenin писал(а):
astronin писал(а):виджет[АМ], не одному
причем тут виджетЫ вообще?
все работает автоматически. Если не работает с каким-то виджетом, надо приндительно ему задать id без хаков.
Не о всех же виджетах речь идет.
посмотрите, пожалуйста, как виджет генерирует для себя JS
конкретно метод:

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

Widget::getId() 
может быть мы просто не понимаем друг друга, я говорю о том, что если мы получаем страницу аяксом, и там несколько виджетов, к примеру Pjax и ActiveForm
если на странице один виджет, то понятное дело не стоит париться сильно.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AJAX grid delete

Сообщение zelenin »

astronin писал(а):
zelenin писал(а):
astronin писал(а):виджет[АМ], не одному
причем тут виджетЫ вообще?
все работает автоматически. Если не работает с каким-то виджетом, надо приндительно ему задать id без хаков.
Не о всех же виджетах речь идет.
посмотрите, пожалуйста, как виджет генерирует для себя JS
конкретно метод:

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

Widget::getId()
может быть мы просто не понимаем друг друга, я говорю о том, что если мы получаем страницу аяксом, и там несколько виджетов, к примеру Pjax и ActiveForm
если на странице один виджет, то понятное дело не стоит париться сильно.
и что что несколько? приведите пример того, что что-то может поломаться, тогда я вас пойму.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: AJAX grid delete

Сообщение astronin »

zelenin писал(а):и что что несколько? приведите пример того, что что-то может поломаться, тогда я вас пойму.
Элементы на основной странице:

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

<div id="w1">
<div id="w2">
<div id="w3">
Элементы на странице аякса:

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

<div id="w1">
<div id="w2">
<div id="w3">
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AJAX grid delete

Сообщение zelenin »

вот именно поэтому id надо указывать принудительно, а не использовать ваш хак.
Для всех виджетов доступна опция 'id' => 'unique-widget-id'.
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: AJAX grid delete

Сообщение mickgeek »

Правильно говорит коллега zelenin, всегда необходимо учитывать уникальность значений атрибута ID. Не ленитесь указывать их вручную и не будет возникать никаких проблем.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: AJAX grid delete

Сообщение astronin »

вообще-то я как раз это и говорю, что надо следить за уникальностью id виджетов на всех страницах
или надо для всех прописать отдельно, или следить за счетчиком виджета (это не мой хак, так работает фреймворк)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AJAX grid delete

Сообщение zelenin »

astronin писал(а):вообще-то я как раз это и говорю, что надо следить за уникальностью id виджетов на всех страницах
или надо для всех прописать отдельно, или следить за счетчиком виджета (это не мой хак, так работает фреймворк)
нет, это однозначный хак. Для уникальности нужно менять id виджета, а не искуственно увеличивать его числовую составляющую.
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: AJAX grid delete

Сообщение mickgeek »

astronin писал(а):вообще-то я как раз это и говорю, что надо следить за уникальностью id виджетов на всех страницах
или надо для всех прописать отдельно, или следить за счетчиком виджета (это не мой хак, так работает фреймворк)
Вы ошибаетесь, есть ещё один вариант, - изменение параметра "Widget::autoIdPrefix". Но правильнее всего самому указывать ID по стандарту, просто для системы, гибко и понятно для разработчиков.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: AJAX grid delete

Сообщение astronin »

зависит от ситуации, незачем забивать людей в рамки
или может быть десяток виджетов тоже будите уникальными именами звать вручную...
(это риторический вопрос, на подумать)
а еще не забывать, у разных форм, полей, блоков, расширений, списков, элементов в списке и т.д. могут быть свои id, что в этой каше черт ногу сломит, так что любое уменьшение самописных id только в радость... за сотни каких-то путанных id никто спасибо не скажет
(не надо писать о правильности верстки, разработки, мозгов, людей, еще раз повторяю, ситуации бывают разные и надо решать задачи оптимальным путем)

в принципе Widget::autoIdPrefix мне даже больше нравиться чем изменение счетчика
Ответить