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