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, зачем его только придумали?

← Предыдущая заметка
Консольный импорт в miniShop из 1С
Следующая заметка →
Как не чистить кэш всего сайта?
Комментарии (19)
Николай
30.10.2012 11:22

Василий, день добрый.

Насколько я понимаю, хоть в шаблонах и ресурсах есть параметр обновлять кеш после сохранения.

Первый вызов страницы, все равно получается гораздо более долгий. Это связанно с кешированием на стороне пользователя или на сервере еще, что то дополнительно кешируется.?

Просто если на странице вызывается 4-5 снипетов.

К примеру пара Wf, getRes, ну и еще что нибудь, то 1 вызов может быть более секунды.

С этим как то можно бороться или бессмысленно?

bezumkinВасилий Наумкин
30.10.2012 11:31

Первая генерация страницы, без кэша за одну секунду — это быстро.

Вы генерируете страницу. Это кушает ресурсы. Чем более сложная страница — тем больше уходит ресурсов на ее генерацию.

Вариантов много:

1. Упрощайте страницу

2. Грузите тормозные блоки через Ajax или отдельно кэшируйте (у меня на сайте так кэшируется блок справа, с последними событиями)

3. Отключите очистку кэша при обновлении ресурса — там есть галочка такая. Можно чистить ресурсы вручную, по id в /core/cache/resource.

4. Переходите на самописные сниппеты, наконец, зачем вам универсальные и «тормозные» getResources и Wayfinder (это сарказм, конечно). Лично я не смог написать более быстрый сниппет для выборки ресурсов, даже с половиной функционала getResources.

Если все это не подходит — пишите на чистом php, не используйте MODX и другие фреймворки. Уверен, времени уйдет раз в 10 больше.

Николай
31.10.2012 14:51

Я не в коем случае не говорю, что они тормозные)) Просто этот момент интересовал спасибо за ответ.

Николай
31.10.2012 15:29

Я даже имел ввиду не переделывать что то, а генерировать страницы заблаговременно скриптом. Что то вроде бота который бы ночью проходил по сайту и готовил страницы, а пользователю уже готовое бы выдавалось.

Естественно, при этом контент на сайте меняется не чаще, чем раз в сутки

Или это глупость?

bezumkinВасилий Наумкин
31.10.2012 15:37

На мой взгляд — оно того не стоит.

Контент обновили, у первого юзера страница грузится 1 секунду, у остальных — быстрее. Не уверен, что это кто-то вообще заметит.

Или вы amazon программируете и считаете миллисекунды?

Николай
31.10.2012 16:03

нет конечно)) Просто в тему последних холиваров, стал обращать на скорость генерации страниц чисто из спортивного интереса.

inetloverАлександр Наумов
30.10.2012 12:47

Спасибо, очень полезно! Как раз сейчас разбираю Wayfinder по косточкам.

Подключил jquery.bassistance.de/treeview/demo/, затем решил сделать альтернативу, что бы дерево строилось без JS и тут начал перебирать все встроенные возможности Wayfinder, что бы добиться следующего вывода:

То есть, вложенный li всего один и у него class=«last».

У меня вопрос, как вы считаете такого стандартными средствами добиться можно, или здесь нужно написать свой сниппет?

k07nAndrei Kilin
30.10.2012 17:42

Структуру дерева и результат подробнее распишите?

bezumkinВасилий Наумкин
30.10.2012 17:44

Давайте в отдельный вопрос, а? bezumkin.ru/help/ask.html

Николай
31.10.2012 16:07

rtfm.modx.com/display/ADDON/Wayfinder прочтите внимательно мануал. Там все эти ласты (и даже копыта )вложенные и не вложенные описаны.

Don_BasilioВасилий
30.10.2012 17:19

Может глупый вопрос, но я не понял как чанк «tpl.Wf.row» передает синиппету «getItemsCount» id родительского ресурса. Откуда берется переменная $input? Может ссылочку дадите где про это написано.

Don_BasilioВасилий
30.10.2012 17:26

Огромное спасибо)

Алексей Добряков
01.07.2013 22:34

Решение хорошее но выводит ошибку

(ERROR @ /index.php) Encountered empty IN condition with key id

ModX 2.2.8

bezumkinВасилий Наумкин
02.07.2013 03:20

Это если у ресурса нет потомков.

Обновил топик, будет возвращаться 0, без ошибки.

Рустам Алимов
16.02.2014 20:59

Если встречается символическая ссылка в ней то нет документов, а вот куда она ссылается есть. Что тогда? Нужно получается проверять class_key и если webLink забирать content в котором указан id ресурса на который ссылается ссылка.

Дмитрий
01.08.2014 13:15

Сделал всё как по примеру, не выводит количество ресурсов (а пункты меню выводит). В чём может быть причина? Движок: MODX Revolution 2.2.14-pl (traditional). У меня ещё кстати getResources не работает вообще. Даже без параметров когда вызываю - массив не выводит. Но ему нашёл замену - pdoTools. А вот количество ресурсов вывести в меню очень бы хотелось.

Дмитрий
01.08.2014 13:29

Извиняюсь, не закрыл кавычку в шаблоне, всё работает идеально, большое спасибо за ваши решения!!!

bezumkinВасилий Наумкин
01.08.2014 13:30

На здоровье!

bezumkin
Василий Наумкин
01.06.2023 02:28
Молодец, я очень рад! Мне когда приходится по работе сталкиваться с другими системами - это боль.
inetlover
Александр Наумов
31.05.2023 18:12
Понял, спасибо!
Nurbol Boken
28.05.2023 10:07
Спасибо большое!
futuris
Futuris
26.05.2023 08:05
Можно и так. Главное - варианты есть, если хочешь ковырять VESP). Virtual Box я использовал на дескт...
futuris
Futuris
21.05.2023 14:51
Да, теперь появились! Спасибо за твое терпение!
bezumkin
Василий Наумкин
15.05.2023 06:11
Молодец!
bezumkin
Василий Наумкин
09.05.2023 01:01
Не знаю даже, что ответить. По идее работать должно везде, возможно просто глюк, который лечится пер...
futuris
Futuris
05.05.2023 09:49
Блин, вот оказывается из-за чего! Извини Василий, не было злого умысла!) Я видно уже припарился и ко...
bezumkin
Василий Наумкин
29.04.2023 05:08
Думаю, что не помогут
futuris
Futuris
28.04.2023 14:37
Не то слово!