В версии 9.0 в шаблон компонента был добавлен файл component_epilog.phpэпилог компонента. Его особенность в том, что он, в отличие от файлов template.phpи result_modifier.php, исполняется при каждом вызове компонента, вне зависимости от наличия кеша. Кроме того, в component_epilog.php доступны привычные массивы$arParams и $arResult. В теории это означает, что все дополнительные действия можно выполнить в эпилоге, что заметно упрощает жизнь разработчику.

Эпилог и кеширование

Но, как обычно, теория с практикой немного расходятся. Если с $arParams проблем не возникает (так как по сути это предопределенный массив, который просто «пробрасывается» по всем файлам компонента), то c $arResult есть некоторые нюансы.

Поскольку эпилог вызывается всегда, в том числе при использовании кеша компонента, то и $arResult извлекается из кеша. Но многие компоненты кешируют не весь массив результата, а только некоторое его подмножество. Список ключей $arResult, значения которых необходимо закешировать, определяется вызовом метода SetResultCacheKeys() в файлеcomponent.php. Следовательно, в эпилоге будут доступны ключи $arResult только из этого списка.

Впрочем, данную проблему легко обойти. Достаточно в файле template.php выполнить вызов

$component->SetResultCacheKeys(array("key1", "key2", ...));

где key1 и key2 — ключи $arResult, которых не хватает в кеше. После такого вызова нужные данные попадут в кеш и будут доступны в файле эпилога.

Эпилог и модификатор результата

Более интересная ситуация возникает, когда содержимое $arResult изменяется в файле модификатора — result_modifier.php. Никакие изменения, выполненные в модификаторе, не видны в эпилоге. Причина такого поведения проста: в кеш записывается то состояние $arResult, которое имеется перед подключением шаблона компонента, а значит, до выполнения модификатора. Это уже накладывает серьезное ограничение на использованиеcomponent_epilog.php.

После очередного «увлекательного путешествия» по коду ядра Битрикса решение проблемы было найдено. Но сразу оговорюсь, что описываемое далее решение официально не документировано, поэтому пользоваться им надо с осторожностью.

Как оказалось, помимо $arResult и $arParams инфраструктура компонентов Битрикса предоставляет еще один предопределенный массив — $templateData. Этот массив объявляется перед выполнением template.php (но после выполненияresult_modifier.php, так что использовать его в модификаторе нельзя). А примечателен он тем, что кешируется вместе с $arResult и доступен в эпилоге компонета! Следовательно, если $arResult был изменен в модификаторе, и измененные данные необходимо использовать в эпилоге, то нужно в файле template.php записать измененные данные в массив$templateData. Следующий пример кода наглядно демострирует такой подход:


result_modifier.php
...
$arResult['CUSTOM_TITLE'] = 'Custom page title';
...

template.php
...
$templateData['CUSTOM_TITLE'] = $arResult['CUSTOM_TITLE'];
...

component_epilog.php
...
global $APPLICATION;
$APPLICATION->SetTitle($templateData['CUSTOM_TITLE']);
...

Эпилог и языковые файлы

Еще одна особенность эпилога — это работа с языковыми файлами. Языковые константы для эпилога должны располагаться не в файле lang/ru/component_epilog.php, как можно было бы ожидать, а в файле lang/ru/template.php. Мелочь, но тоже может стоить разработчику немало нервных клеток.

В качестве резюме: эпилог компонента — очень полезная штука, но следует помнить о его особенностях. Возможно, в следующих версиях Битрикса поведение эпилога будет все же доработано для более простого и очевидного использования.


Возврат к списку

Авторизация