Главная » Разработка Битрикс » Компоненты » class.php в Битрикс — компоненты на ООП

class.php в Битрикс — компоненты на ООП

Жизненный цикл компонента на ООП в Битрикс: подготовка параметров, выполнение логики, вывод шаблона

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 остаётся достаточным.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    База знаний