Кэширование динамического многоуровнего меню — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показана 1 промежуточная версия 1 участника)
Строка 1: Строка 1:
В данной статье будет рассмотрен пример кеширования динамического многоуровнего меню разделов каталога,
+
В данной статье будет рассмотрен пример кэширования динамического многоуровнего меню разделов каталога,
 
при использовании TPL-шаблонизатора. Логика для XSLT-будет аналогичная. В данном случае,  
 
при использовании TPL-шаблонизатора. Логика для XSLT-будет аналогичная. В данном случае,  
 
динамическим меню называется то меню, которое изменяется в зависимости от того в каком разделе каталога мы находимся,
 
динамическим меню называется то меню, которое изменяется в зависимости от того в каком разделе каталога мы находимся,
т.е. определенная ветка меню раскрыта, другие свернуты. Логика кеша заключается в том, что должен быть
+
т.е. определенная ветка меню раскрыта, другие свернуты. Логика кэша заключается в том, что должен быть
кеш-файл на каждый раздел каталога. Будет подключаться тот кеш файл, который связан с текущим "Разделом
+
кэш-файл на каждый раздел каталога. Будет подключаться тот кэш-файл, который связан с текущим "Разделом
 
каталога". Если посетитель находится на странице "Объекта каталога", то проверяется к какому разделу каталога принадлежит
 
каталога". Если посетитель находится на странице "Объекта каталога", то проверяется к какому разделу каталога принадлежит
данный объект, и потом берется кеш связанный с этим разделом каталога. Также, должен быть еще один кеш для случая
+
данный объект, и потом берется кэш связанный с этим разделом каталога. Также, должен быть еще один кэш для случая
 
когда пользователь находится на странице, которая не является ни разделом каталога, ни объектом каталога.
 
когда пользователь находится на странице, которая не является ни разделом каталога, ни объектом каталога.
 
Для реализации данной задачи добавим дополнительный кастомный php-метод в файл classes/modules/custom.php:
 
Для реализации данной задачи добавим дополнительный кастомный php-метод в файл classes/modules/custom.php:
 
<source lang="php">
 
<source lang="php">
 
   public function menuLeftCustom(){
 
   public function menuLeftCustom(){
         // время жизни кеш-файла
+
         // время жизни кэш-файла
 
         $expire = 86400;
 
         $expire = 86400;
 
         $folder = CURRENT_WORKING_DIR . '/sys-temp/tplcache/';
 
         $folder = CURRENT_WORKING_DIR . '/sys-temp/tplcache/';
Строка 68: Строка 68:
 
</pre>
 
</pre>
  
[[Категория: Верстка в TPL]]
+
[[Категория: Верстка в TPL]][[Категория:Кеширование]]

Текущая версия на 12:18, 5 июня 2013

В данной статье будет рассмотрен пример кэширования динамического многоуровнего меню разделов каталога, при использовании 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);