Пример. Исключение шаблона компонента из кэша
Универсальный способ исключения шаблона компонента из кэша
Часто возникают задачи, которым мешает кэширование шаблонов компонентов. Но только ради исключения шаблона из кэша не хочется кастомизировать компонент и от кэширования результата компонента отказываться тоже не хочется. Самый распространенный пример – голосование за элементы инфоблоков в списках или вывод рекламы.
Идея решения проста: переместить шаблон компонента в эпилог компонента:
- Скопировать шаблон компонента в адресное пространство шаблона сайта.
- В папке шаблона компонента создать файл 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;
}
?>
<?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-кода.
Примечание: если в компоненте используются методы CBitrixComponent::InitComponentTemplate и CBitrixComponent::ShowComponentTemplate, то такой компонент не подключает component_epilog.php. Например: bitrix:search.page.