Комплексный компонент не выводит информацию сам.
Его главная задача — работать как маршрутизатор (роутер).
Он анализирует URL-адрес и, в зависимости от него, подключает один из нескольких простых компонентов, передавая ему нужные параметры.
Классический пример — bitrix:news. Он может показывать:
- Список новостей (на /news/) — подключает news.list.
- Детальную страницу новости (на /news/detail/my-news-code/) — подключает news.detail.
Шаг 1: Структура и параметры (.parameters.php)
Структура папок комплексного компонента такая же, как у простого. Ключевое отличие — в файле .parameters.php. Здесь мы должны описать режим ЧПУ (SEF_MODE).
// /local/components/my/catalog.complex/.parameters.php
$arComponentParameters = [
"PARAMETERS" => [
"SEF_MODE" => [
"list" => [
"NAME" => "Страница списка разделов",
"DEFAULT" => "index.php",
"VARIABLES" => [],
],
"section" => [
"NAME" => "Страница раздела",
"DEFAULT" => "#SECTION_CODE#/",
"VARIABLES" => ["SECTION_CODE"],
],
"detail" => [
"NAME" => "Страница элемента",
"DEFAULT" => "#SECTION_CODE#/#ELEMENT_CODE#.html",
"VARIABLES" => ["SECTION_CODE", "ELEMENT_CODE"],
],
],
// ... другие параметры, например, IBLOCK_ID
],
];
- SEF_MODE: Это массив, описывающий шаблоны URL для разных «страниц» компонента (list, section, detail).
- DEFAULT: Шаблон пути. Переменные заключаются в #…#.
- VARIABLES: Массив переменных, которые будут извлечены из URL.
Шаг 2: Правило в urlrewrite.php
Чтобы Битрикс «знал», что URL вида /catalog/phones/iphone-20.html должен обрабатываться нашим компонентом, нужно добавить правило в файл /urlrewrite.php. Это делается автоматически при размещении компонента на странице в режиме ЧПУ.codePHP
// /urlrewrite.php
[
"CONDITION" => "#^/catalog/#", // Условие, при котором правило сработает
"RULE" => "",
"ID" => "my:catalog.complex", // ID нашего компонента
"PATH" => "/catalog/index.php", // Страница, где физически лежит компонент
"SORT" => 100,
],
Шаг 3: Логика маршрутизатора (component.php)
Это самый важный файл. Его задача — разобрать URL и определить, какую «страницу» (list, section, detail) показывать.
// /local/components/my/catalog.complex/component.php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
/** @var CBitrixComponent $this */
// ...
$arVariables = [];
$componentPage = CComponentEngine::ParseComponentPath(
$arParams["SEF_FOLDER"], // Базовый URL, например /catalog/
$arParams["SEF_URL_TEMPLATES"], // Массив шаблонов из .parameters.php
$arVariables // Сюда будут записаны найденные переменные (#SECTION_CODE#, etc.)
);
// Если CComponentEngine ничего не нашел, показываем 404
if (!$componentPage) {
\Bitrix\Iblock\Component\Tools::process404(
'Страница не найдена', true, true, true
);
return;
}
// Сохраняем переменные и найденную страницу в $arResult
$arResult = [
"FOLDER" => $arParams["SEF_FOLDER"],
"URL_TEMPLATES" => $arParams["SEF_URL_TEMPLATES"],
"VARIABLES" => $arVariables,
];
// Подключаем шаблон, который в свою очередь подключит нужный простой компонент
$this->includeComponentTemplate($componentPage);
- CComponentEngine::ParseComponentPath: Основная функция. Она сравнивает текущий URL с шаблонами из $arParams[«SEF_URL_TEMPLATES»].
- Возвращает ключ найденного шаблона (list, section или detail).
- В массив $arVariables по ссылке записывает значения переменных. Например, [‘SECTION_CODE’ => ‘phones’, ‘ELEMENT_CODE’ => ‘iphone-20’].
Шаг 4: Шаблон комплексного компонента (template.php)
Шаблон комплексного компонента — это тоже маршрутизатор, но уже для файлов. Он подключает нужный «подшаблон» в зависимости от $arResult[«componentPage»] (который мы передали в includeComponentTemplate).
// /local/components/my/catalog.complex/templates/.default/template.php
// Название файла шаблона совпадает с ключом из SEF_MODE
// Например, если $componentPage = 'detail', будет подключен файл detail.php
@include_once __DIR__ . '/' . $arResult['componentPage'] . '.php';
Создадим эти файлы:
- list.php
- section.php
- detail.php
В каждом из этих файлов будет вызов соответствующего простого компонента.
// /local/components/my/catalog.complex/templates/.default/section.php
// Вызываем простой компонент для вывода списка элементов в разделе
$APPLICATION->IncludeComponent(
"bitrix:news.list",
".default",
[
"IBLOCK_ID" => $arParams["IBLOCK_ID"],
"PARENT_SECTION_CODE" => $arResult["VARIABLES"]["SECTION_CODE"], // Передаем найденный SECTION_CODE
// ... другие параметры
],
$component // Важно передавать родительский компонент
);
Вывод:
Комплексный компонент — это элегантный способ организации больших разделов сайта. Он инкапсулирует логику ЧПУ, позволяя легко управлять URL-ами и подключать разные простые компоненты для отображения контента. Поняв принцип его работы, вы сможете создавать сложные и гибкие каталоги, блоги и другие разделы, следуя лучшим практикам Битрикс.
комплексный компонент Битрикс, SEF_MODE, ЧПУ, urlrewrite.php, CComponentEngine, component.php, шаблоны ЧПУ, .parameters.php.