Дата последнего изменения: 09.11.2023
Схема работы компонента с файлами result_modifier.php и component_epilog.php:

Этот файл подключается после исполнения шаблона. Аналогично файлам стилей, родительский компонент сохраняет в своем кеше список файлов эпилогов всех шаблонов дочерних компонентов (возможно вложенных), а при хите в кеш подключает эти файлы в том же порядке, как они исполнялись без кеширования. Точно так же при вызове дочерних компонентов в шаблоне нужно передавать значение $component.
В файле component_epilog.php доступны $arParams, $arResult, но эти значения берутся из кеша. Набор ключей массива $arResult, попадающих в кеш, определяется в component.php вызовом вида:
$this->SetResultCacheKeys(array( "ID", "IBLOCK_TYPE_ID", "LIST_PAGE_URL", "NAV_CACHED_DATA", "NAME", "SECTION", "ELEMENTS", ));
При разработке своих компонентов обязательно используйте такую конструкцию чтобы ограничить размер кеша только необходимыми данными.
arResult. В силу этого модификация этого массива в файле result_modifier.php не давала никаких результатов. Чтобы стало возможным изменение результатов вывода закешированных данных нужно разместить в файле result_modifier.php следующий код:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
global $APPLICATION;
$cp = $this->__component; // объект компонента
if (is_object($cp))
{
// добавим в arResult компонента два поля - MY_TITLE и IS_OBJECT
$cp->arResult['MY_TITLE'] = 'Мое название';
$cp->arResult['IS_OBJECT'] = 'Y';
$cp->SetResultCacheKeys(array('MY_TITLE','IS_OBJECT'));
$APPLICATION->SetTitle($cp->arResult['MY_TITLE']); // не будет работать на каждом хите:
//отработает только первый раз, затем будет все браться из кеша и вызова $APPLICATION->SetTitle()
// не будет. Поэтому изменение title делается в component_epilog, который выполняется на каждом хите.
}
?>
После чего изменения arResult, совершенные в шаблоне, станут доступны в component_epilog.php.
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
global $APPLICATION;
if (isset($arResult['MY_TITLE']))
$APPLICATION->SetTitle($arResult['MY_TITLE']);
?>
Файл component_epilog.php подключается непосредственно после подключения и исполнения шаблона. Таким образом, если в компоненте идёт подключение шаблона, а затем в коде компонента следуют ещё операции, то они будут выполнены уже после выполнения файла component_epilog.php.
Соответственно, в случае совпадения изменяемых данных в component_epilog.php и в коде компонента после подключения шаблона выведены будут только последние данные, то есть из кода компонента.
Пример такой ситуации
Используем файл component_epilog.php из примера выше. А в коде компонента (файл component.php) есть такой код:
<?
$this->IncludeComponentTemplate();
if($arParams["SET_TITLE"])
{
$APPLICATION->SetTitle($arResult["NAME"]);
}
?>
В этом случае вы не получите желаемого результата, выведутся данные компонента, а не component_epilog.php.
В файле component_epilog.php доступны:
$arParams - параметры, чтение/изменение не затрагивает одноименный член компонента.$arResult — результат, чтение/изменение не затрагивает одноименный член класса компонента.$componentPath — путь к папке с компонентом от DOCUMENT_ROOT (например /bitrix/components/bitrix/iblock.list).$component — ссылка на $this.$this — ссылка на текущий вызванный компонент (объект класса CBitrixComponent), можно использовать все методы класса.$epilogFile — путь к файлу component_epilog.php относительно DOCUMENT_ROOT$templateName - имя шаблона компонента (например: .dеfault)$templateFile — путь к файлу шаблона от DOCUMENT_ROOT (напр. /bitrix/components/bitrix/iblock.list/templates/.default/template.php)$templateFolder — путь к папке с шаблоном от DOCUMENT_ROOT (напр. /bitrix/components/bitrix/iblock.list/templates/.default)$templateData — обратите внимание, таким образом можно передать данные из template.php в файл component_epilog.php, причем эти данные закешируются и будут доступны в component_epilog.php на каждом хите/$APPLICATION, $USER, $DB — глобальные переменные.Задача: языковые фразы компонента по результатам работы файла component_epilog.php должны быть иными, чем в самом компоненте. В этом случае надо учитывать что размещать текстовые фразы в /lang/ru/template.php для файла component_epilog.php нет смысла: при попадании в кеш языковый файл не подключается.
Решение: создавать файл /lang/ru/component_epilog.php и самостоятельно подключить его кодом:
use \Bitrix\Main\Localization\Loc;
Loc::loadLanguageFile(__FILE__);
Loc::getMessage("MY_MESS");