Комплексный компонент отличается от обычного одним принципиальным
свойством: он сам управляет несколькими страницами через ЧПУ,
вызывая внутри себя другие компоненты в зависимости от текущего адреса.
bitrix:catalog и bitrix:sale.personal.section —
типичные примеры: один вызов разворачивает список, детальную карточку,
корзину и личный кабинет одновременно.
Чем комплексный компонент отличается от обычного
| Обычный компонент | Комплексный компонент | |
|---|---|---|
| Управляет | Одним блоком на странице | Несколькими страницами раздела |
| ЧПУ | Настраивается снаружи | Разбирает и обрабатывает сам |
| Вызывает другие компоненты | Обычно нет | Да, внутри себя |
| Пример | news.list | bitrix: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конфликтуют друг с другом. Например, один шаблон является префиксом другого, и разбор адреса даёт неоднозначный результат.
Итог
Комплексный компонент — это компонент, управляющий целым разделом сайта через разбор ЧПУ и внутренний вызов других компонентов. Оправдан он там, где раздел объединяет несколько логически связанных страниц с единой точкой входа и общими параметрами. Кастомизация строится по тем же принципам, что и у обычных компонентов, только на уровень глубже — как самого комплексного компонента, так и каждого вложенного в него отдельно.
