Дата последнего изменения: 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");