Как стать автором
Обновить

Сниппет menuCaching для MODX Revolution

Время на прочтение 2 мин
Количество просмотров 7.6K
Идея сниппета очень проста. Часто требуется сделать на сайте меню, которое остаётся неизменным на всех страницах. Меняется только CSS-класс активного пункта меню. Зачем нам на каждой странице делать запросы в БД и генерировать меню, если требуется только поменять CSS-класс? А если это большое меню с выпадающими подуровнями, на его генерацию может тратиться слишком много ресурсов. Сниппет menuCaching позволяет избавить сервер от этой лишней работы.



Описание сниппета

Сниппет позволяет не генерировать меню для каждой страницы отдельно только ради того чтобы поставить CSS-класс на активный пункт меню.
Меню генерируется только один раз для всего сайта, но активные пункты отмечаются.

Пример использования


[[menuCaching?
&snippetToCache=`Wayfinder`
&cacheSuffix=`top_menu`
&contexts=`web`
&startId=`0`
&level=`1`
&hereClass=`active`
&rowTpl=`@CODE: <li class="[[+wf.classnames]] {{active[[+id]]}}"><a href="[[+wf.link]]">[[+wf.linktext]]</a></li>`
]]


Рекомендуется создать набор параметров (например «top_menu») чтобы, опять же, избавить парсер MODX от лишней работы:

[[menuCaching@top_menu]]


Что здесь происходит, я думаю, вы уже догадались. В кэше меню хранится в таком виде:

<ul>
    <li class="first {{active1}}"><a href="">Пункт меню 1</a></li>
    <li class=" {{active2}}"><a href="">Пункт меню 2</a></li>
    <li class="last {{active3}}"><a href="">Пункт меню 3</a></li>
</ul>


Остаётся только заменить метки типа {{active1}} на класс активного элемента, а остальные убрать, что и делает сниппет. В комплект к сниппету входит плагин, который очищает кэш при нажатии кнопки «Обновить сайт» в админке.

Важный параметр сниппета — cacheSuffix. В примере создаётся кэш для всего сайта, но можно создавать кэш для отдельных родительских категорий, а внутри одной категории всё будет браться из кэша:

&cacheSuffix=`[[*parent]]`


Данный сниппет можно использовать не только для меню, а например для разных слайдеров и т.п. блоков, которые на сайте не меняются на разных страницах.

Сниппет menuCaching в репозитории MODX: http://modx.com/extras/package/menucaching

Добавлено

Результаты тестирования с большим меню. Вызовы обоих сниппетов некэшированные, т.е. [[!snippet]] (для теста, в реальности надо кэшировать).

Wayfinder
Первый вызов любой из страниц где есть меню: 2.5815 сек.
Переход на любую другую страницу с этим же меню: 2.4566 сек. (т.е. хвалёный cacheResults не помогает)
Обновляем страницу: 1.0021 сек. (только в этом случае cacheResults спасает)

Тот же Wayfinder, через menuCaching
Первый вызов любой из страниц где есть меню: 2.4842 сек. (в рамках погрешности, естественно разницы нет)
Переход на любую другую страницу с этим же меню: 0.7008 сек. (результат тот же, а время отличается)
Обновляем страницу: 0.4187 сек.
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+9
Комментарии 12
Комментарии Комментарии 12

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн