Шаблон под раздел и по условию - правила показа, приоритет, печать
Показываем разный шаблон в разных разделах: правила показа и их приоритет, условие по адресу, смена шаблона из кода и отдельная версия для печати.
Что нужно знать заранее
У сайта бывает несколько шаблонов, и выбор между ними решают правила показа. Правило связывает шаблон с условием, а условием служит папка, адрес или произвольная проверка на языке платформы.
Правила упорядочены между собой, и побеждает первое подходящее по порядку. Порядок задаётся сортировкой, поэтому частные правила ставят выше общих: иначе общее правило перехватывает все адреса и частное не срабатывает никогда.
Шаблон можно сменить и прямо из кода, но только до вывода страницы. После первой выведенной строки это уже бесполезно: шапка сайта отдана браузеру, и поменять её задним числом нельзя.
Шаги
- Посмотреть, какой шаблон сейчас показывается на нужной странице сайта, и запомнить его.
- Завести отдельный шаблон под задачу и положить его в каталог шаблонов сайта.
- Добавить правило показа с условием и разместить его выше общего правила.
- Проверить работу правила на разделе, на детальной странице и на главной.
- Для разовых случаев менять шаблон из кода до вывода разметки страницы.
Решение
Смотрим текущий шаблон страницы:
printf("шаблон=%s путь=%s\n", SITE_TEMPLATE_ID, SITE_TEMPLATE_PATH);printf("сайт=%s папка=%s\n", SITE_ID, SITE_DIR);// удобно временно вывести в подвале при разборе правил показа// на многосайтовой копии сначала смотрят сайт, а уже потом его шаблонИмя текущего шаблона доступно константой на любой странице. Это первое, что смотрят при жалобе «в разделе не тот дизайн»: часто оказывается, что правило вообще не сработало и показан шаблон по умолчанию.
Заводим шаблон под раздел:
/local/templates/personal/ - шаблон личного кабинета header.php - своя шапка без большого меню footer.php - подвал без витринных блоков template_styles.css - стили только этого шаблона .description.php - имя шаблона в списке настроек сайта# правило показа связывает этот шаблон с папкой /personal/Отдельный шаблон оправдан там, где отличается разметка, а не только цвета. Личный кабинет, посадочная страница и версия для печати - типовые случаи, когда копия шаблона дешевле бесконечных условий в общей шапке.
Меняем шаблон из кода до вывода:
// /local/php_interface/init.php, до пролога страницыAddEventHandler('main', 'OnBeforeProlog', static function () { global $APPLICATION; if (($_GET['print'] ?? '') === 'Y') { $APPLICATION->SetTemplate('print'); // версия для печати без меню }});Смена шаблона на событии до пролога работает на любой странице сайта. Тот же приём подходит для отдельного шаблона под мобильный поддомен или под страницы партнёрской программы.
Проверяем порядок правил показа:
SELECT SORT, CONDITION, TEMPLATE FROM b_site_templateWHERE SITE_ID = 's1' ORDER BY SORT; -- побеждает первое подходящее правило-- пустое условие подходит любому адресу и должно стоять последнимПорядок правил объясняет большинство странностей с шаблонами. Правило с пустым условием подходит всем адресам, и любое правило ниже него по сортировке уже не получает шанса сработать.
Проверяем условие правила на конкретном адресе:
$request = $_SERVER['REQUEST_URI'];var_dump((bool)preg_match('#^/personal/#', $request)); // условие правила показа// условие пишут простым: сложное регулярное выражение ломается на параметрах адресаУсловие правила стоит держать простым. Проверка начала адреса покрывает почти все задачи, а хитрое выражение с параметрами запроса ломается на первой же странице с постраничной навигацией.
Типичные проблемы
Правило заведено, а шаблон в разделе прежний.
Выше по сортировке стоит правило с более общим условием и перехватывает адрес. Частные правила ставят выше общих, а правило без условия оставляют последним.
Шаблон сменился, но вёрстка поехала.
В новом шаблоне не хватает подключений стилей и скриптов из старого. Шаблон копируют целиком вместе со стилями, а не собирают из одной шапки.
Смена шаблона из кода ничего не даёт.
Вызов стоит после вывода части страницы, когда шапка уже отдана браузеру. Шаблон меняют до пролога страницы, на событии в файле инициализации проекта.
На части страниц шаблон меняется, а на детальных нет.
Условие правила проверяет только адрес раздела и не подходит детальным страницам. Условие пишут по началу адреса раздела, а не по точному совпадению строки.
После включения композита правило работает через раз.
Страница отдаётся из кэша готовых страниц, собранного ещё на другом шаблоне. Такие страницы исключают из композитного кэша или сбрасывают его после правки правил.
Частые вопросы
Сколько шаблонов разумно держать на сайте?
Обычно два-три: основной, версия для печати и иногда посадочные страницы. Каждый лишний шаблон удваивает работу при правке общей вёрстки.
Чем правило показа лучше условия в шапке?
Оно не тащит лишний код на каждую страницу и понятно контент-менеджеру. Условия в шапке быстро превращаются в клубок, который никто не решается трогать.
Как сделать версию страницы для печати?
Отдельным шаблоном без меню и подвала плюс сменой шаблона по параметру адреса. Стили печати при этом всё равно нужны.
Работают ли правила на многосайтовой копии?
Да, правила задаются отдельно для каждого сайта. Шаблон при этом можно использовать общий, если разметка совпадает.
Где смотреть, какой шаблон применился?
В константе имени шаблона прямо на странице или в панели отладки. Это быстрее, чем сверять правила глазами в настройках.
Смежное
- Шаблон сайта - оглавление подтемы
- Мобильная версия: адаптив, отдельный шаблон, кэш по устройству - типовой случай второго шаблона
- Шаблон сайта не применяется: разбор причин - если применился не тот шаблон
- Натяжка вёрстки на шаблон сайта: разрез, пути, компоненты - как собирают сам шаблон
- Стили и скрипты в шаблоне: подключение, порядок, кэш - подключение статики шаблона
- Включаемые области: текст и код в шаблоне без правки файлов - части страницы вне шаблона
- A/B-тест на витрине: варианты, доли, цели, результаты - когда вариантов два и они сравниваются
- Печатная форма и PDF: шаблон печати, генерация файла, отдача - печать документа отдельной страницей
- Второй сайт на одном ядре: домен, папка, шаблон, общие данные - когда нужен не шаблон, а второй сайт
- Компоненты и шаблоны - устройство шаблонов целиком
- Свойства страницы: заголовок, метатеги, свои свойства - свои свойства как условие показа