Главная » Разработка Битрикс » Компоненты » Комплексные компоненты в Битрикс

Комплексные компоненты в Битрикс

Схема комплексного компонента в Битрикс: одна точка входа управляет несколькими страницами через ЧПУ

Комплексный компонент отличается от обычного одним принципиальным свойством: он сам управляет несколькими страницами через ЧПУ, вызывая внутри себя другие компоненты в зависимости от текущего адреса. bitrix:catalog и bitrix:sale.personal.section — типичные примеры: один вызов разворачивает список, детальную карточку, корзину и личный кабинет одновременно.

Чем комплексный компонент отличается от обычного

Обычный компонент Комплексный компонент
УправляетОдним блоком на страницеНесколькими страницами раздела
ЧПУНастраивается снаружиРазбирает и обрабатывает сам
Вызывает другие компонентыОбычно нетДа, внутри себя
Примерnews.listbitrix:catalog

Структура файлов

/local/components/vendor/catalog/
    component.php           // управляющая логика и разбор ЧПУ
    class.php                // альтернатива component.php
    .parameters.php          // параметры, включая SEF_MODE и шаблоны URL
    templates/.default/
        template.php          // общая обёртка страницы раздела
        components/
            bitrix.catalog.section/.default/
            bitrix.catalog.element/.default/

Ключевое отличие в структуре — внутри шаблона комплексного компонента лежат подключаемые компоненты-«потомки»: их шаблоны можно кастомизировать точно так же, как шаблоны обычных компонентов, копированием в структуру своего сайта.

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





    Разбор ЧПУ

    Комплексный компонент получает параметр SEF_MODE с описанием шаблонов URL для каждой из своих внутренних страниц:

    'SEF_MODE' => [
        'section' => ['TEMPLATE' => '#SECTION_CODE#/', 'VARIABLES' => ['SECTION_CODE']],
        'element' => ['TEMPLATE' => '#SECTION_CODE#/#ELEMENT_CODE#/', 'VARIABLES' => ['SECTION_CODE', 'ELEMENT_CODE']],
        'compare' => ['TEMPLATE' => 'compare/', 'VARIABLES' => []],
    ],

    По совпадению текущего адреса с одним из шаблонов компонент понимает, какую «внутреннюю страницу» показать, и извлекает переменные — например, код раздела и код элемента — прямо из URL, без отдельного разбора параметров запроса.

    Когда стоит писать свой комплексный компонент

    • раздел сайта состоит из нескольких логически связанных страниц — списка, карточки, фильтра, сравнения — и вся эта структура должна управляться единой точкой входа;
    • нужен единый набор параметров, применяемых сразу ко всем внутренним страницам раздела;
    • структура ЧПУ раздела нестандартна и требует собственной логики разбора адресов.

    Для более простых случаев — когда достаточно вывести список и карточку без сложной внутренней навигации — обычно хватает пары обычных компонентов, связанных параметром адреса детальной страницы, как это устроено в news.list и news.detail.

    Практический пример: минимальная логика разбора

    <?php
    
    class MyCatalogComponent extends \CBitrixComponent
    {
        public function executeComponent()
        {
            $page = $this->arResult['VARIABLES']['SECTION_CODE'] ?? '';
    
            if (empty($page)) {
                $this->includeComponentTemplate('section-list');
                return;
            }
    
            $elementCode = $this->arResult['VARIABLES']['ELEMENT_CODE'] ?? '';
    
            if (!empty($elementCode)) {
                $this->includeComponentTemplate('element-detail');
                return;
            }
    
            $this->includeComponentTemplate('section-detail');
        }
    }

    Реальные комплексные компоненты ядра устроены заметно сложнее — учитывают фильтры, постраничную навигацию, права доступа, — но общий принцип тот же: одна точка входа, ветвление по разобранному адресу, вызов соответствующего представления.

    Кастомизация без переписывания логики

    Так же, как и у обычных компонентов, для комплексных компонентов ядра менять стоит только шаблон — копированием структуры в свой каталог шаблонов, а не саму управляющую логику в component.php. Внутренние вложенные компоненты кастомизируются по тому же принципу, каждый по своему собственному пути.

    Частые ошибки

    • Правится управляющий component.php ядра. Исчезает при обновлении, как и с обычными компонентами.
    • Свой комплексный компонент написан там, где хватило бы пары обычных. Излишняя сложность без реальной необходимости.
    • Шаблоны URL в SEF_MODE конфликтуют друг с другом. Например, один шаблон является префиксом другого, и разбор адреса даёт неоднозначный результат.

    Итог

    Комплексный компонент — это компонент, управляющий целым разделом сайта через разбор ЧПУ и внутренний вызов других компонентов. Оправдан он там, где раздел объединяет несколько логически связанных страниц с единой точкой входа и общими параметрами. Кастомизация строится по тем же принципам, что и у обычных компонентов, только на уровень глубже — как самого комплексного компонента, так и каждого вложенного в него отдельно.

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

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

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