162  /  331

Файл component_epilog.php

Просмотров: 13703 (Статистика ведётся с 06.02.2017)
Файл component_epilog.php - инструмент для модификации данных работы компонента с включенным кешированием. Создается разработчиком самостоятельно. (Доступен с версии 9.0.)

Схема работы компонента с файлами 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",
                ));

При разработке своих компонентов обязательно используйте такую конструкцию чтобы ограничить размер кеша только необходимыми данными.

Примечание В файле component_epilog.php может быть любой код - только следует учитывать, что исполняться он будет независимо от наличия кеша на каждом хите. До версии главного модуля 10.0 в шаблон компонента передавалась копия массива 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");

Список ссылок по теме:


27
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии