1С-Битрикс: Как отображать информацию только на главной странице

В случае когда необходимо отображать информацию только на главной странице, на помощь приходит Bitrix API. Рассмотрим несколько случаев, в которых вам стоит применять подобные проверки.

Вывод информации только на главной странице в Битриксе

Перейдем от долгих вступлений сразу к делу. Собственно код:

<?if($APPLICATION->GetCurPage() == "/"):?>

<!-- текст или компонент -->

<?endif;?>

Или такой вариант:

<?if($APPLICATION->GetCurPage() == "/index.php"){
#ваш код
}?>

Большой разницы быть не должно. Вместо GetCurPage() можем попробовать GetCurDir():

<?if($APPLICATION->GetCurDir() == "/") {}?>

Как отобразить информацию везде кроме главной страницы

В новых шаблона Битрикса встречается следующий вариант:

<?$curPage = $APPLICATION->GetCurPage(true);?>
<?if ($curPage != SITE_DIR."index.php"):?>
  <h1><?=$APPLICATION->ShowTitle(false);?></h1>
<?endif?>

Но я обычно использовал в этих случаях более короткую запись

<?if($APPLICATION->GetCurPage() != "/"){?>
<?}?>

Какой вариант использовать — это уже на ваше усмотрение.

1С-Битрикс: Как отображать информацию на определенном разделе

Рассмотрим пример, когда нужно показывать информацию не только в разделе ‘catalog’, но и на его внутренних разделах и страницах (то есть, на всех страницах, в урле которых встречается /catalog/):

<?
$p1 = "/catalog/";
if (strstr($APPLICATION->GetCurDir(), $p1)) {?>
<!-- ваш код -->
<?}?>

где $p1 — ваш раздел, а strstr — проверяет первое вхождение подстроки.
ПС — документация PHP рекомендует использовать в таких случаях strpos вместо strstr.

Но есть и нормальное решение 🙂 Но работает исключительно с папками:

<?if(CSite::InDir('/about/')) {

}?>

Ну и что касается вывода информации на разделе, можем использовать следующий код:

<?if ($APPLICATION->GetCurDir() == "/catalog/") {?>
<!-- ваш код -->
<?}?>

Кстати говоря, такого рода проверка, встречалась мне и на других сайтах написанных на 1С-Битрикс. Ее использовали, чтобы задать мета-свойства для разделов, выведенных с помощью модуля новости.

автор: Dmitriy

Занимаюсь веб-разработкой с 2011 года. Посмотреть некоторые из моих работ, а также узнать чуть больше обо мне, вы можете на forwww.ru.

