Yii2: Непонятное поведение Pjax

Created on 23 Sep 2016  ·  7Comments  ·  Source: yiisoft/yii2

Сразу извиняюсь за русский, но по-английски я это вразумительно объяснить не смогу.

Решил попробовать pjax на одном из проектов. Для теста в единственном используемом layout просто обернул все содержимое в виджет:

<body>
<?php
Pjax::begin(['timeout' => 50000]);
....
Pjax::end();
?>
</body>

Первая проблема: не все переходы со страницы на страницу обрабатываются pjax'ом, некоторые страницы он усердно перезагружает полностью. При этом никаких ошибок в консоли броузера нет. Никакой зависимости не заметил. Все, что удалось обнаружить наблюдениями - есть определенные группы страниц, при переходе между которыми страница обязательно будет перезагружена целиком. Никакой связи в группах не удалось установить - в одной группе могут быть страницы из разных модулей, разного размера, с разными форматами URL (она страница с ЧПУ, вторая - с ?param=...) и т.д.

Пример: между страницами А, Б и В pjax срабатывает отлично, как и при переходах между страницами Г и Д. Но если перейти с Б на Г или с Д на А или обратно, то произойдет 100% перезагрузка страницы целиком. Причину понять так и не смог.

Проблема номер два: пока переходы обрабатываются pjax'ом, кнопки броузера "вперед" и "назад" работают отлично, но как только происходит полная перезагрузка страницы, случается что-то непонятное: кнопка "назад" срабатывает ровно один раз - возвращает на предыдущую страницу, все дальнейшие нажатия "назад" приводят только с смене URL в строке адреса и ошибке в консоли разработчика "Uncaught TypeError: Cannot read property 'cache' of undefined", сам контент страницы при этом не меняется.

| Q | A |
| --- | --- |
| Yii version | 2.0.9 |
| PHP version | 7.0 |
| Operating system | Ubuntu Linux |

pjax to be verified

All 7 comments

Насколько мне известно pjax обновляет страницу полностью в двух случаях:

  • загрузка страницы более 1 сек.
  • нет поддержки pushState в браузере.

Поддержка pushState есть, т.к.
а) я использую последнюю версию Хрома
б) если бы не было поддержки, то pjax не работал бы на всех страницах.

Загрузка более 1 секунды не должна ломать работу, взгляните на код: в настройках виджета выставлен timeout в 50 секунд.

надо всем ссылкам и формам добавлять data-pjax='1'
дефолтно в гии шаблонах в гриде ссылки эти отключены

редирект правда завести так и не удалось, хотя доки говорят что это реально, но страница перегружается полностью или вообще не перегружается (с кодом ответа 302)

Вклинюсь в обсуждение со своими непонятками.

  • Поставил чистый yii2-app-basic 2.0.9.
  • Добавил экшен в SiteController:
public function actionPjaxTest()
{
    return $this->render('pjax-test', ['time' => date('H:i:s')]);
}
  • Добавил представление:
<?php
use yii\helpers\Html;
use yii\widgets\Pjax;
?>
<?php Pjax::begin(); ?>
<?= Html::a("Refresh", ['site/pjax-test'], ['class' => 'btn btn-lg btn-primary']);?>
<h1>Current time: <?= $time ?></h1>
<?php Pjax::end(); ?>
  • В консоли вот что:

Uncaught TypeError: Cannot read property 'push' of undefined --- jquery.pjax.js:981

jQuery.Deferred exception: jQuery(...).pjax is not a function TypeError: jQuery(...).pjax is not a function --- jquery.min.js:2

Uncaught TypeError: jQuery(...).pjax is not a function --- jquery.min.js:2


ОС: Xubuntu 16.04.1


P. S. Ну я [censored] ... В конфиге отрубил jQuery, а после установки свежего приложения скопировал старый конфиг ... Меня сразу напрягла эта строчка в View page source:

<script src="//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

но я не придал этому значение; а в процессе написания этого поста понял как я ... Пускай будет сообщение, раз уже написал — может кто нагуглит и сэкономит пару часов времени :( :)

I don't understand Russian but that line:

Pjax::begin(['timeout' => 50000])

Is not doing what expected. see https://github.com/yiisoft/yii2/issues/9040#issuecomment-233157516. may be related ?

Try to set 'id' property of Pjax widget

Duplicate issue. Please search the forum for 'pjax' with terms like 'refresh' and you will find many, many scenarios in which this behavior can happen. Most of the issues are related to pjax itself and is out of the scope of Yii. More info on the refresh subject, take a look at https://github.com/yiisoft/yii2/issues/4486#issuecomment-50322596

Was this page helpful?
0 / 5 - 0 ratings