Wayfinder и количество документов в контейнере
Есть довольно частая задача - вывести меню до определенного уровня вместе с количеством страниц в каждом разделе. Новички обычно спотыкаются на ней и задают вопросы "а как?!".
Видел разные мнения, в основном, что это очень медленно и сложно, xPDO тормозит, надо писать свой сниппет и т.д. Конечно, все это ерунда и нас, как всегда, выручит Wayfinder.
Итак, обычный вызов сниппета, можно даже некэшированный:
[[!Wayfinder?
&startId=`2`
&level=`3`
&rowTpl=`tpl.Wf.row`
]]
время работы: [^t^]
Обычный чанк tpl.Wf.row, только с вызовом особого сниппета в виде фильтра вывода.
<li[[+wf.id]][[+wf.classes]]>
<a href="[[+wf.link]]" [[+wf.attributes]]>[[+wf.linktext]]</a> ([[+id:getItemsCount]])
[[+wf.wrapper]]
</li>
И необычный сниппет getItemsCount, который мы вызываем один раз на каждый пункт меню. То есть, очень много раз.
$ids = $modx->getChildIds($input);
$count = 0;
if (!empty($ids)) {
$count = $modx->getCount('modResource', array(
'id:IN' => $ids
,'published' => 1
,'deleted' => 0
,'hidemenu' => 0
,'isfolder' => 0
));
}
return $count;
И получается вот такая картина:
Как вы думаете, сколько времени занимает генерация каталога из 1000 товаров на 3 уровня вглубь с подсчетом вложенных ресурсов в каждой позиции?
0.8103 s
А на 2 уровня? #### 0.3650 s
Из кэша, соответственно: 0.0820 s и 0.0684 s. Ужасно тормозной xPDO, зачем его только придумали?
0
👍
👎
❤️
🔥
😮
😢
😀
😡
2 738
30.10.2012, 07:43:01
19 комментариев
Николай
30.10.2012, 15:22:04
Василий, день добрый.
Насколько я понимаю, хоть в шаблонах и ресурсах есть параметр обновлять кеш после сохранения.
Первый вызов страницы, все равно получается гораздо более долгий. Это связанно с кешированием на стороне пользователя или на сервере еще, что то дополнительно кешируется.?
Просто если на странице вызывается 4-5 снипетов.
К примеру пара Wf, getRes, ну и еще что нибудь, то 1 вызов может быть более секунды.
С этим как то можно бороться или бессмысленно?
Василий Наумкин
30.10.2012, 15:31:07
Первая генерация страницы, без кэша за одну секунду — это быстро.
Вы генерируете страницу. Это кушает ресурсы. Чем более сложная страница — тем больше уходит ресурсов на ее генерацию.
Вариантов много:
1. Упрощайте страницу
2. Грузите тормозные блоки через Ajax или отдельно кэшируйте (у меня на сайте так кэшируется блок справа, с последними событиями)
3. Отключите очистку кэша при обновлении ресурса — там есть галочка такая. Можно чистить ресурсы вручную, по id в /core/cache/resource.
4. Переходите на самописные сниппеты, наконец, зачем вам универсальные и «тормозные» getResources и Wayfinder (это сарказм, конечно). Лично я не смог написать более быстрый сниппет для выборки ресурсов, даже с половиной функционала getResources.
Если все это не подходит — пишите на чистом php, не используйте MODX и другие фреймворки. Уверен, времени уйдет раз в 10 больше.
Николай
31.10.2012, 18:51:34
Я не в коем случае не говорю, что они тормозные)) Просто этот момент интересовал спасибо за ответ.
Николай
31.10.2012, 19:29:43
Я даже имел ввиду не переделывать что то, а генерировать страницы заблаговременно скриптом. Что то вроде бота который бы ночью проходил по сайту и готовил страницы, а пользователю уже готовое бы выдавалось.
Естественно, при этом контент на сайте меняется не чаще, чем раз в сутки
Или это глупость?
Василий Наумкин
31.10.2012, 19:37:14
На мой взгляд — оно того не стоит.
Контент обновили, у первого юзера страница грузится 1 секунду, у остальных — быстрее. Не уверен, что это кто-то вообще заметит.
Или вы amazon программируете и считаете миллисекунды?
Николай
31.10.2012, 20:03:36
нет конечно)) Просто в тему последних холиваров, стал обращать на скорость генерации страниц чисто из спортивного интереса.
Александр Наумов
30.10.2012, 16:47:47
Спасибо, очень полезно! Как раз сейчас разбираю Wayfinder по косточкам.
Подключил jquery.bassistance.de/treeview/demo/, затем решил сделать альтернативу, что бы дерево строилось без JS и тут начал перебирать все встроенные возможности Wayfinder, что бы добиться следующего вывода:
То есть, вложенный li всего один и у него class=«last».
У меня вопрос, как вы считаете такого стандартными средствами добиться можно, или здесь нужно написать свой сниппет?
Andrei Kilin
30.10.2012, 21:42:00
Структуру дерева и результат подробнее распишите?
Василий Наумкин
30.10.2012, 21:44:30
Давайте в отдельный вопрос, а? bezumkin.ru/help/ask.html
Николай
31.10.2012, 20:07:57
rtfm.modx.com/display/ADDON/Wayfinder прочтите внимательно мануал. Там все эти ласты (и даже копыта )вложенные и не вложенные описаны.
Василий
30.10.2012, 21:19:25
Может глупый вопрос, но я не понял как чанк «tpl.Wf.row» передает синиппету «getItemsCount» id родительского ресурса. Откуда берется переменная $input? Может ссылочку дадите где про это написано.
Василий Наумкин
30.10.2012, 21:21:19
rtfm.modx.com/display/revolution20/Input+and+Output+Filters+%28Output+Modifiers%29
Василий
30.10.2012, 21:26:19
Огромное спасибо)
Алексей Добряков
02.07.2013, 02:34:22
Решение хорошее но выводит ошибку
ModX 2.2.8
Василий Наумкин
02.07.2013, 07:20:12
Это если у ресурса нет потомков.
Обновил топик, будет возвращаться 0, без ошибки.
Рустам Алимов
17.02.2014, 00:59:30
Если встречается символическая ссылка в ней то нет документов, а вот куда она ссылается есть. Что тогда? Нужно получается проверять class_key и если webLink забирать content в котором указан id ресурса на который ссылается ссылка.
Дмитрий
01.08.2014, 17:15:03
Сделал всё как по примеру, не выводит количество ресурсов (а пункты меню выводит). В чём может быть причина? Движок: MODX Revolution 2.2.14-pl (traditional). У меня ещё кстати getResources не работает вообще. Даже без параметров когда вызываю - массив не выводит. Но ему нашёл замену - pdoTools. А вот количество ресурсов вывести в меню очень бы хотелось.
Дмитрий
01.08.2014, 17:29:10
Извиняюсь, не закрыл кавычку в шаблоне, всё работает идеально, большое спасибо за ваши решения!!!
Василий Наумкин
01.08.2014, 17:30:20
На здоровье!
bezumkin.ru
Личный сайт Василия Наумкина
Прямой эфир
Василий Наумкин
01.07.2024, 11:56:41
Да, верно, именно так.
А в контроллере, скорее всего, ловить данные методом post.
Василий Наумкин
26.06.2024, 09:38:15
О, точно, вылезает если не залогинен.
Спасибо, исправил!
Василий Наумкин
09.04.2024, 04:45:01
> Ошибка 500
Это не похоже на ошибку Nginx, это скорее всего ошибка PHP - надо смотреть его логи.
...
russel gal
09.03.2024, 20:17:18
> А этот стоило написать хотя бы затем, чтобы получить комментарий от юзера, который ничего не писал...
Александр Наумов
27.01.2024, 03:06:18
Василий, спасибо!
Извини, тупанул.