S6 Studio

 

Пишем свой компонент для вывода навигационной цепочки 1C-Bitrix

Bitrix  Компоненты  Нам лениво  • Евгений Задорин 14 октября 2013 • Без комментариев

 

Навигационная цепочка — один из самых непредсказуемых стандартных компонентов Bitrix.

Есть ряд проблем, возникающих при ее использовании наиболее часто — цепочка навигации не отображается, отображается неправильно, отображается не там, где должна.

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

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

Основным требованием к данной разработке была возможность управлять пунктами цепочки с помощью стандартного функционала битрикса, а именно — возможность добавлять пункты с помощью отложенной функции CMain::AddChainItem.

Полученное решение — далее.

Матчасть

Вам никогда не было интересно, какие публичные свойства включает в себя глобальный объект $APPLICATION? Любопытства ради сделайте print_r($APPLICATION);. В контексте данной темы, нас интересует свойство arAdditionalChain, в котором хранятся пункты навигационной цепочки, добавленные методом CMain::AddChainItem.

Каждый пункт цепочки, содержащийся в данном массиве, имеет ключи LINK, который содержит в себе адрес ссылки, и TITLE, в котором находится текст ссылки.

Вся идея заключается в том, чтобы формировать пункты цепочки вручную, методом AddChainItem, а затем работать с ними, получив доступ к публичному свойству $APPLICATION->arAdditionalChain. При этом нельзя забывать, что пункты цепочки, добавляемые автоматически стандартными компонентами, не учитываются, т.е. все нужные ссылки придется добавить вручную.

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

Реализация

Для практической реализации задачи создадим простейший компонент custom.breadcrumb, который будет расположен в своем пространстве имен, отличном от bitrix. Обойдемся без файлов .parameters.php и .description.php, но вы, разумеется, можете развить компонент и добавить их, а также иконку, благодаря чему компонент станет доступным в визуальном редакторе bitrix.

Файл component.php будет выглядеть приблизительно так:

< ?
    if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
    global $APPLICATION;

    // данный параметр определяет, отображать ли последний пункт цепочки как ссылку
    // по умолчанию — нет
    $arParams['SHOW_LAST_LINK'] = ($arParams['SHOW_LAST_LINK'] == 'Y') ? 'Y' : 'N';
    
    // получаем доступ к пунктам цепочки
    $arResult['ITEMS'] = $APPLICATION->arAdditionalChain;

    // далее можно проделать с ними любые манипуляции
    // например можно установить последнему пункту флаг LAST, 
    // чтобы в шаблоне не выводить ссылку
    if ($arParams['SHOW_LAST_LINK'] == 'N')
    {
        end($arResult['ITEMS']);

        $arResult['ITEMS'][ key($arResult['ITEMS']) ]['LAST'] = true;

        reset($arResult['ITEMS']);
    }

    $this->IncludeComponentTemplate();
?>

Шаблон для данного компонента можно стянуть с шаблона стандартного компонента цепочки, слегка его упростив:

< ?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
< ?if (count($arResult['ITEMS']) > 0):?>
    
< ?endif;?>

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

Заключение

Не стоит забывать, что раз данный компонент отчасти использует стандартный функционал хранения пунктов цепочки, то в случае каких-то обновлений со стороны битрикса все это может слететь. Конечно, это маловероятно, но все же, применяя данный способ, вы действуете на свой страх и риск.

<< К блогу Добавить комментарий

 

comments powered by Disqus

Самые популярные

К прочтению обязательно