Блог Горошко Андрея 1C-Битрикс Создание комплексных компонентов в Битрикс: SEF_MODE, urlrewrite и ЧПУ

Создание комплексных компонентов в Битрикс: SEF_MODE, urlrewrite и ЧПУ

Средний рейтинг
Еще нет оценок

Комплексный компонент не выводит информацию сам.

Его главная задача — работать как маршрутизатор (роутер).

Он анализирует 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.

Мой рейтинг:

Добавить комментарий

Related Post

Сила связей в D7 ORM: JOIN’ы и ReferenceField на практикеСила связей в D7 ORM: JOIN’ы и ReferenceField на практике

Средний рейтинг Еще нет оценок Мы уже умеем выбирать данные из одной таблицы с помощью getList. Но настоящая мощь ORM проявляется, когда нужно в одном запросе получить связанные данные из нескольких

Управление правами доступа через API: GetGroupRight, GetUserGroupArrayУправление правами доступа через API: GetGroupRight, GetUserGroupArray

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

Чем отличается ядро D7 bitrix и bitrix старое ядроЧем отличается ядро D7 bitrix и bitrix старое ядро

Средний рейтинг Еще нет оценок D7 Bitrix — это новое ядро Битрикс, которое было создано для замены старого ядра. D7 Bitrix является новым ядром разработки, которое было введено в версии