Как передать данные в component_epilog.php

1С-Битрикс, добавить данные в кеш в шаблоне компонента что бы они стали доступны в component_epilog.php

Иногда требуется в шаблоне компонента дополучить какие то данные и перенести их в component_epilog.php
Например возьмем стандартный компонент bitrix:news.list. Даже если мы добавим новый ключ в массив $arResult и разместим в нем наши данные, например:

<? $arResult['TEXT'] = 'Hello world!'; ?>

То эти данные не попадут в component_epilog.php, потому что компонент bitrix:news.list не добавляет в кэш все данные, он кэширует вывод всего HTML-кода, который выводит шаблон и дополнительно кэширует некоторые элементы массива $arResult, но не все.

Для того что бы нужные данные попали в component_epilog.php, их нужно добавить вручную. Для начала ваш шаблон компонента должен содержать следующий набор файлов.

..
lang
result_modifier.php
template.php
component_epilog.php

Где:

  1. lang - это папка с языковыми файлами (она необязательна), используется исключительно если ваш сайт мультиязычный, но об этом не в этой статье.
  2. result_modifier.php - Исполняется самым первым в шаблоне и служит для дополнительной обработки данных, получения дополнительных данных из базы или любых других операциях с данными. По правилам хорошего тона программирования в среде CMS 1С-Битрикс, всю дополнительную обработку данных нужно совершать тут. Если компонент использует кэш, то result_modifier.php попадает в ту часть работы компонента, которая кэшируется. Т.е. PHP-код в нем исполнится для первого пользователя, открывшего страницу, а для остальных пользователей результат его работы будет браться из кэша.
  3. template.php - Исполняется вторым по счету, служит для вывода HTML-кода компонента. Если компонент использует кэш, то template.php так же кэшируется.
  4. component_epilog.php - Это некэшируемая часть шаблона, весь его PHP-код будет исполняться при каждом открытии страницы.

С кратким описанием работы шаблона компонента разобрались, теперь как же передать данные в component_epilog.php?

Нам нужно, что бы наши данные попали в дата-кэш компонента. Т.е. в кэш, который отвечает за массив данных компонента.

Для этого (для нашего примера $arResult['TEXT']) в result_modifier.php добавим следующие строки:

<? $this->__component->SetResultCacheKeys(['TEXT']); ?>

Т.е. в метод SetResultCacheKeys() мы должны передать массив ключей из $arResult которые должны попасть в component_epilog.php

Если например нам нужно передать в component_epilog.php данные из $arResult['KEY1'], $arResult['KEY2'], $arResult['KEY3'] то код будет выглядеть так:

<? $this->__component->SetResultCacheKeys(['KEY1', 'KEY2', 'KEY3']); ?>

Теги: 1С-Битрикс, Cache, component_epilog.php, Шаблон, Компонент