Битрикс. Как переместить фильтр в шаблоне

15.08.2018

Теги: CMSWeb-разработкаБитриксБуферизацияКаталогТоваровКомпонентШаблонКомпонентаШаблонСайта

Описанный ниже метод основан на технологии буферизации вывода. Буферизация позволяет манипулировать данными, которые формируют php скрипты на странице. Проще говоря, происходит следующее: перед тем как сервер отдаст сформированный HTML-код, мы с помощью определённых методов можем изменить расположение этого кода, переместив его выше или ниже.

Вызов компонента умного фильтра bitrix:catalog.smart.filter должен происходить еще до вызова компонента списка товаров раздела bitrix:catalog.section. Это важно, так как сначала должен сформироваться массив для фильтрации, а затем он должен быть передан в компонент списка товаров.

<div class="smart-filter">
    <?php
    $APPLICATION->IncludeComponent(
        'bitrix:catalog.smart.filter',
        '',
        array(
            // параметры компонента
        ),
        $component
    );
    ?>
</div>

<div class="section-products">
    <?php
    $APPLICATION->IncludeComponent(
        'bitrix:catalog.section',
        '',
        array(
            // параметры компонента
        ),
        $component
    );
    ?>
</div>

Если нужно разместить фильтр в другом месте, например в левой или правой колонке, то делаем так:

<?php $this->SetViewTarget('html_smart_filter'); ?>
<div class="smart-filter">
    <?php
    $APPLICATION->IncludeComponent(
        'bitrix:catalog.smart.filter',
        '',
        array(
            // параметры компонента
        ),
        $component
    );
    ?>
</div>
<?php $this->EndViewTarget(); ?>

<div class="section-products">
    <?php
    $APPLICATION->IncludeComponent(
        'bitrix:catalog.section',
        '',
        array(
            // параметры компонента
        ),
        $component
    );
    ?>
</div>

Фильтр отработает и сформирует массив для фильтрации. Но вывода HTML-кода в месте вызова не будет. Этот вывод сформированного HTML-кода мы можем разместить в другом месте. Это может быть как выше, так и ниже места вызова компонента умного фильтра:

<div class="left sidebar">
    <?php $APPLICATION->ShowViewContent('html_smart_filter'); ?>
</div>

Для того, чтобы воспользоваться методами SetViewTarget() и EndViewTarget() из файла component_epilog.php, использовать переменную $this не получится, т.к. в данном файле это уже объект класса CBitrixComponent (а не CBitrixComponentTemplate, как в файле template.php). В таком случае нужно делать так:

<?php $this->__template->SetViewTarget('some_content'); ?>
    Some content here ...
<?php $this->__template->EndViewTarget(); ?>

Если нужно проделать похожую манипуляцию не в шаблоне компонента, а в шаблоне сайта, делаем так:

<?php
// здесь выводим контент с меткой «some_content», который будет сфорирован ниже
$APPLICATION->ShowViewContent('some_content');
?>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
</p>
<?php
ob_start(); // включаем буферизацию вывода, все идет в отдельный буфер
?>
Some content here ...
<?php
// выключаем буферизацию и помечаем этот контент меткой «some_content»
$APPLICATION->AddViewContent('some_content', ob_get_clean());
?>

Поиск: CMS • Web-разработка • Битрикс • Буферизация • Каталог товаров • Компонент • Умный фильтр • Шаблон компонента • Шаблон сайта • SetViewTarget • EndViewTarget • ShowViewContent • AddViewContent

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.