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

  • 2018-10-01
  • Дмитрий М.
  • 3422

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

<p> Часто сталкиваюсь с ситуацией, когда при вёрстке очередного макета сайта, <b><i>"хлебные-крошки"</i></b> являются частью дизайна отдельных блоков/компонентов, т.е их не получается вынести в самостоятельный блок сайта не зависящий от страницы на которой будет находиться пользователь. </p> <p> При вёрстке таких шаблонов в <b>CMS Bitrix</b> приходиться использовать компонент <b>bitrix:breadcrumb</b> внутри других компонентов, например: <b>bitrix:news</b> или <b>bitrix:catalog</b>. Так как <b>bitrix:breadcrumb</b> использует отложенные функции, то при включённом кэширование "разваливается/ломается" вёрстка страниц на которых присутствуют <b><i>"хлебные-крошки"</i></b>. </p> <small class="text-title">Вызов компонента bitrix:breadcrumb</small> <pre class="line-numbers"><code class="language-php">&lt;?$APPLICATION-&gt;IncludeComponent("bitrix:breadcrumb","",Array( "START_FROM" =&gt; "0", "PATH" =&gt; "", "SITE_ID" =&gt; "s1" ) );?&gt;</code></pre> <p> Отличное решение для этой проблемы было предложено пользователем <b>Хабра </b>- <a href="https://habr.com/sandbox/115802/">https://habr.com/sandbox/115802/</a>. Ниже собственно и привожу это решение... </p> <p> Посмотрим на то, как взаимодействует компонент с файлом <b>component_epilog.php</b> (<a href="https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=2975">https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&amp;amp;LESSON_ID=2975</a>). Как видно component_epilog.php подключается после исполнения шаблона и позволяет его модифицировать. </p> <div class="picture"> <img width="427" alt="схема взаимодействия компонента с файлами component_epilog.php и result_modifier.php" src="/upload/medialibrary/77c/77c62ec64150673486543499c1a63a12.png" height="537" title="схема взаимодействия компонента с файлами component_epilog.php и result_modifier.php"> </div> <p> Решение предложенной пользователем <b>Хабр'а</b> сводиться к тому, чтобы в шаблоне располагать <b><i>placeholder</i></b>, который при выполнении <b>component_epilog.php</b> будет заменяться на нужный нам контент. ( в данном случаи на <b>"хлебные-крошки"</b>). </p> <p> Для реализации задачи потребуется создать класс, например ComponentHelper. В папке <b>/bitrix/php_interface/</b> создадим папку <b>/class/</b> в ней нужно создать файл <b>ComponentHelper.php</b> со следующим содержимым: </p> <small class="text-title">Содержимое <i>ComponentHelper.php</i></small> <pre class="line-numbers"><code class="language-php">&lt;?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-&gt;component = $component; $this-&gt;component-&gt;SetResultCacheKeys(array('CACHED_TPL', 'CACHED_TPL_PULL')); ob_start(); } public function deferredCall($callback, $args = array()) { $plName = $this-&gt;getNextPlaceholder(); echo $plName; $this-&gt;pull[$plName] = array('callback' =&gt; $callback, 'args' =&gt; $args); } public function saveCache() { $this-&gt;component-&gt;arResult['CACHED_TPL'] = @ob_get_contents(); $this-&gt;component-&gt;arResult['CACHED_TPL_PULL'] = $this-&gt;pull; ob_get_clean(); $this-&gt;component = null; } private function getNextPlaceholder() { return '##PLACEHOLDER_'.(++$this-&gt;lastPlIndex).'##'; } public static function handle(\CBitrixComponent $component) { $buf = &amp;$component-&gt;arResult['CACHED_TPL']; foreach ($component-&gt;arResult['CACHED_TPL_PULL'] as $plName =&gt; $params) { list($prevPart, $nextPart) = explode($plName, $buf); echo $prevPart; call_user_func_array($params['callback'], $params['args']); $buf = &amp;$nextPart; } echo $buf; } }</code></pre> <p> Чтобы вывести хлебные крошки, понадобится создать функцию, например <b>ShowNavChain</b> в файле <b>init.php</b>. </p> <small class="text-title">Строки необходимые добавить в файл init.php <i>( располагается в /bitrix/php_interface/ )</i></small> <pre class="line-numbers"><code class="language-php">//Подключаем созданный класс ComponentHelper.php require_once(dirname(__FILE__).'/classes/ComponentHelper.php'); //Функция отвечающая за вывод "хлебных-крошек" bitrix:breadcrumb function ShowNavChain($template = '.default') { global $APPLICATION; $APPLICATION-&gt;IncludeComponent("bitrix:breadcrumb","",Array( "START_FROM" =&gt; "0", "PATH" =&gt; "", "SITE_ID" =&gt; "s1" );<br>}<br></code></pre> <p> В шаблоне в котором необходим вывод "хлебных-крошек" необходимо разместить следующий код: </p> <pre class="line-numbers"><code class="language-php"> //В необходимом месте вставки "хлебных-крошек" $helper = new PHPInterface\ComponentHelper($component); $helper-&gt;deferredCall('ShowNavChain', array('.default')); //... код шаблона ... // И в конце шаблона обязательно вызвать $helper-&gt;saveCache();</code></pre> <p> В папке шаблона создаём файл <b>component_epilog.php</b> с содержимым: </p> <pre class="line-numbers"><code class="language-php">PHPInterface\ComponentHelper::handle($this);</code></pre> <p> Если всё сделано правильно, теперь <b>"хлебные-крошки"</b> будут отображаться корректно внутри вашего шаблона. </p>

05.08.2019 01:47:26

Capture-d’écran-2015-01-05-à-21.27.09-400x270.png

Capture-d’écran-2015-01-05-à-21.27.09-400x270.png

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

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

При вёрстке таких шаблонов в 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/. Ниже собственно и привожу это решение...

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

При вёрстке таких шаблонов в 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);

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



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

Возврат к списку

Другие статьи