result_modifier.php — это место, где массив $arResult дорабатывают перед выводом, не засоряя template.php логикой. Понимание его связи с кэшем избавляет от классических ошибок вроде «в кэш попали чужие данные».
Что такое result_modifier
result_modifier.php — необязательный файл шаблона компонента, который лежит рядом с template.php. Его задача — модифицировать массив $arResult, подготовленный компонентом, прежде чем он попадёт в вёрстку.
Идея в разделении ответственности: component.php формирует данные, result_modifier.php адаптирует их под конкретный шаблон, а template.php занимается только HTML. Внутри файла доступны те же переменные, что и в шаблоне: $arResult, $arParams, $this (объект шаблона).
/local/templates/main/components/bitrix/news.list/my/result_modifier.php. Если файла нет — этап просто пропускается.Порядок выполнения файлов шаблона
Чтобы не путаться, где что выполнять, важно помнить последовательность подключения файлов внутри includeComponentTemplate():
| # | Файл | Кэшируется |
|---|---|---|
| 1 | result_modifier.php | Да |
| 2 | template.php | Да |
| 3 | component_epilog.php | Нет |
То есть result_modifier.php выполняется первым и его результат сохраняется в кэше шаблона вместе с готовым HTML. Это ключевой момент для понимания дальнейших ограничений.
Практический пример
Типовая задача — подготовить данные для вывода: отформатировать цены, собрать массив изображений, вычислить скидку. Всё это уместно в result_modifier:
<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
foreach ($arResult['ITEMS'] as $key => $item) {
$old = (float)$item['PROPERTIES']['OLD_PRICE']['VALUE'];
$new = (float)$item['PROPERTIES']['PRICE']['VALUE'];
$arResult['ITEMS'][$key]['DISCOUNT'] =
$old > 0 ? round(($old - $new) / $old * 100) : 0;
}
?>
Теперь в template.php достаточно вывести $item['DISCOUNT'] без единой строки вычислений. Так шаблон остаётся чистым, а расчёты — переиспользуемыми и тестируемыми.
Аналогично поступают со сборкой галерей: в модификаторе получают файлы свойств через CFile::GetFileArray(), формируют массив путей и превью нужного размера, а шаблон просто перебирает готовую структуру. Обратите внимание: обращение к CFile и CIBlock здесь допустимо, потому что данные не персональные и корректно кэшируются вместе с остальным выводом. Ещё один частый случай — построение хлебных крошек и SEO-полей на основе $arResult, но именно установку заголовка страницы переносят в эпилог, а в модификаторе лишь готовят строку.
Ловушки кэширования
Поскольку результат result_modifier.php кэшируется, любые данные, которые он добавляет в $arResult, «замораживаются» вместе с HTML. Отсюда — правила:
- не обращайтесь здесь к текущему пользователю (
$USER), корзине, правам — эти данные попадут в общий кэш; - не делайте тяжёлых запросов к БД без необходимости — они выполнятся один раз и закэшируются, но при промахе кэша дадут нагрузку;
- время и «сейчас» тоже кэшируются — не рассчитывайте таймеры акций здесь.
component_epilog.php, который выполняется всегда мимо кэша, либо догружайте их AJAX-запросом.result_modifier против component_epilog
Оба файла модифицируют вывод, но решают разные задачи. Разница — в кэшировании и моменте выполнения.
| Критерий | result_modifier | component_epilog |
|---|---|---|
| Момент | До template.php | После, всегда |
| Кэш | Кэшируется | Мимо кэша |
| Задача | Подготовка данных вывода | Title, крошки, персональные данные |
Данные для эпилога передают из component.php через $this->__component->arResult, потому что в самом эпилоге переменная $arResult не гарантирована после кэша.
На практике связка выглядит так: тяжёлую и общую подготовку данных делают в result_modifier.php и кэшируют, лёгкую персонализацию (отметка «в избранном», «в корзине», приветствие по имени) выполняют в component_epilog.php, а сам HTML собирают в template.php. Если перепутать слои, вы либо закэшируете чужие данные, либо потеряете преимущества кэша, выполняя дорогие запросы на каждый хит.
Хорошие практики
Несколько правил, которые делают result_modifier предсказуемым:
- всегда начинайте файл с проверки
if (!defined('B_PROLOG_INCLUDED')...) die();— защита от прямого вызова; - работайте только с уже полученными данными, не запускайте бизнес-логику модулей;
- используйте ссылку
&$itemв цикле или явную запись по ключу, не забываяunset()после foreach по ссылке; - сложные преобразования выносите в отдельный класс-хелпер в
/local/php_interface/, а из модификатора лишь вызывайте его.
Такой подход держит шаблон тонким, а логику — переиспользуемой между разными шаблонами одного компонента.
Отладку модификатора удобно вести с временно отключённым кэшем компонента ('CACHE_TYPE' => 'N'), иначе изменения в файле не будут видны, пока кэш не сброшен. После правок обязательно очищайте кэш компонента через Настройки → Кэш → Очистить файлы кэша или BXClearCache(), чтобы новая логика попала в закэшированный вывод. Это частая причина «код изменил, а на странице всё по-старому».
Итог
result_modifier.php — правильное место для подготовки $arResult к выводу: форматирование, вычисления, сборка вспомогательных структур. Он выполняется до шаблона и кэшируется, поэтому персональные и «сиюминутные» данные ему не место — для них есть component_epilog.php.
Когда шаблоны обрастают логикой и её становится трудно поддерживать, мы в B2Bsite наводим порядок: выносим подготовку данных в модификаторы и хелперы, разделяем кэшируемое и персональное, и делаем вывод компонентов прозрачным для дальнейшей поддержки.
Частые вопросы
Когда выполняется result_modifier.php относительно template.php?
Он выполняется первым, ещё до подключения template.php. Его задача — доработать массив $arResult, чтобы шаблон занимался только выводом уже готовых данных.
Кэшируется ли результат result_modifier.php?
Да, он попадает в кэш шаблона вместе с готовым HTML. Поэтому в нём нельзя формировать данные, зависящие от текущего пользователя или времени.
Почему нельзя обращаться к $USER в result_modifier?
Потому что результат кэшируется и станет общим для всех посетителей. Данные первого пользователя, попавшие в кэш, увидят и остальные. Персональные данные выносят в component_epilog или AJAX.
Чем result_modifier отличается от component_epilog?
result_modifier выполняется до шаблона и кэшируется, готовя данные вывода. component_epilog выполняется после шаблона, всегда мимо кэша, и подходит для title, хлебных крошек и персональных блоков.
Нужна ли проверка B_PROLOG_INCLUDED в начале файла?
Да, это стандартная защита от прямого обращения к файлу по URL. Без неё возможен запуск скрипта вне контекста Битрикс, что небезопасно.
Можно ли делать запросы к БД в result_modifier?
Небольшие вспомогательные запросы допустимы, но помните про кэш: они выполнятся один раз и закэшируются. Тяжёлую логику лучше вынести в хелпер и контролировать частоту сброса кэша.
Как передать данные из component.php в component_epilog?
Через свойство $this->__component->arResult в component.php. В самом эпилоге эти данные доступны как $arResult у объекта компонента, минуя кэш шаблона.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.