PHP
#bitrix#iblock#php#sections#breadcrumbs#navigation

Получить разделы элемента и построить хлебные крошки

Получение цепочки разделов элемента через CIBlockSection::GetNavChain и формирование хлебных крошек для навигации.

Как использовать

  1. Скопируйте нужный фрагмент кода.
  2. Вставьте в свой проект и при необходимости измените под задачу.
  3. Проверьте зависимости и окружение (версии, переменные).

Получение цепочки разделов элемента и построение хлебных крошек для навигации. Используйте в детальных страницах элементов для отображения пути к текущему элементу.

use Bitrix\Main\Loader;

/**
 * Получить хлебные крошки для элемента
 * @param int $elementId ID элемента
 * @param int $iblockId ID инфоблока
 * @return array Массив разделов от корня до текущего
 */
function getElementBreadcrumbs($elementId, $iblockId) {
    if (!Loader::includeModule('iblock')) {
        return [];
    }
    
    // Получаем разделы элемента
    $res = CIBlockElement::GetElementGroups($elementId, true);
    $sectionIds = [];
    while ($section = $res->Fetch()) {
        $sectionIds[] = $section['ID'];
    }
    
    if (empty($sectionIds)) {
        return [];
    }
    
    // Берём первый раздел (если элемент в нескольких разделах)
    $sectionId = $sectionIds[0];
    
    // Получаем цепочку разделов от корня
    $navChain = CIBlockSection::GetNavChain(
        $iblockId,
        $sectionId,
        ['ID', 'NAME', 'CODE', 'SECTION_PAGE_URL']
    );
    
    $breadcrumbs = [];
    while ($section = $navChain->GetNext()) {
        $breadcrumbs[] = [
            'ID' => $section['ID'],
            'NAME' => $section['NAME'],
            'CODE' => $section['CODE'],
            'URL' => $section['SECTION_PAGE_URL'] ?: ''
        ];
    }
    
    // Добавляем сам элемент в конец
    $element = CIBlockElement::GetByID($elementId)->GetNextElement();
    if ($element) {
        $fields = $element->GetFields();
        $breadcrumbs[] = [
            'ID' => $fields['ID'],
            'NAME' => $fields['NAME'],
            'CODE' => $fields['CODE'],
            'URL' => ''
        ];
    }
    
    return $breadcrumbs;
}

/**
 * Вывести хлебные крошки в HTML
 * @param array $breadcrumbs Массив из getElementBreadcrumbs()
 * @param string $separator Разделитель (по умолчанию ' / ')
 * @return string HTML код хлебных крошек
 */
function renderBreadcrumbs($breadcrumbs, $separator = ' / ') {
    if (empty($breadcrumbs)) {
        return '';
    }
    
    $html = '<nav class="breadcrumbs"><ol>';
    
    foreach ($breadcrumbs as $index => $item) {
        $isLast = ($index === count($breadcrumbs) - 1);
        
        $html .= '<li>';
        if ($isLast || empty($item['URL'])) {
            $html .= '<span>' . htmlspecialchars($item['NAME']) . '</span>';
        } else {
            $html .= '<a href="' . htmlspecialchars($item['URL']) . '">' . 
                     htmlspecialchars($item['NAME']) . '</a>';
        }
        $html .= '</li>';
        
        if (!$isLast) {
            $html .= '<li class="separator">' . htmlspecialchars($separator) . '</li>';
        }
    }
    
    $html .= '</ol></nav>';
    
    return $html;
}

Usage:

// В component.php или шаблоне
$breadcrumbs = getElementBreadcrumbs(123, 5);

// Вывод в шаблоне
foreach ($breadcrumbs as $crumb) {
    if (!empty($crumb['URL'])) {
        echo '<a href="' . $crumb['URL'] . '">' . $crumb['NAME'] . '</a>';
    } else {
        echo '<span>' . $crumb['NAME'] . '</span>';
    }
}

// Или через функцию рендеринга
echo renderBreadcrumbs($breadcrumbs);

Notes:

⚠️ Если элемент находится в нескольких разделах, берётся первый. Для точного определения раздела используйте параметр SECTION_ID из URL или фильтра. GetNavChain возвращает цепочку от корня до указанного раздела включительно.