class.php превращает компонент из набора процедурного кода
в объект, наследующий базовый класс ядра. Это второй способ написать
свой компонент — рядом с более простым вариантом на файле
component.php, — и он даёт больше контроля над жизненным
циклом выполнения.
Минимальная структура
<?php
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
die();
}
class CatalogTopComponent extends \CBitrixComponent
{
public function onPrepareComponentParams($arParams)
{
$arParams['IBLOCK_ID'] = (int)($arParams['IBLOCK_ID'] ?? 0);
$arParams['ITEMS_COUNT'] = (int)($arParams['ITEMS_COUNT'] ?? 8);
return $arParams;
}
public function executeComponent()
{
if (!Loader::includeModule('iblock')) {
$this->abortResultCache();
ShowError('Модуль iblock не подключён');
return;
}
$this->arResult['ITEMS'] = $this->getItems();
$this->includeComponentTemplate();
}
private function getItems(): array
{
$result = CIBlockElement::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => $this->arParams['IBLOCK_ID'], 'ACTIVE' => 'Y'],
false,
['nTopCount' => $this->arParams['ITEMS_COUNT']],
['ID', 'NAME', 'DETAIL_PAGE_URL']
);
$items = [];
while ($item = $result->GetNext()) {
$items[] = $item;
}
return $items;
}
}
Ключевые методы жизненного цикла
| Метод | Когда вызывается |
|---|---|
onPrepareComponentParams() |
Первым — для нормализации и проверки входных параметров |
executeComponent() |
Основная логика: получение данных и вывод шаблона |
onIncludeComponentLang() |
Подключение файлов языковых сообщений компонента |
getResult() |
Внешний доступ к результату работы компонента другим кодом |
onPrepareComponentParams() стоит использовать для приведения
типов и значений по умолчанию — это избавляет от повторяющихся проверок
внутри executeComponent() и делает компонент устойчивее
к некорректным входным параметрам.
Нужна помощь с Битрикс?
Работа с кешем внутри класса
<?php
public function executeComponent()
{
if ($this->startResultCache()) {
$this->arResult['ITEMS'] = $this->getItems();
$this->setResultCacheKeys(['ITEMS']);
$this->endResultCache();
}
$this->includeComponentTemplate();
}
Методы startResultCache() и endResultCache()
дают контроль над кешированием прямо из объекта компонента, без
ручной работы с классом Cache — параметры кеширования
при этом берутся из стандартных CACHE_TYPE и
CACHE_TIME, переданных в компонент при вызове.
Отличие от component.php
component.php |
class.php |
|
|---|---|---|
| Стиль | Процедурный | Объектно-ориентированный |
| Наследование логики | Невозможно | Компонент можно наследовать |
| Контроль над жизненным циклом | Ограниченный | Полный, через переопределяемые методы |
| Подходит для | Простых компонентов | Компонентов со сложной логикой |
Практическое преимущество объектного подхода — возможность создать компонент-потомок, унаследовав общую логику и переопределив только часть методов. Это удобно для семейства похожих компонентов — например, вывода товаров с разными вариантами фильтрации, где базовая выборка одинакова, а условия отличаются.
Частые ошибки
-
Логика выборки данных прямо в конструкторе.
Компонент должен выполнять работу в
executeComponent(), а не при создании объекта. -
Параметры не приводятся к нужному типу.
onPrepareComponentParams()существует именно для этого, и пропуск его снижает устойчивость компонента к некорректному вызову. -
Ручное кеширование вместо встроенных методов.
startResultCache()иendResultCache()уже интегрированы с параметрами компонента, дублировать эту логику вручную не нужно.
Итог
class.php оформляет компонент как класс, наследующий
CBitrixComponent, с чётким разделением подготовки параметров,
выполнения основной логики и работы с кешем через выделенные методы.
Выбирать такой подход стоит для компонентов со сложной логикой
или там, где предполагается создание семейства похожих компонентов
через наследование — для простых случаев процедурный
component.php остаётся достаточным.
