Файл component.php — сердце логики компонента,
отвечающее за подготовку данных до того, как шаблон начнёт что-то
выводить. Разберём его устройство, жизненный цикл выполнения
и типичную структуру, на которую стоит ориентироваться при
написании собственных компонентов.
Базовая структура файла
<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
die();
}
use Bitrix\Main\Loader;
Loader::includeModule('iblock');
$arResult = [];
if (!$this->startResultCache()) {
// кеш неактуален или отсутствует — данные нужно получить заново
$arResult['ITEMS'] = getItemsFromDatabase($arParams['IBLOCK_ID']);
$this->includeComponentTemplate();
} else {
// данные взяты из кеша — includeComponentTemplate вызывать не нужно,
// шаблон уже выведен автоматически при инициализации кеша
}
Проверка B_PROLOG_INCLUDED в начале файла — защита
от прямого обращения к файлу компонента в обход ядра системы,
обязательная для каждого файла, доступного напрямую по своему
физическому пути на файловой системе.
Параметры компонента: $arParams
Массив $arParams содержит значения, переданные
при вызове компонента через IncludeComponent —
это входные данные, определяющие поведение конкретного экземпляра
компонента на странице (ID инфоблока, количество элементов
для вывода, режим сортировки). Хорошая практика — валидировать
и приводить к нужному типу значения параметров в начале файла,
а не полагаться на то, что вызывающий код всегда передаст
корректные данные.
Нужна помощь с Битрикс?
Результат работы: $arResult
Массив $arResult — то, что компонент готовит для
шаблона: выбранные из базы данные, вычисленные значения, флаги
состояния. Структура этого массива — фактический контракт между
component.php и шаблоном: изменение структуры
$arResult без синхронного изменения шаблона ломает
вывод, даже если сам код component.php формально
выполняется без ошибок.
Механизм кеширования startResultCache
startResultCache() — встроенный механизм управляемого
кеша компонента: если валидный кеш существует, метод возвращает
false, данные и шаблон уже выводятся из кеша
автоматически, и код внутри условия не выполняется вовсе. Если
кеша нет или он невалиден, метод возвращает true,
выполняется реальный код получения данных, а в конце явно
вызывается includeComponentTemplate() для вывода
шаблона и сохранения результата в кеш для следующих обращений.
Явный отказ от кеширования конкретного результата
<?php
if ($this->startResultCache()) {
$arResult['ITEMS'] = getItemsFromDatabase();
if (empty($arResult['ITEMS'])) {
$this->abortResultCache(); // не кешировать пустой результат
}
$this->includeComponentTemplate();
}
Как и в ручном кешировании через CPHPCache, механизм
компонентов тоже поддерживает явную отмену сохранения в кеш —
полезно, когда полученные данные оказались пустыми или ошибочными
и не должны закешироваться как валидный результат на весь срок
жизни кеша.
Инициализация модулей до их использования
Подключение необходимых модулей через Loader::includeModule
должно происходить до обращения к их классам и функциям —
это очевидно, но частая причина ошибки "класс не найден" в новых
компонентах, когда разработчик забывает, что модуль, доступный
в одном месте проекта, не гарантированно уже подключён в контексте
конкретного компонента.
Работа с ошибками внутри компонента
<?php
if (empty($arParams['IBLOCK_ID'])) {
$this->abortResultCache();
ShowError('Не указан ID инфоблока для компонента');
return;
}
Явная проверка обязательных параметров с понятным сообщением
об ошибке через ShowError облегчает отладку
компонента при неправильном использовании — молчаливое выполнение
с некорректными или отсутствующими параметрами приводит
к труднообъяснимым пустым или неожиданным результатам без явного
указания на причину.
Частые ошибки
- Отсутствует проверка B_PROLOG_INCLUDED в начале файла. Риск прямого выполнения файла компонента в обход ядра системы.
- includeComponentTemplate вызывается вне условия startResultCache. Шаблон выводится дважды либо кешируется некорректно.
- Модуль подключается уже после обращения к его классам. Ошибка "класс не найден" в новых или недостаточно протестированных компонентах.
Итог
component.php отвечает за подготовку данных для шаблона
через связку $arParams (вход) и $arResult
(выход), обёрнутую в управляемый кеш через
startResultCache(). Правильное понимание того, когда
код внутри условия кеша реально выполняется, а когда данные берутся
готовыми из кеша, — ключ к написанию компонентов, которые работают
предсказуемо и эффективно используют встроенный механизм кеширования.
