Кэширование динамического многоуровнего меню

Материал из Umicms
Версия от 12:43, 28 октября 2011; VITL' (обсуждение | вклад) (Новая страница: «В данной статье будет рассмотрен пример кеширования динамического многоуровнего меню ра…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

В данной статье будет рассмотрен пример кеширования динамического многоуровнего меню разделов каталога, при использовании TPL-шаблонизатора. Логика для XSLT-будет аналогичная. В данном случае, динамическим меню называется то меню, которое изменяется в зависимости от того в каком разделе каталога мы находимся, т.е. определенная ветка меню раскрыта, другие свернуты. Логика кеша заключается в том, что должен быть кеш-файл на каждый раздел каталога. Будет подключаться тот кеш файл, который связан с текущим "Разделом каталога". Если посетитель находится на странице "Объекта каталога", то проверяется к какому разделу каталога принадлежит данный объект, и потом берется кеш связанный с этим разделом каталога. Также, должен быть еще один кеш для случая когда пользователь находится на странице, которая не является ни разделом каталога, ни объектом каталога. Для реализации данной задачи добавим дополнительный кастомный php-метод в файл classes/modules/custom.php:

  public function menuLeftCustom(){
        // время жизни кеш-файла
        $expire = 86400;
        $folder = CURRENT_WORKING_DIR . '/sys-temp/tplcache/';
        if(!is_dir($folder)) mkdir($folder, 0777, true);
        $controller = cmsController::getInstance();
        $current_page_id = $controller->getCurrentElementId();
        if($current_page_id){
            $element = umiHierarchy::getInstance()->getElement($current_page_id);
            $type_id = $element->getTypeId();
            // 5 - раздел каталога, 6 - объект каталога
            if($type_id == 5 || $type_id == 6){
               $rel_id = ($type_id == 6) ? $element->getParentId() : $current_page_id;
               $data_path = $folder . 'menuLeft_rel_' . $rel_id . '.html';
               if(is_file($data_path)){
                  $mtime = filemtime($data_path);
                  if(time() < ($mtime + $expire)) {
                    return file_get_contents($data_path);
                  }
               }
               $ini = $controller->getModule('content');
               $result = $ini->menu('menu_left', '2', 1533);
               file_put_contents($data_path, $result);
               return $result;
                       
            }       
        }
        $data_path = $folder . 'menuLeft_all.html';
        
        if(is_file($data_path)){
            $mtime = filemtime($data_path);
            if(time() < ($mtime + $expire)) {
              return file_get_contents($data_path);
            }
        }
        $ini = $controller->getModule('content');
        $result = $ini->menu('menu_left', '2', 1533);
        file_put_contents($data_path, $result);
        return $result;
        
  }

Стандартный вызов макрос в шаблоне был бы:

%content menu('menu_left', '2', 1533)%

При использовании кастомного метода, вызов должен быть:

%custom menuLeftCustom()%

В методе используются иерархические типы данных Раздела каталога и Объекта каталога (5 - раздел каталога, 6 - объект каталога), для вашего сайта вы их должны определить в настройках модуля Шаблоны данных, в режиме xml:

/admin/data/config/.xml

также, в кастомном методе,в двух местах пропишите вызов метода menu с вашими параметрами:

$result = $ini->menu('menu_left', '2', 1533);