/ Использование хлебных-крошек (bitrix:breadcrumb) внутри компонентов Bitrix

Использование хлебных-крошек (bitrix:breadcrumb) внутри компонентов Bitrix

1 Окт 2018
Дмитрий М.
7431

Часто сталкиваюсь с ситуацией, когда при вёрстке очередного макета сайта, "хлебные-крошки" являются частью дизайна отдельных блоков/компонентов, т.е их не получается вынести в самостоятельный блок сайта не зависящий от страницы на которой будет находиться пользователь.

При вёрстке таких шаблонов в CMS Bitrix приходиться использовать компонент bitrix:breadcrumb внутри других компонентов, например: bitrix:news или bitrix:catalog. Так как bitrix:breadcrumb использует отложенные функции, то при включённом кэширование "разваливается/ломается" вёрстка страниц на которых присутствуют "хлебные-крошки".

Вызов компонента bitrix:breadcrumb
<?$APPLICATION->IncludeComponent("bitrix:breadcrumb","",Array(
        "START_FROM" => "0", 
        "PATH" => "", 
        "SITE_ID" => "s1" 
    )
);?>

Отличное решение для этой проблемы было предложено пользователем Хабра https://habr.com/sandbox/115802/. Ниже собственно и привожу это решение...

Посмотрим на то, как взаимодействует компонент с файлом component_epilog.php (https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&amp;LESSON_ID=2975). Как видно component_epilog.php подключается после исполнения шаблона и позволяет его модифицировать.

схема взаимодействия компонента с файлами component_epilog.php и result_modifier.php

Решение предложенной пользователем Хабр'а сводиться к тому, чтобы в шаблоне располагать placeholder, который при выполнении component_epilog.php будет заменяться на нужный нам контент. ( в данном случаи на "хлебные-крошки").

Для реализации задачи потребуется создать класс, например ComponentHelper. В папке /bitrix/php_interface/ создадим папку /class/ в ней нужно создать файл ComponentHelper.php со следующим содержимым:

Содержимое ComponentHelper.php
<?php
#/bitrix/php_interface/classes/ComponentHelper.php
namespace PHPInterface;

/**
 * ComponentHelper
 *
 * Создает плейсхолдеры в шаблоне
 * При помощи статической функции handle обрабатывает их
 * Класс необходим для вызова некешируемых функций
 */
class ComponentHelper
{
    private $component = null;
    private $lastPlIndex = 0;
    private $pull = array();

    public function __construct(\CBitrixComponent $component)
    {
        $this->component = $component;
        $this->component->SetResultCacheKeys(array('CACHED_TPL', 'CACHED_TPL_PULL'));
        ob_start();
    }

    public function deferredCall($callback, $args = array())
    {
        $plName = $this->getNextPlaceholder();
        echo $plName;
        $this->pull[$plName] = array('callback' => $callback, 'args' => $args);
    }

    public function saveCache()
    {
        $this->component->arResult['CACHED_TPL'] = @ob_get_contents();
        $this->component->arResult['CACHED_TPL_PULL'] = $this->pull;
        ob_get_clean();
        $this->component = null;
    }

    private function getNextPlaceholder()
    {
        return '##PLACEHOLDER_'.(++$this->lastPlIndex).'##';
    }

    public static function handle(\CBitrixComponent $component)
    {
        $buf = &$component->arResult['CACHED_TPL'];
        foreach ($component->arResult['CACHED_TPL_PULL'] as $plName => $params) {
            list($prevPart, $nextPart) = explode($plName, $buf);
            echo $prevPart;
            call_user_func_array($params['callback'], $params['args']);
            $buf = &$nextPart;
        }
        echo $buf;
    }
}

Чтобы вывести хлебные крошки, понадобится создать функцию, например ShowNavChain в файле init.php.

Строки необходимые добавить в файл init.php ( располагается в /bitrix/php_interface/ )
//Подключаем созданный класс ComponentHelper.php
require_once(dirname(__FILE__).'/classes/ComponentHelper.php');

//Функция отвечающая за вывод "хлебных-крошек" bitrix:breadcrumb
function ShowNavChain($template = '.default')
{
    global $APPLICATION;
    $APPLICATION->IncludeComponent("bitrix:breadcrumb","",Array(
        "START_FROM" => "0",
        "PATH" => "",
        "SITE_ID" => "s1"
    );
}

В шаблоне в котором необходим вывод "хлебных-крошек" необходимо разместить следующий код:


//В необходимом месте вставки "хлебных-крошек"
$helper = new PHPInterface\ComponentHelper($component);
$helper->deferredCall('ShowNavChain', array('.default'));
//... код шаблона ...
// И в конце шаблона обязательно вызвать 
$helper->saveCache();

В папке шаблона создаём файл component_epilog.php с содержимым:

PHPInterface\ComponentHelper::handle($this);

Если всё сделано правильно, теперь "хлебные-крошки" будут отображаться корректно внутри вашего шаблона.

Статья была полезна? Поблагодарите автора.

Самые читаемые
#1С Битрикс, #Bitrix CMS, #.htaccess, #настройка редиректов
4 Авг 2019
#Хлебные крошки, #1С Битрикс, #Bitrix CMS, #bitrix:breadcrumbs, #component_epilog, #кэширование
1 Окт 2018
#ресайз изображений, #1С Битрикс, #Bitrix CMS
3 Мар 2019
#bitrix, #robots.txt, #sitemap.xml, #поддомены, #мультисайтовость
16 Окт 2018
#bitrix, #bitrix:catalog.section, #скидки, #товары со скидкой, #страница скидок, #страница со скидками
4 Окт 2018
#Bitrix CMS, #breadcrumb, #bitrix:breadcrumbs, #хлебные крошки, #настройка
13 Фев 2019
#bitrix, #свойства элементов, #обработчик событий, #OnBeforeIBlockElementUpdate, #OnIBlockElementSetPropertyValues
21 Июл 2020
#bitrix:news, #сортировка, #фильтрация, #bitrix:catalog, #catalog.section, #news.list
16 Дек 2020
#bitrix, #пользовательские свойства, #тип свойств, #привязка к элементам
27 Ноя 2019