Перейти к содержимому

Хлебные крошки - правка цепочки и свои элементы

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

Решение

Смотрим, что уже лежит в цепочке:

global $APPLICATION;
echo '<pre>', print_r($APPLICATION->GetNavChain(), true), '</pre>';

Цепочку наполняет платформа по мере разбора адреса: каждый раздел пути добавляет в неё свой заголовок. Компонент хлебных крошек ничего не собирает сам, он только рисует то, что накоплено к моменту его вызова.

Добавляем свой пункт:

// до вызова компонента крошек, обычно в теле страницы
$APPLICATION->AddChainItem('Акции сентября', '/promo/september/');
$APPLICATION->AddChainItem('Только сегодня'); // без адреса - последний пункт

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

Выводим компонент крошек:

$APPLICATION->IncludeComponent('bitrix:breadcrumb', '', [
'START_FROM' => '0', // с какого пункта начинать вывод
'PATH' => '',
'SITE_ID' => SITE_ID,
]);

Компонент крошек ставят один раз в шаблоне сайта, а не на каждой странице. Начальный пункт задаётся параметром: единицей отрезают ссылку на главную, если в разметке она оказывается лишней.

Убираем раздел из цепочки:

// свойство раздела: заголовок пустой - раздел в цепочку не попадает
$APPLICATION->SetDirProperty('title', '');
// либо в файле .section.php раздела
$sSectionName = '';
// адреса при этом не меняются: раздел остаётся в структуре сайта как был

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

Собираем цепочку своим кодом целиком:

$APPLICATION->AddChainItem('Каталог', '/catalog/');
foreach ($sectionPath as $section) { // разделы от корня к текущему
$APPLICATION->AddChainItem($section['NAME'], $section['SECTION_PAGE_URL']);
}
$APPLICATION->AddChainItem($element['NAME']); // последний пункт без ссылки

Платформа не проверяет, соответствуют ли пункты структуре сайта, и рисует ровно то, что ей передали. Это удобно на страницах, которые собираются кодом и в дереве разделов не существуют вовсе.

В каталоге цепочку дополняет комплексный компонент. Он добавляет разделы товара и его название сам, когда включён соответствующий параметр. Ручное добавление пунктов при этом даёт дубли: сначала стоит посмотреть, что компонент уже положил в цепочку, и только потом дописывать своё.

Заголовок страницы и последний пункт цепочки - разные вещи. Первый выводится заголовком в разметке, второй завершает навигацию, и совпадают они только потому, что платформа заполняет их из одного источника.

Типичные проблемы

Свой пункт не появился в цепочке.

Он добавлен после вывода компонента. Компонент рисует накопленное на момент вызова и позже цепочку не перечитывает.

В крошках дублируется название товара.

Комплексный компонент каталога уже добавил его сам. Ручное добавление поверх даёт второй такой же пункт.

В цепочке лишний промежуточный раздел.

У раздела заполнен заголовок. Пустой заголовок исключает раздел из цепочки, не трогая адреса.

Крошки показывают неактивные подразделы.

Цепочка собирается по структуре разделов, а не по правам и активности. Скрытые разделы убирают из неё явно.

В названии пункта видны служебные символы.

Заголовок раздела содержит спецсимволы разметки. Компонент выводит его как текст, и сущности остаются видимыми.

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

Как вывести в крошках название элемента, а не раздела?

Компонент каталога добавляет его сам по своему параметру. В своём коде название дописывают в цепочку до вывода компонента крошек.

Можно ли собрать крошки по своему дереву?

Да, цепочку наполняют вручную любыми пунктами. Платформа не проверяет, соответствуют ли они структуре сайта.

Почему крошки выводятся не там, где нужно?

Компонент стоит в шаблоне сайта, и место вывода определяется его положением в разметке. Переносят вызов, а не настройки.

Как убрать ссылку на главную из цепочки?

Параметром начального пункта: вывод начинается со следующего. Сам пункт при этом остаётся в цепочке и доступен коду.

Смежное

Первоисточник