[pdoTools] 2.11.0 - отключение выборки total по умолчанию
Привет, друзья!
Для начала, немного теории. Все сниппеты pdoTools используют класс pdoFetch для работы с базой данный. Во время этого происходит выборка данных с подсчётом количества результатов и выставлением плейхолдера [[+total]]. Для максимальной точности, делается это, используя встроенные функции MySQL. Перед выборкой добавляется такая функция:
А после выборки делается отдельный запрос для получения результата и выставления плейхолдера
Так вот, этот плейхолдер нужен исключительно для постраничной навигации и вывода количества в showLog, но его выборка может занимать весьма продолжительное время. Так что, в новой версии добавлена опция setTotal прямо в класс pdoFetch, и она отключена по умолчанию.
То есть, теперь все выборки pdoTools не делают эту ненужную работу. Но, так как плейхолдер [[+total]] необходим для постраничной навигации, сниппет pdoPage включает его всегда. При вызове любого сниппета через pdoPage, этот плейхолдер будет выставлен.
Я очень надеюсь, что вы не заметите никаких проблем при обновлении сайта, но теоретически они могут быть, если этот плейсхолдер вам нужен не для пагинации, а для чего-то еще.
Если так, то просто включите его:
Думаю, ускорение работы pdoMenu, pdoCrumbs, pdoNeighbors и других сниппетов стоит этого. Обновляемся, тестируем, и как обычно, пишем отзывы.
Для начала, немного теории. Все сниппеты pdoTools используют класс pdoFetch для работы с базой данный. Во время этого происходит выборка данных с подсчётом количества результатов и выставлением плейхолдера [[+total]]. Для максимальной точности, делается это, используя встроенные функции MySQL. Перед выборкой добавляется такая функция:
SQL_CALC_FOUND_ROWS `id`,`pagetitle`,...
И MySQL знает, что нужно считать потенциально выбираемые результаты.А после выборки делается отдельный запрос для получения результата и выставления плейхолдера
SELECT FOUND_ROWS();
Так вот, этот плейхолдер нужен исключительно для постраничной навигации и вывода количества в showLog, но его выборка может занимать весьма продолжительное время. Так что, в новой версии добавлена опция setTotal прямо в класс pdoFetch, и она отключена по умолчанию.
То есть, теперь все выборки pdoTools не делают эту ненужную работу. Но, так как плейхолдер [[+total]] необходим для постраничной навигации, сниппет pdoPage включает его всегда. При вызове любого сниппета через pdoPage, этот плейхолдер будет выставлен.
Я очень надеюсь, что вы не заметите никаких проблем при обновлении сайта, но теоретически они могут быть, если этот плейсхолдер вам нужен не для пагинации, а для чего-то еще.
Если так, то просто включите его:
[[!pdoResources?
&parents=`0`
&...
&setTotal=`1`
]]
modx.pro уже работает на новой версии, никаких проблем не обнаружено.Думаю, ускорение работы pdoMenu, pdoCrumbs, pdoNeighbors и других сниппетов стоит этого. Обновляемся, тестируем, и как обычно, пишем отзывы.
Комментарии: 8
Логично :) Спасибо!
Василий, я задавал вопрос в разделе «вопросы», но точного ответа так и не было.
Не получается красиво настроить работу pdoPage и ЧПУ. Например, если на главной странице хочешь перейти на вторую страницу по ссылке localhost/page-2, то попадаешь на 404. А по ссылке localhost/index/page-2 все впорядке.
Также проблемы при совместной работе Tagger и pdoPage. Хочу пагинацию с ЧПУ по выборке тэга. Например, localhost/tag/test — это выборка статей по тэгу test. При включенном ЧПУ ссылка на следующую страницу — localhost/index?tag=test&page=2…
Это проблемы в работе pdoTools, мой косяк в настройке или пытаться самом исправить? Спасибо!
Василий, я задавал вопрос в разделе «вопросы», но точного ответа так и не было.
Не получается красиво настроить работу pdoPage и ЧПУ. Например, если на главной странице хочешь перейти на вторую страницу по ссылке localhost/page-2, то попадаешь на 404. А по ссылке localhost/index/page-2 все впорядке.
Также проблемы при совместной работе Tagger и pdoPage. Хочу пагинацию с ЧПУ по выборке тэга. Например, localhost/tag/test — это выборка статей по тэгу test. При включенном ЧПУ ссылка на следующую страницу — localhost/index?tag=test&page=2…
Это проблемы в работе pdoTools, мой косяк в настройке или пытаться самом исправить? Спасибо!
Наверное поможет это.
Без добавления указанного плагина, страница localhost/index/page-2 выдавала бы 404.
Проблема с pdoResources после обновления. Кеш чистил полностью.
Вывод картинок с двойным слешем в начале
Вызов pdoResources:
Вывод картинок с двойным слешем в начале
Вызов pdoResources:
[[pdoResources?
&parents=`2`
&tvPrefix=``
&tpl=`ProductRowTpl`
&includeTVs=`imgcatalog,imgcatalogbig`
]]
Чанк ProductRowTpl:...
<a href="[[+imgcatalogbig]]" rel="product_group" title="Фотография [[+pagetitle]]">
<img src="[[+imgcatalog]]" class="img-responsive" alt="Фотография [[+longtitle]]"></a>
...
Вывод картинки: //img/S_line_lab_plus1200x848.jpg
Если на странице вызвать TV [[*imgcatalogbig]]
то выводит нормально /img/S_line_lab_plus1200x848.jpg
Ничего такого в новой версии вообще не меняли.
Только setTotal, и всё.
Только setTotal, и всё.
Проблема ЧПУ вместе с VirtualPage.
В пагинации не присваивается странице своя цифра, везде у ссылок page-1
Пробовал включить кэширование сниппета, помогает, но активная страница не помечается стилем active
Ручной переход с вводом page-n работает, не работает только сама пагинация.
В исходном классе pdoPage дебажил и вот это свойство выдаёт [[+pageVarKey]]-1 в методе makePageLink
В самом сниппете pdoPage ещё стоит такая строка
В пагинации не присваивается странице своя цифра, везде у ссылок page-1
Пробовал включить кэширование сниппета, помогает, но активная страница не помечается стилем active
Ручной переход с вводом page-n работает, не работает только сама пагинация.
В исходном классе pdoPage дебажил и вот это свойство выдаёт [[+pageVarKey]]-1 в методе makePageLink
$this->pdoTools->config['pageLinkScheme']
В самом сниппете pdoPage ещё стоит такая строка
if (empty($page)) {
$page = 1;
}
Помогло в параметрах сниппета указать
Но после этого теперь не отмечается первая страница как активная при переходе на неё.
&page=`[[+page]]`
Но после этого теперь не отмечается первая страница как активная при переходе на неё.
Поменял [[!+page.nav]] на [[+page.nav]] и заработало.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.