Назад

Эффективная передача данных в Битрикс: из result_modifier.php в component_epilog.php

Главная
Блог
Эффективная передача данных в Битрикс: из result_modifier.php в component_epilog.php

Работая с компонентами в 1С-Битрикс, разработчики часто сталкиваются с архитектурными особенностями фреймворка. Одна из таких тонкостей — ограниченность области видимости данных. Переменные, обработанные в result_modifier.php, по умолчанию недоступны в component_epilog.php. Это может привести к необходимости дублировать код или делать лишние запросы к базе данных, что неэффективно.

В этой статье мы разберем простое и элегантное решение, позволяющее напрямую передать любые данные из result_modifier.php в component_epilog.php, используя встроенные возможности API Битрикс.

В чем заключается проблема?

Стандартный жизненный цикл работы комплексного компонента включает несколько этапов:

  1. result_modifier.php — здесь мы модифицируем и подготавливаем массив $arResult перед его отправкой в шаблон.

  2. template.php — шаблон, где происходит основное отображение данных.

  3. 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) или подготовки информации для сложных шаблонов.

Надеемся, этот способ сделает вашу работу с Битрикс еще более эффективной и осознанной. Удачи в разработке

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи