Блог Горошко Андрея 1C-Битрикс component_epilog.php Выполнение кода после вывода шаблона компонента

component_epilog.php Выполнение кода после вывода шаблона компонента

Средний рейтинг
Еще нет оценок

В жизненном цикле компонента Битрикс есть специальный файл — 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, хлебные крошки, жизненный цикл компонента.

Мой рейтинг:

Добавить комментарий

Related Post

Сила связей в D7 ORM: JOIN’ы и ReferenceField на практикеСила связей в D7 ORM: JOIN’ы и ReferenceField на практике

Средний рейтинг Еще нет оценок Мы уже умеем выбирать данные из одной таблицы с помощью getList. Но настоящая мощь ORM проявляется, когда нужно в одном запросе получить связанные данные из нескольких

Валидация данных в D7 ORM: Встроенные и кастомные валидаторыВалидация данных в D7 ORM: Встроенные и кастомные валидаторы

Средний рейтинг Еще нет оценок Валидация — это процесс проверки данных на корректность перед их сохранением. D7 ORM предоставляет мощный механизм валидаторов, который описывается прямо в getMap() вашей сущности. Это позволяет держать

ExpressionField в D7 ORM: SQL-функции и вычисления прямо в запросахExpressionField в D7 ORM: SQL-функции и вычисления прямо в запросах

Средний рейтинг Еще нет оценок ExpressionField — это мощный инструмент D7 ORM, который позволяет создавать «виртуальные» поля, значение которых вычисляется с помощью произвольного SQL-выражения. Это позволяет перенести часть логики с PHP