Часто нужно показать блок точечно: акционный баннер – только на главной, форму заявки – на всех страницах раздела услуг, а на 404 и странице контактов не выводить ничего лишнего. В 1С-Битрикс для этого есть методы объекта $APPLICATION, которые возвращают текущий адрес. Главное – понимать, какой именно адрес они отдают, иначе условие «не срабатывает» на страницах с ЧПУ. Разберём рабочие приёмы.
GetCurPage: физический путь или SEF-адрес
Ключевой метод – $APPLICATION->GetCurPage($bTrimQuery). У него есть параметр, от которого зависит результат:
GetCurPage(true)– возвращает путь без GET-параметров (строки запроса после?);GetCurPage(false)– путь с параметрами.
Для условий «на какой мы странице» почти всегда нужен GetCurPage(true) – чтобы /catalog/?SORT=price и /catalog/ считались одной страницей. Простой пример из практики:
<?php if ($APPLICATION->GetCurPage(true) === '/'): ?>
<!-- блок только для главной страницы -->
<?php elseif ($APPLICATION->GetCurPage(true) === '/contacts/'): ?>
<!-- блок только для страницы контактов -->
<?php elseif ($APPLICATION->GetCurPage(true) !== '/404.php'): ?>
<!-- блок для всех страниц, кроме 404 -->
<?php endif; ?>
Обратите внимание: сравнение строгое (===), и путь пишется так, как он реально отдаётся. У «папочных» разделов это /contacts/ со слэшем, а не /contacts.php – распространённая причина, почему условие молчит.
Вывести блок на целом разделе: GetCurDir и strpos
Если нужно показать блок на всех страницах раздела (например, во всём /services/), сравнивать каждый URL вручную неудобно. Берём текущую директорию через GetCurDir() или проверяем вхождение подстроки:
<?php
$curDir = $APPLICATION->GetCurDir(); // например, /services/web/
// весь раздел услуг
if (mb_strpos($curDir, '/services/') === 0): ?>
<!-- блок для всего раздела /services/ и вложенных -->
<?php endif; ?>
Важно: сравнивайте результат mb_strpos именно с === 0 (раздел в начале пути), а не просто !== false – иначе блок покажется и там, где /services/ встречается в середине адреса. И всегда используйте строгое сравнение: strpos может вернуть 0 (первый символ), а нестрогое == false примет ноль за «не найдено».
Проверка по разделу инфоблока, а не по URL
Привязка к URL хрупкая: адрес поменяли – условие сломалось. Если блок логически привязан к разделу каталога или инфоблока, надёжнее проверять контекст. На странице элемента/раздела данные о нём уже есть в результате компонента, а служебные заголовки (page property) удобно проставлять через свойства страницы и читать их в шаблоне:
<?php if ($APPLICATION->GetPageProperty('show_promo') === 'Y'): ?>
<!-- блок показывается там, где задано свойство страницы show_promo=Y -->
<?php endif; ?>
Свойство можно задавать в шаблоне раздела через $APPLICATION->SetPageProperty('show_promo', 'Y') – так управление выводом остаётся в контенте, а не зашито в общий шаблон жёстким списком URL.
Типичные ошибки
- Сравнение с
.phpвместо слэша. При включённом ЧПУ (SEF) реальный путь –/contacts/, а не/contacts.php; условие с расширением не сработает. - Незакрытая кавычка/тег. В старом коде за
endifболтался лишний">– такой «хвост» ломает вёрстку. Следите за парностью. - strpos без строгого сравнения.
if (strpos(...))считает позицию 0 ложью; всегда=== 0или!== falseпо смыслу. - Забыли про GET-параметры. С
GetCurPage(false)страница с сортировкой или фильтром уже не совпадёт с чистым адресом. - Хрупкая привязка к URL. Для блоков, связанных с разделом, лучше свойства страницы или контекст компонента, чем длинный список адресов.
Этот приём часто идёт в паре с другими доработками шаблона: например, чтобы уведомление о cookies не показывать на самой странице политики, а подпункт меню выводить только в нужном разделе. Для выборки данных под конкретную страницу пригодится «Получить ID из GET и вывести элементы инфоблока».