Автоматизация
Внедрение битрикс24 бесплатно
При покупке лицензии у меня
Подробнее
Назад

Передача данных между result_modifier и component_epilog в 1С-Битрикс: техническое решение

Передача данных между result_modifier и component_epilog в 1С-Битрикс: техническое решение
Передача данных между result_modifier и component_epilog в 1С-Битрикс: техническое решение

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

В этой статье я поделюсь найденным техническим решением, которое позволяет легитимно передавать данные через объект компонента, используя встроенные методы API Битрикс.

Техническая суть проблемы

Для понимания решения необходимо разобраться в жизненном цикле компонента. Когда мы работаем с типовым компонентом, последовательность выполнения файлов выглядит следующим образом:

Схема работы компонента с файлами result_modifier.php и component_epilog.php

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

  2. template.php — непосредственно вывод HTML с использованием подготовленных данных.

  3. component_epilog.php — выполняется после шаблона и используется для операций, которые не должны влиять на кеширование (установка title, мета-тегов, обработка данных для отложенных функций).

Ключевая особенность, которую важно учитывать: массив $arResult в component_epilog.php не наследует изменения, сделанные в result_modifier.php. Это архитектурное ограничение связано с тем, что component_epilog.php выполняется в контексте самого компонента, а не его шаблона. В результате все подготовленные данные оказываются недоступны на финальном этапе.

Практическая реализация решения

Для решения этой задачи я использую прямой доступ к объекту компонента и метод SetResultCacheKeys(). Рассмотрим реализацию на конкретном примере.

Постановка задачи

Предположим, мне необходимо вывести мета-теги для корректного отображения публикации в социальных сетях (Open Graph и Twitter Cards). Данные для заполнения этих тегов должны быть получены из элемента инфоблока, обработаны в result_modifier.php и переданы для установки через $APPLICATION->SetPageProperty() в component_epilog.php.

Кстати: Стандартный компонент bitrix:news.detail поставляемый с модулем "Информационные блоки", автоматически кеширует ключи IDIBLOCK_IDNAMEPREVIEW_TEXTDETAIL_PAGE_URLDETAIL_PICTURE и PREVIEW_PICTURE. Этого достаточно для базовой SEO-разметки, но для передачи произвольных обработанных данных требуется явное указание ключей.

Шаг 1. Модификация result_modifier.php

В файле модификатора я получаю ссылку на объект компонента и сохраняю необходимые данные:

<?php
// result_modifier.php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();

// Получаем объект текущего компонента
$component = $this->__component;

// Проверяем, что объект компонента существует
if (is_object($component)) {
    // Формируем URL для og:image (может потребоваться ресайз или другая обработка)
    if (!empty($arResult['DETAIL_PICTURE'])) {
        $arResult['OG_IMAGE'] = CFile::GetPath($arResult['DETAIL_PICTURE']);
    } elseif (!empty($arResult['PREVIEW_PICTURE'])) {
        $arResult['OG_IMAGE'] = CFile::GetPath($arResult['PREVIEW_PICTURE']);
    }
    
    // Сохраняем данные в глобальный массив результата компонента
    $component->arResult['OG_IMAGE'] = $arResult['OG_IMAGE'];
    $component->arResult['OG_TITLE'] = $arResult['NAME'];
    $component->arResult['OG_DESCRIPTION'] = truncateText($arResult['PREVIEW_TEXT'], 200); // пользовательская функция обработки
    
    // Регистрируем ключи для кеширования
    $component->SetResultCacheKeys([
        'OG_IMAGE',
        'OG_TITLE',
        'OG_DESCRIPTION'
    ]);
}

Пояснение к коду:

  • $this->__component предоставляет доступ к объекту компонента из любого файла шаблона

  • Запись в $component->arResult напрямую модифицирует массив, который будет передан в component_epilog.php

  • SetResultCacheKeys() критически важен — без вызова этого метода сохраненные данные будут потеряны при использовании кеширования

Шаг 2. Использование данных в component_epilog.php

Теперь в файле component_epilog.php я могу получить доступ к сохраненным данным:

<?php
// component_epilog.php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();

// Проверяем наличие данных перед использованием
if (!empty($arResult['OG_IMAGE'])) {
    // Устанавливаем Open Graph теги
    $APPLICATION->SetPageProperty('og:image', $arResult['OG_IMAGE']);
    $APPLICATION->SetPageProperty('og:title', $arResult['OG_TITLE']);
    $APPLICATION->SetPageProperty('og:description', $arResult['OG_DESCRIPTION']);
    $APPLICATION->SetPageProperty('og:url', $APPLICATION->GetCurPage(true));
    $APPLICATION->SetPageProperty('og:type', 'website');
    $APPLICATION->SetPageProperty('og:locale', 'ru_RU');
    
    // Устанавливаем теги для Twitter Cards
    $APPLICATION->SetPageProperty('twitter:card', 'summary_large_image');
    $APPLICATION->SetPageProperty('twitter:title', $arResult['OG_TITLE']);
    $APPLICATION->SetPageProperty('twitter:description', $arResult['OG_DESCRIPTION']);
    $APPLICATION->SetPageProperty('twitter:image', $arResult['OG_IMAGE']);
    
    // Каноническая ссылка
    $APPLICATION->SetPageProperty('canonical', $APPLICATION->GetCurPage(true));
}

В результате в секции <head> страницы будут корректно выведены мета-теги, необходимые для социальных сетей:

<meta property="og:url" content="https://example.com/blog/current-article/" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Заголовок текущей статьи" />
<meta property="og:description" content="Краткое описание статьи..." />
<meta property="og:image" content="https://example.com/upload/resized/image.jpg" />
<meta property="og:locale" content="ru_RU" />
<meta name="twitter:card" content="summary_large_image" />
<link href="https://example.com/blog/current-article/" rel="canonical" />

Технические преимущества подхода

Применение данного метода дает несколько архитектурных преимуществ:

  1. Соблюдение единства ответственности: логика подготовки данных инкапсулирована в result_modifier.php, а логика их применения — в component_epilog.php

  2. Кеширование без потерь: метод SetResultCacheKeys() гарантирует, что данные сохраняются в кеше компонента

  3. Отсутствие дублирования запросов: не требуется повторно обращаться к базе данных или файловой системе

  4. Типобезопасность: передаются оригинальные типы данных, включая массивы и объекты

Заключение

Предложенное решение позволяет эффективно организовывать работу с данными в компонентах 1С-Битрикс, избегая избыточных запросов и дублирования кода. Использование объекта компонента и метода SetResultCacheKeys() — это документированный и поддерживаемый разработчиками платформы подход, который гарантирует корректную работу как с включенным, так и с выключенным кешированием.

Требуется внедрить это решение или оптимизировать сайт?

Разберем существующий код, настроим передачу данных между компонентами, улучшим SEO-метки и ускорим работу вашего проекта на 1С-Битрикс. Индивидуальный подход и чистый код.

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