Кэширование динамического многоуровнего меню — различия между версиями
Kalexey (обсуждение | вклад) м (переименовал «Кеширование динамического многоуровнего меню» в «Кэширование динамического многоуровнего меню») |
Mad grant (обсуждение | вклад) |
||
(не показана 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);