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