Назад

Как в 1С-Битрикс вывести имя раздела и ссылку на него

Главная
Блог
Как в 1С-Битрикс вывести имя раздела и ссылку на него

При разработке сайтов на 1С-Битрикс часто возникает необходимость вывести название раздела инфоблока и ссылку на него. Это может потребоваться при создании хлебных крошек, дополнительной навигации или просто для отображения родительского раздела элемента. Рассмотрим несколько эффективных способов решения этой задачи.

Метод 1: Использование CIBlockSection::GetByID

Самый простой способ получить данные раздела по его ID:

<?
$sectionId = $arItem['IBLOCK_SECTION_ID']; // ID нужного раздела
$res = CIBlockSection::GetByID($sectionId);
if ($arSection = $res->GetNext()) {
    ?>
    <a href="<?= $arSection['SECTION_PAGE_URL'] ?>">
        <?= $arSection['NAME'] ?>
    </a>
    <?
} else {
    // Обработка случая, когда раздел не найден
    echo 'Раздел не существует или удален';
}
?>

Преимущества:

  • Простота реализации

  • Минимальный код

Недостатки:

  • Нет кэширования

  • Только базовые поля раздела

Метод 2: Оптимизированный запрос с GetList

Для более гибкого подхода лучше использовать CIBlockSection::GetList:

<?
$section = CIBlockSection::GetList(
    ['SORT' => 'ASC'], // Сортировка
    ['ID' => $arItem['IBLOCK_SECTION_ID'], 'ACTIVE' => 'Y'], // Фильтр
    false, // Количество
    ['ID', 'NAME', 'SECTION_PAGE_URL', 'DESCRIPTION', 'PICTURE'] // Выбираемые поля
)->Fetch();

if ($section) {
    ?>
    <div class="section-link">
        <a href="<?= $section['SECTION_PAGE_URL'] ?>" title="<?= htmlspecialchars($section['DESCRIPTION']) ?>">
            <?= $section['NAME'] ?>
        </a>
    </div>
    <?
}
?>

Дополнительные возможности:

  • Фильтрация по активности

  • Выбор только нужных полей

  • Возможность сортировки

  • Получение дополнительных данных (описание, изображение)

Метод 3: Решение с кэшированием

Для часто запрашиваемых разделов стоит реализовать кэширование:

<?
$sectionId = $arItem['IBLOCK_SECTION_ID'];
$cacheTime = 3600; // Время кэширования в секундах
$cacheId = 'section_info_'.$sectionId.'_'.SITE_ID;
$cachePath = '/section_info/'.substr($cacheId, 0, 2).'/';

$obCache = new CPHPCache;
if ($obCache->InitCache($cacheTime, $cacheId, $cachePath)) {
    $section = $obCache->GetVars();
} elseif ($obCache->StartDataCache()) {
    $section = CIBlockSection::GetList(
        [],
        ['ID' => $sectionId],
        false,
        ['ID', 'NAME', 'SECTION_PAGE_URL', 'CODE', 'IBLOCK_ID']
    )->Fetch();
    
    if (!$section) {
        $obCache->AbortDataCache();
    }
    
    $obCache->EndDataCache($section);
}

if ($section) {
    ?>
    <a href="<?= $section['SECTION_PAGE_URL'] ?>" class="section-link">
        <?= $section['NAME'] ?>
        <? if ($section['ELEMENT_CNT'] > 0): ?>
            <span class="count">(<?= $section['ELEMENT_CNT'] ?>)</span>
        <? endif; ?>
    </a>
    <?
}
?>

Особенности работы с ЧПУ

Для корректного формирования ссылок убедитесь, что:

  1. В настройках инфоблока включена генерация ЧПУ:

    • Администрирование → Контент → Инфоблоки → [Ваш инфоблок] → Настройки SEO

    • Установите шаблоны URL для разделов

  2. В файле urlrewrite.php есть соответствующие правила:

array(
    "CONDITION" => "#^/catalog/([^/]+?)/.*#",
    "RULE" => "SECTION_CODE=\$1",
    "ID" => "",
    "PATH" => "/catalog/index.php",
),

Дополнительные советы

  1. Пользовательские поля: Можно получать UF-поля раздела:

$section = CIBlockSection::GetList(
    [],
    ['ID' => $sectionId],
    false,
    ['UF_CUSTOM_FIELD']
)->Fetch();

  1. Проверка прав доступа:

if (CIBlockSectionRights::UserHasRightTo(
    $section['IBLOCK_ID'],
    $section['ID'],
    'section_read'
)) {
    // Показать ссылку
}

  1. Множественное получение разделов:

$sectionsIds = array_map(function($item) {
    return $item['IBLOCK_SECTION_ID'];
}, $arResult['ITEMS']);

$rsSections = CIBlockSection::GetList(
    [],
    ['ID' => $sectionsIds],
    false,
    ['ID', 'NAME', 'SECTION_PAGE_URL']
);
while ($section = $rsSections->Fetch()) {
    $arSections[$section['ID']] = $section;
}

Заключение

В зависимости от вашей задачи вы можете выбрать:

  1. Простой GetByID для единичных запросов

  2. Оптимизированный GetList для гибкости

  3. Решение с кэшированием для часто запрашиваемых разделов

Правильная реализация вывода разделов улучшит SEO-характеристики сайта и удобство навигации для пользователей.

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи