Перейти к содержанию
Инструкция

Вывод блоков только на определённых страницах сайта

Как в 1С-Битрикс показать баннер, форму или блок только на нужных страницах. Разбираем API $APPLICATION->GetCurPage и GetCurDir, разницу между физическим и SEF-адресом, проверку по разделу и типичные ошибки с ЧПУ.

Обновлено 22 июля 7 минут чтения 3 просмотра

Часто нужно показать блок точечно: акционный баннер – только на главной, форму заявки – на всех страницах раздела услуг, а на 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 и вывести элементы инфоблока».

Частые вопросы

В чём разница GetCurPage(true) и GetCurPage(false)?

Параметр отвечает за строку запроса: GetCurPage(true) возвращает путь без GET-параметров после знака вопроса, GetCurPage(false) – с ними. Для условий по странице обычно нужен true, чтобы фильтры и сортировки не мешали сравнению.

Почему условие с /contacts.php не срабатывает?

При включённом ЧПУ (SEF) реальный текущий путь – это /contacts/ со слэшем, а не физический файл /contacts.php. Сравнивайте с тем адресом, который отдаётся в браузере.

Как вывести блок на всех страницах раздела сразу?

Используйте $APPLICATION->GetCurDir() и проверьте, что путь начинается с нужного раздела: mb_strpos($curDir, '/services/') === 0. Сравнение с нулём гарантирует, что раздел стоит в начале пути.

Почему strpos нужно сравнивать строго?

Функция strpos возвращает позицию вхождения, и для первого символа это 0. В нестрогом условии ноль трактуется как false, поэтому блок не покажется. Используйте === 0 или !== false по смыслу.

Как не привязывать вывод блока к конкретному URL?

Задавайте свойство страницы через SetPageProperty в шаблоне раздела и читайте его через GetPageProperty. Тогда управление выводом остаётся в контенте и не ломается при смене адресов.

Валентина Меланина

Хотите обсудить свой проект?

Помогу с разработкой, аналитикой и AI-видимостью вашего сайта

Если у вас есть задача — от внедрения разметки и аналитики до полной переработки сайта — напишите, обсудим объём и подход.