27 комментария

  1. GetCurPage() != «/»){?>

    Можно ли этот код использовать для нескольких страниц? Или какой-то другой нужно использовать? Есть, в общем, 4 каталога и 1 страница, где НЕ надо выводить кусок кода. Как это можно реализовать, не сталкивались?

    1. Добрый день. Ну вы можете написать что-то в стиле GetCurPage() != «/» || GetCurPage() != «/catalog/» || GetCurPage() != «/about/actions.php»){?> — используя либо логическое ИЛИ (||) или же используя логическое И (&& — заменить вместо ||). Вообще это такой себе вариант — он рабочий, но я не уверен что это можно отнести к «хорошей практике». В битриксе, в некоторых случаях, целесообразней использовать разные шаблоны для разных страниц, найти можно в настройках шаблона если вам понадобится подробная инструкция как применять другой шаблон отпишите я вам скрин пришлю 🙂

        1. Заходите вот сюда #ваш_сайт#/bitrix/admin/site_edit.php?lang=ru&LID=s1
          а тут вы выбираете для папки и файла — можно указывать как раздел так и страницу — http://joxi.ru/BA0Qk9TB6p6Rry
          также, можно выбрать шаблон который будет применяться к данному «условию». Всё должно быть довольно просто — вы копируете шаблон, на этой странице — #ваш_сайт#/bitrix/admin/template_admin.php?lang=ru называете его как угодно чтобы можно было найти 🙂 и уже правите header и footer вашего нового шаблона. Если у вас возникнут сложности напишите мне на почту, помогу — dmitriyribka@gmail.com

  2. Как правильно вывести условие для всех разделов каталога, кроме элементов
    например типа этого:
    if ($APPLICATION->GetCurDir() == «/catalog/раздел/возможно_подраздел/») {}

    нужно паттерн. но как правильно написать?

      1. Добрый вечер. Дмитрий, а мне также можете подсказать, как прописать такое условие, чтобы каноникал выводился только если мы находимся на странице раздела или подраздела, но не карточки товаров?

        1. в таком случае вам нужно его добавлять либо в файле section.php \ sections.php (в вашем компоненте каталога), либо прописывать код для формирования каноникал в component_epilog.php (для каждого шаблона, для разделов и отдельно для подразделов, в случае, если это разные компоненты). Про каноникал вы можете почитать в этой статье:
          http://forwww.com/bitrix-seo-how-to-change-meta-tags/ , но если коротко, то вам нужно использовать:
          $APPLICATION->AddHeadString('');

  3. Подскажи как сделать наоборот чтоб не отображался везде, кроме выбранного раздела к примеру /include/././
    Чтоб на всех страницах показ а в каталоге и товаре нет?

    1. нужно поставить отрицание в условие, то есть if (!strstr($APPLICATION->GetCurDir(), $p1)) {?>

      — ставим восклицательный знак перед функцией strstr

  4. Не подскажите как сделать вывод только в категории на главной странице категории
    GetCurDir() == «/catalog/») {?>
    123

    Чтобы был вывод только /catalog/ а в дочерних страницах и подкатегориях ничего не было

  5. Стоит отметить, что при использовании CSite::InDir есть ньюанс:

    if(CSite::InDir(‘/about/’)) {
    // выполнение условия для каталога /about/ и всех его подкаталогов, например /about/contancs/
    }

    if(CSite::InDir(‘/about/index.php’)) {
    // выполнение условия для каталога /about/, а именно страницы index.php в каталоге about
    }

  6. Привет!
    А как поверить, если мы находимся в карточке продукта?
    У меня выводится в карточке в интересном месте. Надо скрыть месте под крошками и вывести в другом. Как сделать? 🙂

    1. Честно говоря и сам не знаю идеального решения, все решения проблемы выглядят так себе :). Попробуйте использовать установку определенного свойства для блока
      1. SetPageProperty(‘CLASS’,’front’);?> — записываем константу
      2. Ответить

  7. Dmitriy, подскажите пожалуйста как при задании условия для смены шаблоны через php, привязаться за раздел каталога, в стандартных примерах есть вот такой шаблон на регулярных выражениях preg_match(«#/catalog/\?SECTION_ID=\d+&ELEMENT_ID=\d+#i»,$_SERVER[‘REQUEST_URI’]); который задает условие для элемента каталога, а мне необходим раздел.

    1. если вам нужен 1 раздел = 1 шаблон, то тут все просто. вам нужно выбрать «для папки или файла» и в значении поставить ваш раздел ‘/catalog/section/’.
      с выражением PHP все гораздо сложнее — дело в том что на разных компонентах, шаблонах, разделах (в зависимости от того, как разработан и настроен каталог) не всегда есть доступ к таким переменным как SECTION_ID. на примере что вы скинули проверка на гет параметры, а если говорить про ЧПУ то эта формула не сработает.

  8. Здравствуйте Дмитрий! Я очень долго пытаюсь понять, как сделать разные заголовки окна браузера на моих многочисленных страницах сайта в битрикс, чтобы каждый заголовок соответствовал разделу каталога и был уникальным, все мои попытки увенчались восстановлением резервной копии сайта(. Подскажите пожалуйста как мне решить эту проблему… я буду Вам очень благодарна! Спасибо)

  9. Дмитрий, добрый день. Подскажите пожалуйста.
    На странице списка разделов (Услуги) под картинкой для анонса отображается текст с кратким описанием с помощью: . Мне нужно чтобы краткое описание отображалось непосредственно на странице раздела. Логично, нужно добавить в шаблон страницы раздела, что я и сделал. Но описание так и не отображается.
    <?
    echo "»;
    echo var_dump($arResult);
    echo «»;
    ?>
    Выводит значение NULL.
    В чем косяк?

    1. Добрый день. Возможно вы пытаетесь «распечатать» массив вне компонента. Попробуйте проделать тоже самое, только открыв template.php соответствующего шаблона компонента список разделов

      1. Шаблон самого раздела лежит по адресу: bitrix -> templates -> corporate_s1 -> components -> bitrix -> news.list -> main -> template.php

        Шаблон списка разделов: bitrix -> templates -> corporate_s1 -> components -> bitrix -> news -> services -> sections_list.php

          1. в вашем случае нужно распечатать $arSections, а отдельно каждый раздел в цикле — $arSection

  10. Я за закрытие проектов на битриксе в целом, лучше как разроботчику написать проект на laravel или любой другой cms, bitrix это ужас во всех своих проявлениях от ядра до синхронизации с 1c, с 1с Карл! компания разработчик одного и того же не может сделать нормальную синхронизацию цмс и 1c между собой, обычный бесплатный плагин на wp для вукомерс лучше с этим справляется чем этот битрикс, я как разраб со стажем, что то не особо допру как мне сделать условие исключительно для catalog.element она же карточка товара похоже, для всех товаров, а не одного GetCurDir() == «/catalog/») {?> это мне не тарахтело такой условие, или что то типо такого if(CSite::InDir(‘/about/index.php’)) {, что мозгов у разрабов дописать функцию что то типо того is_single() как в wp

    1. В битриксе есть свои проблемы, как в и любой другой CMS, как и в любом фреймворке. Вместо is_single() — попробуйте посмотреть в сторону отложенных функций

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *