В жизненном цикле компонента Битрикс есть специальный файл — component_epilog.php.
Он выполняется после того, как отработал template.php, то есть после того, как основной HTML компонента уже был сгенерирован и выведен в буфер.
Расположение: /path/to/component/templates/template_name/component_epilog.php
Зачем он нужен? Классические задачи
Основная ценность component_epilog.php в том, что на момент его выполнения уже точно известны все данные, которые были отображены пользователю.
Это идеальное место для задач, которые зависят от финального результата.
1. Установка SEO-заголовков и мета-тегов (SetPageProperty)
Это самая частая и правильная задача для эпилога.
Например, в детальной карточке товара (catalog.element) нужно установить title и description страницы на основе названия и описания товара.
Если сделать это в component.php, а в шаблоне по какой-то причине товар не будет выведен (например, сработает условие if), то мета-теги все равно установятся, что некорректно. В component_epilog.php мы уверены, что товар был показан.
// /components/bitrix/catalog.element/templates/.default/component_epilog.php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
/** @var array $arResult */
global $APPLICATION;
// Если у нас есть данные об элементе и они были выведены
if (isset($arResult['ID']) && $arResult['ID'] > 0) {
// Устанавливаем заголовок страницы (<title>)
$APPLICATION->SetPageProperty('title', $arResult['META_TITLE'] ?: $arResult['NAME']);
// Устанавливаем мета-тег description
$APPLICATION->SetPageProperty('description', $arResult['META_DESCRIPTION'] ?: '');
}
- Доступные переменные: В component_epilog.php доступны все те же переменные, что и в template.php: $arResult, $arParams, $component.
2. Добавление элементов в навигационную цепочку («хлебные крошки»)
Аналогично заголовкам, добавлять текущий элемент в «хлебные крошки» нужно только после того, как мы убедились, что он был показан.
// /components/bitrix/news.detail/templates/.default/component_epilog.php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
/** @var array $arResult */
global $APPLICATION;
if ($arParams["ADD_ELEMENT_CHAIN"] == "Y" && !empty($arResult['NAME'])) {
$APPLICATION->AddChainItem($arResult["NAME"]);
}
3. Подключение JS-расширений или выполнение JS-кода
Иногда JS-код или расширение требуются только если компонент успешно отработал и вывел определенные данные.
// component_epilog.php
if ($arResult['SHOW_GALLERY']) {
\CJSCore::Init(['popup', 'fx']);
// Можно даже сгенерировать JS-код на основе $arResult
?>
<script>
BX.ready(function(){
// Инициализация галереи для элемента с ID <?=$arResult['ID']?>
});
</script>
<?
}
Важно: Код из component_epilog.php выводится после основного HTML компонента. Если вы подключаете здесь JS, убедитесь, что это не приведет к ошибкам (например, скрипт не пытается найти DOM-элементы, которые были выше по коду).
Что НЕ нужно делать в component_epilog.php
- Выполнять «тяжелые» запросы к БД. Вся выборка данных должна быть в component.php. Эпилог — не для этого.
- Генерировать HTML-верстку. Весь HTML должен быть в template.php.
- Изменять $arResult. Это бессмысленно, так как template.php уже отработал.
Вывод:
component_epilog.php — это «последнее слово» компонента.
Он идеально подходит для «пост-обработки» страницы: установки заголовков, хлебных крошек и выполнения других действий, которые должны произойти гарантированно после того, как основной контент компонента был успешно сгенерирован.
Правильное использование эпилога делает ваши компоненты более логичными и предсказуемыми.
component_epilog.php, Битрикс, эпилог компонента, SetPageProperty, AddChainItem, SEO, хлебные крошки, жизненный цикл компонента.