Традиционно вся логика компонента Битрикс размещалась в файле component.php.
Это простой и понятный подход, но для сложных компонентов он приводит к «лапше» из кода.
Современный стандарт разработки (Компоненты 2.0) предлагает использовать ООП и выносить всю логику в отдельный файл class.php.
Зачем нужен class.php?
- Структура и читаемость: Код разбивается на логические методы, а не лежит одной «простыней».
- Наследование: Можно создавать базовые классы компонентов и наследовать от них, переиспользуя общую логику.
- Тестируемость: Методы класса гораздо проще тестировать, чем файл component.php.
- Инкапсуляция: Вся логика компонента инкапсулируется внутри одного класса.
Как это работает?
Если в папке компонента существует файл class.php, Битрикс автоматически создает экземпляр этого класса и вызывает его методы, игнорируя при этом component.php.
Структура класса компонента
Класс компонента должен наследоваться от CBitrixComponent и реализовывать как минимум один метод — executeComponent().
// /local/components/my/simple.comp/class.php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
class MySimpleComponent extends CBitrixComponent
{
/**
* Подготовка параметров компонента
* @param array $arParams
* @return array
*/
public function onPrepareComponentParams($arParams)
{
// Здесь мы обрабатываем и валидируем входящие параметры
$arParams['CACHE_TIME'] = (int)($arParams['CACHE_TIME'] ?? 3600);
$arParams['ELEMENT_ID'] = (int)($arParams['ELEMENT_ID'] ?? 0);
return $arParams;
}
/**
* Основной метод, выполняющий логику компонента
* @return mixed
*/
public function executeComponent()
{
// Проверяем входящие параметры после обработки в onPrepareComponentParams
if ($this->arParams['ELEMENT_ID'] <= 0) {
ShowError("Не указан ID элемента");
return;
}
// Логика кэширования
if ($this->startResultCache()) {
// --- Логика получения данных ---
CModule::IncludeModule('iblock');
$this->arResult['ELEMENT'] = CIBlockElement::GetByID($this->arParams['ELEMENT_ID'])->GetNext();
// -----------------------------
if (empty($this->arResult['ELEMENT'])) {
$this->abortResultCache();
// Тут можно показать 404
return;
}
// Подключаем шаблон
$this->includeComponentTemplate();
}
// Какие-то действия после кэша, например, установка заголовка
$APPLICATION->SetTitle($this->arResult['ELEMENT']['NAME']);
}
}
Два главных метода
- onPrepareComponentParams($arParams)
- Назначение: Первичная обработка и валидация входящих параметров ($this->arParams).
- Когда вызывается: До executeComponent и до начала кэширования.
- Что делает: Приводит типы (например, (int)), устанавливает значения по умолчанию.
- Что возвращает: Обязательно должен вернуть обработанный массив $arParams.
- executeComponent()
- Назначение: Основная логика компонента — запросы к БД, вычисления, подготовка $this->arResult.
- Когда вызывается: После onPrepareComponentParams.
- Важно: Внутри этого метода вы управляете кэшированием (startResultCache) и подключением шаблона (includeComponentTemplate).
Что происходит с $arParams и $arResult?
Внутри класса компонента $arParams и $arResult становятся свойствами объекта: $this->arParams и $this->arResult. Это делает доступ к ним более явным.
Переход со старого подхода:
- Создайте файл class.php.
- Создайте класс, унаследованный от CBitrixComponent.
- Перенесите весь код из component.php в метод executeComponent().
- Замените все $arParams на $this->arParams и $arResult на $this->arResult.
- Вынесите код валидации и установки значений по умолчанию для параметров в onPrepareComponentParams().
- Удалите (или переименуйте) старый component.php.
Вывод:
Использование class.php — это современный стандарт, который делает ваши компоненты более структурированными, надежными и готовыми к дальнейшему расширению. Даже для простых компонентов этот подход предпочтительнее, так как он сразу приучает к правильной архитектуре.
class.php, CBitrixComponent, onPrepareComponentParams, executeComponent, компонент 2.0, ООП в компонентах, Битрикс.