Комплексный компонент сам разбирает URL и решает, какую внутреннюю страницу показать. Чтобы добавить свой раздел (например, «печать» или «отзывы»), нужно расширить его карту маршрутов — разберём это на устройстве SEF-режима.
Как комплексный компонент разбирает URL
В SEF-режиме комплексный компонент получает «хвост» адреса после своей корневой папки и сопоставляет его с шаблонами маршрутов. Ключевые массивы в component.php:
$arDefaultUrlTemplates404— карта «имя страницы → шаблон URL»;$arComponentVariables— список переменных, которые нужно вытащить из URL и запроса;$componentPage— имя выбранной внутренней страницы.
Разбор выполняет движок компонентов:
$componentPage = CComponentEngine::ParseComponentPath(
$arParams['SEF_FOLDER'],
$arUrlTemplates,
$variables
);
Результат — имя страницы (например, detail или ваша reviews), под которое дальше подключается соответствующий шаблон.
arDefaultUrlTemplates404 и ParseComponentPath — это и есть весь «секрет» добавления своих страниц.Где размещать изменения
Править component.php ядра в /bitrix/components/bitrix/news/ нельзя — обновление затрёт правки. Есть два корректных пути:
- Свой компонент-наследник. Скопировать комплексный компонент в свой namespace (
/local/components/mycompany/news/) и дорабатывать егоcomponent.php. Надёжно, но придётся сопровождать копию. - Расширение шаблонами URL. Для многих задач достаточно добавить новый шаблон в
SEF_URL_TEMPLATESв настройках компонента и обработать новую страницу в шаблоне комплексного компонента, не копируя ядро.
Выбор зависит от глубины изменений: одна-две дополнительные страницы часто решаются через настройки и шаблон, а серьёзная переработка логики — только своим компонентом.
Добавление новой страницы
Допустим, к новостям нужна страница отзывов по адресу /news/<code>/reviews/. В своём компоненте добавляем маршрут:
$arDefaultUrlTemplates404 = [
'list' => '',
'detail' => '#ELEMENT_CODE#/',
'reviews' => '#ELEMENT_CODE#/reviews/',
];
Перечисляем переменные, которые надо извлечь:
$arComponentVariables = ['ELEMENT_CODE', 'ELEMENT_ID'];
После ParseComponentPath и разбора переменных — ветвление по имени страницы:
switch ($componentPage) {
case 'reviews':
$APPLICATION->IncludeComponentTemplate('reviews');
break;
default:
$APPLICATION->IncludeComponentTemplate($componentPage);
}
Метод IncludeComponentTemplate('reviews') подключит файл reviews.php из папки шаблона — это и есть вёрстка вашей новой страницы.
Шаблон новой страницы
В папке шаблона компонента страницы описываются отдельными файлами по имени: template.php — по умолчанию, reviews.php — ваша. Именно поэтому вторым аргументом IncludeComponentTemplate() передаётся имя страницы (без расширения).
В шаблоне доступны данные, которые компонент подготовил в $arResult под эту страницу, а также разбор URL. Здесь же корректно управлять заголовком и хлебными крошками:
$APPLICATION->SetTitle('Отзывы: ' . $arResult['NAME']);
$APPLICATION->AddChainItem('Отзывы');
component.php под case 'reviews' и кладите в $arResult — тогда они попадут в кэш вместе со страницей.Построение ссылок на свою страницу
Ссылки на внутренние страницы нельзя писать руками — их собирают из шаблонов URL, чтобы при смене ЧПУ ничего не сломалось. Для этого есть CComponentEngine::MakePathFromTemplate:
$url = CComponentEngine::MakePathFromTemplate(
$arParams['SEF_FOLDER'] . $arDefaultUrlTemplates404['reviews'],
['ELEMENT_CODE' => $arResult['CODE']]
);
Метод подставит значения переменных в шаблон и вернёт готовый относительный URL. Тот же приём типовые компоненты используют для DETAIL_PAGE_URL и SECTION_PAGE_URL — поэтому ваши ссылки будут вести себя единообразно со штатными.
Частые ошибки
Что чаще всего идёт не так при добавлении страниц:
- Страница даёт 404. Шаблон URL не добавлен в
SEF_URL_TEMPLATESв настройках компонента — движок не сопоставляет адрес и возвращает «страница не найдена». - Переменная пустая. Забыли перечислить её в
$arComponentVariables, поэтому она не извлекается из URL. - Данные не кэшируются. Выборку для новой страницы разместили в шаблоне, а не в
component.php— она выполняется мимо кэша. - Ссылки битые после смены ЧПУ. URL собран строкой вместо
MakePathFromTemplate.
Порядок шаблонов в arDefaultUrlTemplates404 тоже важен: более специфичные маршруты (с /reviews/) должны стоять выше общих, иначе их «перехватит» шаблон детальной.
Итог
Своя страница в комплексном компоненте — это новый маршрут в arDefaultUrlTemplates404, извлечённые переменные из arComponentVariables, ветка по $componentPage с вызовом IncludeComponentTemplate и отдельный файл шаблона. Ссылки собирают через MakePathFromTemplate, а данные готовят в component.php, чтобы они кэшировались.
Такие доработки лучше вести в компоненте-наследнике в /local/, чтобы не потерять их при обновлении. Мы в B2Bsite проектируем архитектуру сложных проектов на Битрикс, где комплексные компоненты обрастают своими разделами, API и интеграциями — аккуратно и с прицелом на дальнейшее сопровождение.
Частые вопросы
Как комплексный компонент понимает, какую страницу показать?
Он сопоставляет хвост URL с шаблонами из arDefaultUrlTemplates404 через CComponentEngine::ParseComponentPath и получает имя внутренней страницы.
Куда добавлять новый маршрут, чтобы не потерять его при обновлении?
В компонент-наследник в /local/components/, а не в файлы ядра в /bitrix/. Копию component.php правьте у себя.
Как подключить шаблон конкретной страницы?
Вызвать $APPLICATION->IncludeComponentTemplate('reviews') — подключится файл reviews.php из папки шаблона компонента.
Почему новая страница отдаёт 404?
Скорее всего, её шаблон URL не добавлен в SEF_URL_TEMPLATES в настройках компонента, и движок не сопоставляет адрес.
Как правильно строить ссылки на свою страницу?
Через CComponentEngine::MakePathFromTemplate с шаблоном URL и значениями переменных. Тогда ссылки переживут смену ЧПУ в настройках.
Где готовить данные для новой страницы?
В component.php под соответствующим case, чтобы выборка попала в кэш вместе со страницей, а не выполнялась в шаблоне на каждом хите.
Почему переменная из URL приходит пустой?
Её нужно перечислить в массиве $arComponentVariables — иначе движок не извлекает её из адреса и запроса.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.