Свой шаблон для конкретного раздела сайта в Битрикс
Далеко не всегда весь сайт должен выглядеть одинаково. Каталогу нужна боковая колонка с фильтром, посадочной странице — вообще никакой обвязки, личному кабинету — своя шапка, а странице печати — голая вёрстка без меню.
В 1С-Битрикс это решается несколькими шаблонами с условиями применения. Разберём все способы назначить шаблон разделу или странице — от настроек в админке до подмены из кода — и объясним, в каком порядке система их проверяет.
Способ 1. Условие в настройках сайта
Штатный и самый правильный путь. Настраивается в разделе Настройки → Настройки продукта → Сайты → выбрать сайт. В блоке «Шаблоны сайта» добавляется строка с тремя полями:
| Поле | Что задаёт |
|---|---|
| Шаблон | Какой шаблон применить |
| Условие | PHP-выражение, возвращающее true или false |
| Сортировка | Порядок проверки условий |
Примеры рабочих условий:
CSite::InDir('/catalog/') // раздел каталога и всё внутри
CSite::InDir('/personal/') // личный кабинет
$_REQUEST['print'] == 'Y' // версия для печати
$GLOBALS['USER']->IsAuthorized() // только для авторизованных
CSite::InDir('/landing/promo/index.php') // одна конкретная страница
Функция CSite::InDir() — основной инструмент здесь. Она проверяет,
находится ли текущая страница в указанном разделе, включая вложенные.
Порядок имеет значение
Система проверяет условия по возрастанию сортировки и применяет первый подошедший шаблон. Отсюда два следствия:
- Основной шаблон без условия должен стоять последним с самой большой сортировкой. Если поставить его первым, он перехватит все страницы, и остальные правила никогда не сработают.
-
Частные условия идут раньше общих. Правило для
/catalog/sale/должно проверяться до правила для/catalog/, иначе распродажа получит общий шаблон каталога.
Типичная рабочая раскладка:
| Сортировка | Условие | Шаблон |
|---|---|---|
| 1 | $_REQUEST['print'] == 'Y' | |
| 2 | CSite::InDir('/landing/') | landing |
| 3 | CSite::InDir('/personal/') | personal |
| 100 | пусто | main |
Способ 2. Свойство раздела
Шаблон можно задать через свойство раздела, не трогая настройки сайта.
В файле .section.php нужного раздела:
<?php
$sSectionName = 'Каталог';
$arDirProperties = [
'template' => 'catalog',
];
То же самое настраивается через админку: Контент → Структура сайта → свойства раздела.
Подход удобен тем, что настройка лежит рядом с самим разделом и переносится вместе с ним. Минус — она разбросана по файловой системе, и через год найти все переопределения сложнее, чем посмотреть один список в настройках сайта.
Возникли проблемы с 1С-Битрикс? Поможем разобраться.
Исправим ошибки, доработаем функционал, ускорим работу сайта или просто подскажем правильное решение. Оставьте номер телефона — свяжемся с вами в ближайшее время.
Способ 3. Подмена из кода
Шаблон можно назначить программно — прямо в теле страницы или в обработчике события:
<?php
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php');
$APPLICATION->SetTemplate('landing');
Способ работает, но применять его стоит осторожно: логика выбора шаблона расползается по коду страниц, и разобраться, почему на конкретной странице другой шаблон, становится трудно.
Через обработчик события
Если правило сложное и не выражается одним условием, его можно реализовать в обработчике. Например, свой шаблон для всех страниц, где у раздела заполнено определённое свойство:
<?php // /local/php_interface/init.php
AddEventHandler('main', 'OnBeforeProlog', function () {
global $APPLICATION;
if (isset($_GET['embed']) && $_GET['embed'] === 'Y') {
$APPLICATION->SetTemplate('embed');
}
});
Механика обработчиков подробно разобрана в статье EventManager в Битрикс.
Способ 4. Параметр в адресе
Битрикс поддерживает переключение шаблона через GET-параметр без всяких настроек:
https://example.ru/catalog/?bitrix_include_areas=N&print=Y
Такой приём удобен для отладки — быстро посмотреть страницу в другом шаблоне, не меняя настроек. Для постоянной работы не годится.
Что копировать, а что нет
Создавая второй шаблон, легко получить два почти одинаковых набора файлов, которые дальше расходятся: правку внесли в один, а во втором забыли.
Практичный подход — выносить общее:
-
Общие стили держите в одном файле и подключайте в обоих шаблонах
через
SetAdditionalCSS()— способы подключения разобраны в статье Подключение CSS и JS в Битрикс. - Повторяющиеся куски разметки — шапку, подвал, меню — выносите во включаемые области и подключайте в оба шаблона.
- Кастомизированные шаблоны компонентов при полном совпадении можно оставить в основном шаблоне: если во втором шаблоне такого шаблона компонента нет, Битрикс возьмёт стандартный, поэтому проверяйте вывод.
Если различия между шаблонами сводятся к паре блоков, второй шаблон часто вообще не нужен: достаточно условия внутри существующего.
Когда второй шаблон не нужен
Прежде чем плодить шаблоны, проверьте — может, задача решается проще:
| Задача | Решение |
|---|---|
| Скрыть боковую колонку на нескольких страницах | Условие в шаблоне или свойство страницы |
| Другой баннер в разделе | Включаемая область в режиме sect |
Другой класс на <body> |
Проверка CSite::InDir() прямо в шаблоне |
| Полностью иная структура страницы | Отдельный шаблон |
| Своя шапка и подвал у личного кабинета | Отдельный шаблон |
Проверка после настройки
- Откройте страницу раздела — должен примениться нужный шаблон.
- Откройте вложенную страницу этого раздела — шаблон должен сохраниться.
- Откройте страницу вне раздела — должен вернуться основной шаблон.
- Проверьте главную: частая ошибка — условие перехватывает и её.
- Убедитесь, что стили и скрипты подключаются в обоих шаблонах.
- Проверьте вывод меню и хлебных крошек в новом шаблоне.
Частые ошибки
- Основной шаблон стоит первым. Условия остальных не срабатывают никогда — самая частая причина «почему не применяется мой шаблон».
- Общее условие проверяется раньше частного. Подраздел получает шаблон родительского раздела.
-
Забыт слэш в конце пути.
CSite::InDir('/catalog')иCSite::InDir('/catalog/')ведут себя по-разному. - Дублирование шаблонов целиком. Через полгода они расходятся, и правки приходится вносить дважды.
- Шаблон подменяется из кода в десяти местах. Понять, почему на странице именно этот шаблон, становится невозможно.
Итог
Основной способ назначить свой шаблон разделу — условие в настройках сайта
с CSite::InDir(). Ключевое правило: частные условия идут первыми,
а шаблон без условия — последним, иначе он перехватит все страницы.
Перед созданием второго шаблона стоит проверить, не решается ли задача условием внутри существующего или включаемой областью. Полноценный отдельный шаблон оправдан тогда, когда у страниц действительно другая структура, а не пара отличающихся блоков.