то ждем ваше обращение в нашей службе тех поддержки.
Файл component_epilog.php
Схема работы компонента с файлами 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'));
// сохраним их в копии arResult, с которой работает шаблон
$arResult['MY_TITLE'] = $cp->arResult['MY_TITLE'];
$arResult['IS_OBJECT'] = $cp->arResult['IS_OBJECT'];
$APPLICATION->SetTitle($cp->arResult['MY_TITLE']); // не будет работать на каждом хите:
//отработает только первый раз, затем будет все браться из кеша и вызова $APPLICATION->SetTitle()
// не будет. Поэтому изменение title делается в component_epilog, который выполняется на каждом хите.
}
?>
После чего изменения arResult, совершенные в шаблоне, станут доступны в component_epilog.php.
Пример файла 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");
Список ссылок по теме:
Назад в раздел
Наверх