Получить разделы элемента и построить хлебные крошки
Получение цепочки разделов элемента через CIBlockSection::GetNavChain и формирование хлебных крошек для навигации.
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
Получение цепочки разделов элемента и построение хлебных крошек для навигации. Используйте в детальных страницах элементов для отображения пути к текущему элементу.
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 возвращает цепочку от корня до указанного раздела включительно.