Блог Горошко Андрея 1C-Битрикс result_modifier.php: Модификация данных компонента перед выводом в шаблон

result_modifier.php: Модификация данных компонента перед выводом в шаблон

Средний рейтинг
Еще нет оценок

Файл result_modifier.php — это специальный файл в шаблоне компонента, который выполняется после component.php, но до template.php.

Его главная и единственная задача — модифицировать массив $arResult, подготавливая его к максимально простому выводу в шаблоне.

Зачем он нужен? (Принцип «простого» шаблона)

Идеальный template.php должен быть «простым» — содержать минимум PHP-логики, в основном циклы foreach и echo.

В нем не должно быть вызовов CFile::ResizeImageGet, форматирования дат, сложных вычислений или группировки массивов. Всю эту «подготовительную» работу и должен выполнять result_modifier.php.

Схема работы:

  1. component.php: Получает «сырые» данные из базы (GetList) и складывает их в $arResult.
  2. result_modifier.php: Берет $arResult, обрабатывает его (ресайзит картинки, форматирует даты, группирует) и изменяет $arResult по ссылке.
  3. template.php: Получает уже полностью готовый к выводу $arResult и просто выводит его в HTML.

Пример: Подготовка данных для списка новостей

Задача: Для списка новостей нужно:

  1. Подготовить миниатюру для PREVIEW_PICTURE размером 200×200.
  2. Отформатировать дату ACTIVE_FROM в удобный вид «день.месяц.год».

Плохой подход (логика в template.php)

// template.php - НЕ ДЕЛАЙТЕ ТАК!
foreach ($arResult['ITEMS'] as $arItem) {
    $resizedImage = CFile::ResizeImageGet(
        $arItem['PREVIEW_PICTURE'], 
        ['width'=>200, 'height'=>200], 
        BX_RESIZE_IMAGE_PROPORTIONAL
    );
    
    $formattedDate = CIBlockFormatProperties::DateFormat(
        'd.m.Y', 
        MakeTimeStamp($arItem['ACTIVE_FROM'], CSite::GetDateFormat())
    );

    echo '<img src="'.$resizedImage['src'].'">';
    echo '<span>'.$formattedDate.'</span>';
}
// Проблема: Логика смешана с версткой, код повторяется в цикле, его сложно читать.

// Правильный подход (используем `result_modifier.php`):

// component.php`:

// component.php - просто получаем данные
$arResult['ITEMS'] = [];
$rsElements = CIBlockElement::GetList(...);
while($ob = $rsElements->GetNextElement()){ 
    $arFields = $ob->GetFields();  
    $arResult['ITEMS'][] = $arFields;
}

result_modifier.php

// /path/to/component/templates/.default/result_modifier.php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();

/** @var array $arResult */

foreach ($arResult['ITEMS'] as &$arItem) { // Обрабатываем по ссылке (&), чтобы изменить массив
    
    // 1. Ресайз изображения
    if (!empty($arItem['PREVIEW_PICTURE'])) {
        $resized = CFile::ResizeImageGet(
            $arItem['PREVIEW_PICTURE'],
            ['width' => 200, 'height' => 200],
            BX_RESIZE_IMAGE_PROPORTIONAL
        );
        $arItem['PREVIEW_PICTURE_RESIZED'] = $resized;
    }

    // 2. Форматирование даты
    if (!empty($arItem['ACTIVE_FROM'])) {
        $arItem['DISPLAY_ACTIVE_FROM'] = CIBlockFormatProperties::DateFormat(
            'd.m.Y',
            MakeTimeStamp($arItem['ACTIVE_FROM'], CSite::GetDateFormat())
        );
    }
}
unset($arItem); // Обязательно сбрасываем ссылку после цикла

template.php

// template.php - теперь он "тупой" и чистый
foreach ($arResult['ITEMS'] as $arItem) {
    if (isset($arItem['PREVIEW_PICTURE_RESIZED'])) {
        echo '<img src="' . $arItem['PREVIEW_PICTURE_RESIZED']['src'] . '">';
    }
    if (isset($arItem['DISPLAY_ACTIVE_FROM'])) {
        echo '<span>' . $arItem['DISPLAY_ACTIVE_FROM'] . '</span>';
    }
}

Вывод:
result_modifier.php — это важнейший инструмент для соблюдения принципа разделения логики и представления. Он позволяет держать component.php чистым от «украшательств», а template.php — свободным от сложной логики.

Правильное использование этого файла делает ваши компоненты более профессиональными, гибкими и легкими в поддержке.

result_modifier.php, Битрикс, модификация arResult, подготовка данных, CFile::ResizeImageGet, компонент Битрикс, шаблон.

Мой рейтинг:

Добавить комментарий

Related Post

Создание комплексных компонентов в Битрикс: SEF_MODE, urlrewrite и ЧПУСоздание комплексных компонентов в Битрикс: SEF_MODE, urlrewrite и ЧПУ

Средний рейтинг Еще нет оценок Комплексный компонент не выводит информацию сам. Его главная задача — работать как маршрутизатор (роутер). Он анализирует URL-адрес и, в зависимости от него, подключает один из нескольких простых компонентов,

Обмен данными между 1С и Битрикс: детальное руководствоОбмен данными между 1С и Битрикс: детальное руководство

Средний рейтинг Еще нет оценок Эта статья подробно описывает процесс обмена данными между 1С и сайтом на базе 1С-Битрикс, используя компонент catalog.import.1c (импорт каталога товаров из 1С на сайт). Мы

Создание кастомной страницы в административной панели БитриксСоздание кастомной страницы в административной панели Битрикс

Средний рейтинг Еще нет оценок Иногда стандартного функционала админки не хватает. Требуется создать страницу для кастомного отчета, дашборда или инструмента управления. Битрикс позволяет легко интегрировать свои страницы в административный интерфейс.