Просмотров: 35811
Дата последнего изменения: 09.11.2023
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
4
5
Недоступно в лицензиях:
Ограничений нет
Универсальный способ исключения шаблона компонента из кэша
Часто возникают задачи, которым мешает кэширование шаблонов компонентов. Но только ради исключения шаблона из кэша не хочется кастомизировать компонент и от кэширования результата компонента отказываться тоже не хочется. Самый распространенный пример – голосование за элементы инфоблоков в списках или вывод рекламы.
Идея решения проста: переместить шаблон компонента в эпилог компонента:
- Скопировать шаблон компонента в адресное пространство шаблона сайта.
- В папке шаблона компонента создать файл component_epilog.php и полностью скопировать в него код из файла шаблона template.php. Затем в самом верху component_epilog.php сразу после проверки подключения эпилога ядра
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
перед началом непосредственно самого кода шаблона нужно добавить такой код:
<?
// заменяем $arResult эпилога значением, сохраненным в шаблоне
if(isset($arResult['arResult'])) {
$arResult =& $arResult['arResult'];
// подключаем языковой файл
global $MESS;
include_once(GetLangFileName(dirname(__FILE__).'/lang/', '/template.php'));
} else {
return;
}
?>
- Полностью очистить файл template.php и добавить такой код:
<?if(!defined('B_PROLOG_INCLUDED')||B_PROLOG_INCLUDED!==true)die();
?>
// добавляем к кэшируемому результату $arResult
if(property_exists($component, 'arResultCacheKeys')) {
if(!is_array($component->arResultCacheKeys)) {
$component->arResultCacheKeys = array();
}
$sVarName = 'arResult';
$component->arResultCacheKeys[] = $sVarName;
$component->arResult[$sVarName] = $$sVarName;
}
Теперь результат компонента кэшируется, а шаблон – нет.
Недостатки этого способа:
- Увеличение размера кэша. С размером кэша можно бороться путем включения в кэш только необходимых данных
- Шаблон все же постоянно генерирует html-код, что медленнее, чем вывод уже готового, ранее сформированного html-кода.