Работая с компонентами в 1С-Битрикс, разработчики часто сталкиваются с архитектурными особенностями фреймворка. Одна из таких тонкостей — ограниченность области видимости данных. Переменные, обработанные в result_modifier.php, по умолчанию недоступны в component_epilog.php. Это может привести к необходимости дублировать код или делать лишние запросы к базе данных, что неэффективно.
В этой статье мы разберем простое и элегантное решение, позволяющее напрямую передать любые данные из result_modifier.php в component_epilog.php, используя встроенные возможности API Битрикс.
В чем заключается проблема?
Стандартный жизненный цикл работы комплексного компонента включает несколько этапов:
-
result_modifier.php— здесь мы модифицируем и подготавливаем массив$arResultперед его отправкой в шаблон. -
template.php— шаблон, где происходит основное отображение данных. -
component_epilog.php— файл, выполняемый после шаблона, идеален для финальных действий, таких как установка свойств страницы или добавления данных в$APPLICATION.
Проблема в том, что все манипуляции с $arResult в result_modifier.php не изменяют исходный массив $arResult самого компонента. Они работают лишь с его локальной копией для шаблона. Поэтому при переходе в component_epilog.php мы снова видим "чистый" $arResult, и наши приготовленные в модификаторе данные теряются.
Решение: Используем мощь компонента
К счастью, в Битрикс предусмотрен механизм для решения этой задачи. Мы можем обратиться непосредственно к объекту компонента и сохранить нужные данные в его основном массиве arResult, указав системе кешировать эти значения.
Практический пример
Представим, что в компоненте детального просмотра элемента инфоблока мы подготовили в result_modifier.php пути к картинкам и текст. Нам нужно установить их как свойства страницы ($APPLICATION->SetPageProperty) в component_epilog.php, чтобы, например, вывести в мета-теги og:image для социальных сетей.
1. Модифицируем result_modifier.php
В конце файла result_modifier.php добавляем следующий код:
<?php
// result_modifier.php
// ... ваш код модификации $arResult ...
// Получаем объект текущего компонента
$cp = $this->__component;
// Проверяем, что объект получен (защита от ошибок)
if (is_object($cp)) {
// Сохраняем нужные данные в "глобальный" arResult компонента
$cp->arResult['SPECIAL_LOGO_SRC'] = $arResult['PREVIEW_PICTURE']['SRC'];
$cp->arResult['SPECIAL_SLIDER_SRC'] = $arResult['DETAIL_PICTURE']['SRC'];
$cp->arResult['SPECIAL_DESCR'] = $arResult['PREVIEW_TEXT'];
// Сообщаем компоненту, что эти ключи нужно кешировать
$cp->SetResultCacheKeys([
'SPECIAL_LOGO_SRC',
'SPECIAL_SLIDER_SRC',
'SPECIAL_DESCR'
]);
}Что здесь происходит?
-
$this->__component— это ссылка на объект компонента, который управляет всей логикой. -
Мы записываем наши подготовленные данные напрямую в
$cp->arResult. Это тот самый массив, который будет доступен вcomponent_epilog.php. -
SetResultCacheKeys()— критически важный метод. Он указывает ядру Битрикс, что помимо стандартных данных, нужно закешировать и наши новые ключи. Без этого они "потеряются" при работе кеша.
2. Используем данные в component_epilog.php
Теперь в component_epilog.php наши переменные доступны в массиве $arResult и мы можем использовать их для любых целей.
<?php
// component_epilog.php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
// Устанавливаем свойства страницы, которые можно использовать в header.php
$APPLICATION->SetPageProperty('og:image', $arResult['SPECIAL_LOGO_SRC']);
$APPLICATION->SetPageProperty('og:description', $arResult['SPECIAL_DESCR']);
// Или просто сохраняем в глобальную переменную для последующего использования
$GLOBALS['SPECIAL_SLIDER_DATA'] = $arResult['SPECIAL_SLIDER_SRC'];Преимущества подхода
-
Экономия ресурсов: Вы избегаете повторных запросов к базе данных или инфоблоку в
component_epilog.php. -
Чистота кода: Логика подготовки данных находится в одном месте — в
result_modifier.php. -
Гибкость: Вы можете передавать любые данные, включая сложные массивы и объекты.
Этот метод отлично подходит для задач, связанных с SEO (установка мета-тегов, канонических ссылок), управления структурой данных страницы (JSON-LD) или подготовки информации для сложных шаблонов.
Надеемся, этот способ сделает вашу работу с Битрикс еще более эффективной и осознанной. Удачи в разработке