197  /  382
Справочник

Пример. Исключение шаблона компонента из кэша

Просмотров: 35120
Дата последнего изменения: 09.11.2023
Роберт Басыров
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

Универсальный способ исключения шаблона компонента из кэша

Часто возникают задачи, которым мешает кэширование шаблонов компонентов. Но только ради исключения шаблона из кэша не хочется кастомизировать компонент и от кэширования результата компонента отказываться тоже не хочется. Самый распространенный пример – голосование за элементы инфоблоков в списках или вывод рекламы.

Идея решения проста: переместить шаблон компонента в эпилог компонента:

  1. Скопировать шаблон компонента в адресное пространство шаблона сайта.
  2. В папке шаблона компонента создать файл 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;
    }
    ?>
    
  3. Полностью очистить файл 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;
    }

Теперь результат компонента кэшируется, а шаблон – нет.

Недостатки этого способа:

  1. Увеличение размера кэша. С размером кэша можно бороться путем включения в кэш только необходимых данных
  2. Шаблон все же постоянно генерирует html-код, что медленнее, чем вывод уже готового, ранее сформированного html-кода.

Примечание: если в компоненте используются методы CBitrixComponent::InitComponentTemplate и CBitrixComponent::ShowComponentTemplate, то такой компонент не подключает component_epilog.php. Например: bitrix:search.page.


20
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии