Наверх

Снова о кешировании. Генерируем меню только один раз

Иногда бывает необходимость сделать меню большим. Ну, реально большим и разветвленным. Например, как на сайтах fsknmsk.ru, medicinskiy-center.ru, www.withoutdrugs.ru, narcononekb.ru

Если Wayfinder вызывается кешируемым, т. е. [[Wayfinder &startId=`0`]] (без восклицательного знака), и изменения на сайте вносятся нечасто, то проблем особых нет — после первого посещения каждой страницы, вывод сниппета кешируется и для этой страницы код меню уже не генерируется.

Если изменения вносятся часто, но на меню они особо не влияют (например, просто выкладываются новости или статьи, которые в меню не появляются), то используем getCache (статья)

Но что делать, если само меню постоянно меняется и новые пункты нужно обязательно отражать на всех страницах? Сниппет getCache хранит сгенерированный код, пока вы его не удалите вручную (или по таймеру). Обновление кеша после сохранения страниц на него не влияет.

Поделюсь своим решением, использующим самый простой вариант пользовательского кеширования в MODX

Создаем чанк menu, в котором прописываем вызов Wayfinder с нужными нам параметрами. А в шаблоне вызываем сниппет menu:

// Проверяем, есть ли в кеше сгенерированный код меню
$output = $modx->cacheManager->get('menu');

if (empty($output)) {
  // Генерируем менюшку
  $output = $modx->getChunk('menu');
  // Но сохраняем ее только если это главная страница сайта
  if ($modx->resource->id == $modx->getOption('site_start')) {
    $modx->cacheManager->set('menu',$output);
  }
}

return $output;
Теперь, меню будет генерироваться после любого изменения на сайте, но только один раз — на главной странице. На остальных страницах она будет браться из кеша.

Единственный минус — класс active придется подставлять с помощью JavaScript:
<script type="text/javascript">
    $.each($("aside nav a"), function() {
        if ($(this).attr("href") == "[[~[[*id]]]]") {
            var item = $(this).parent("li");
            item.addClass("active");
            if (item.parent().parent().is("li")) {
              item.parent().parent().addClass("active");
            }
        }
    });
</script>
Работает, если на странице подключен JQuery и уровень вложенности не больше двух.

Кстати, если кто подскажет более эффективный, красивый и правильный JavaScript для этой же цели, буду очень благодарен. Особенно, если вы знаете, как уйти от указания каждого уровня вложенности. G+

Оригинал статьи community.modx-cms.ru/blog/tips_and_tricks/9119.html


0 комментариев

    Авторизация

    через сервис Loginza:


    Шаблоны MODX

    1 2 Дальше »

    Объектная
    модель
    MODX