Файл result_modifier.php — это специальный файл в шаблоне компонента, который выполняется после component.php, но до template.php.
Его главная и единственная задача — модифицировать массив $arResult, подготавливая его к максимально простому выводу в шаблоне.
Зачем он нужен? (Принцип «простого» шаблона)
Идеальный template.php должен быть «простым» — содержать минимум PHP-логики, в основном циклы foreach и echo.
В нем не должно быть вызовов CFile::ResizeImageGet, форматирования дат, сложных вычислений или группировки массивов. Всю эту «подготовительную» работу и должен выполнять result_modifier.php.
Схема работы:
- component.php: Получает «сырые» данные из базы (GetList) и складывает их в $arResult.
- result_modifier.php: Берет $arResult, обрабатывает его (ресайзит картинки, форматирует даты, группирует) и изменяет $arResult по ссылке.
- template.php: Получает уже полностью готовый к выводу $arResult и просто выводит его в HTML.
Пример: Подготовка данных для списка новостей
Задача: Для списка новостей нужно:
- Подготовить миниатюру для PREVIEW_PICTURE размером 200×200.
- Отформатировать дату 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, компонент Битрикс, шаблон.