@xskif

Yii2. Как работает pjax (или это просто AJAX) при data-pjax="0" и наличии data-method и data-confirm?

Не могу понять каким образом умудряется работать PJAX / AJAX когда он выключен на кнопке удаления в стандартном GridView. Действие контроллера я переписал следующим образом:
public function actionDelete($id, $productId = null)
    {
        $this->findModel($id)->delete();

        list($searchModel, $dataProvider) = $this->prepareDataProvider($productId);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }


На $productId можно не обращать внимания, это реализация вложенных ресурсов и одновременно всех ресурсов если в запросе нет параметра, вопрос не в этом.

На странице у меня табулярная форма в обычном гриде, который обернут в Pjax контейнер, ссылка на удаление выглядит как:
<a href="/catalog/1/variation/3/delete" title="Удалить" data-confirm="Вы действительно хотите удалить данную запись?" data-method="post" data-pjax="0"><span class="glyphicon glyphicon-trash"></span></a>


После того как я переписал action контроллера, который, вместо редиректа теперь просто рендерит результат, даже не через renderAjax, а просто render, ссылки на удаление стали работать через ajax.
Нажимаю удалить - выскакивает конфирм, подтверждаю, идет запрос на сервер, а потом просто обновляется грид.

Я изучил yii.js и как он обрабатывает data-method, так там просто создается форма, вставляется в самый низ html документа и триггерится сабмит этой формы. Никаких pjax'ов, более того, запрос к серверу идет без указания pjax контейнера, как в случае с pjax.reload.

Интересный факт:
В параметрах запроса на удаление присутствуют нужные заголовки, но откуда они берутся при такой настройке?
X-PJAX:true
X-PJAX-Container:#variationsListPjax
X-Requested-With:XMLHttpRequest


Объясните пожалуйста, почему? Я то рад что все так просто получилось, но не могу найти откуда корни растут.

P.S. На одной странице у меня несколько pjax контейнеров но ни один из них при объявлении не цепляет все формы, только те что с [data-pjax]
  • Вопрос задан
  • 7894 просмотра
Решения вопроса 1
@xskif Автор вопроса
Кажется я сам разобрался =)
Все дело в наличии табулярной формы, которая как раз имеет data-pjax. Алгоритм получается такой.

Ссылка/кнопка при обработке data-method ищет ближайшую форму, если находит, то применяет все действия к ней, если не находит, создает новую форму.
Меняет action и method для данной формы на установленные соответственно.
Ну а дальше все просто. Спасибо дебагеру хрома.

В итоге, чтобы добиться AJAX поведения для data-method и data-confirm нужно обернуть такую ссылку в форму с установленным data-pjax. Извращение конечно, но пока разработчики ничего лучше не сделали.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы