Телеграм: @camouf_ru Почта: mihail@bazarow.ru

Отфильтровать товары бренда и вывести по разделам каталога

Просмотров: 289

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

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

Отфильтровываем товары бренда

У нас есть инфоблок с брендами и свойство у товаров каталога "CML2_MANUFACTURER_VALUE" в котором указан бренд конкретного товара.

Бренды выводятся с помощью компонента bitrix:news, соотвественно, детальное описание бренда компонентом news.detail. В шаблоне этого компонента создаем файл component_epilog.php и размещаем в нем такой код.


$GLOBALS['arrFilterBrand'] = array(
    "PROPERTY_CML2_MANUFACTURER_VALUE" => $arResult['NAME']
);
$APPLICATION->IncludeComponent(
   "bitrix:catalog.section",
    "",
    array(
        ... компонент bitrix:catalog.section  ...
        "FILTER_NAME" => "arrFilterBrand",
        ... компонент bitrix:catalog.section  ...
        ),
    false
);
  • Создали глобальный фильтр, в который передали название текущего бренда "PROPERTY_CML2_MANUFACTURER_VALUE" => $arResult['NAME']
  • Вывели компонент bitrix:catalog.section в котором применили этот фильтр.

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

Выводим товары по разделам

Наша задача получить ID всех товаров этого бренда и получить ID и названия всех разделов каталога, в которых встречаются товары этого бренда. Дополняем код


$GLOBALS['arrFilterBrand'] = array(
    "PROPERTY_CML2_MANUFACTURER_VALUE" => $arResult['NAME']
);
$GoodsIds = CIBlockElement::GetList(
    false,
    array('PROPERTY_CML2_MANUFACTURER_VALUE' => $arResult['NAME']),
    false,
    false,
    array('ID')
);
while ($goods = $GoodsIds->Fetch()) {
    $db_groups = CIBlockElement::GetElementGroups(
    	$goods['ID'],
    	true
    );
    while ($ar_group = $db_groups->Fetch()) {
        $arSections[$ar_group['ID']] = $ar_group['NAME'];
    }
}

foreach ($arSections as $k => $arSection) {
	echo $arSection; // название раздела

	$APPLICATION->IncludeComponent(
	   "bitrix:catalog.section",
	    "",
	    array(
	        ... компонент bitrix:catalog.section  ...
	        "SECTION_ID" => $k, // ID раздела
	        "FILTER_NAME" => "arrFilterBrand",
	        ... компонент bitrix:catalog.section  ...
	        ),
	    false
	);

}
  • С помощью CIBlockElement::GetList получили ID всех товаров текущего бренда.
  • C помощью CIBlockElement::GetElementGroups получили все разделы, в которых встречаются эти товары

Самое главное: мы создали массив $arSections у которого в качестве ключа используется ID раздела, а в качестве значения название раздела.

Дальше, простым foreach перебрали этот массив, добавив в отбор bitrix:catalog.section SECTION_ID, и передав в него ID текущего раздела. А в качестве заголовка использовали, собственно название раздела.

На этом все, останется только сверстать под свой дизайн.

Вывод разделов табами

Пример работы на одном из сайтов: Bond-Gun. Что бы сделать также, добавляем следующее:


$GLOBALS['arrFilterBrand'] = array(
    "PROPERTY_CML2_MANUFACTURER_VALUE" => $arResult['NAME']
);
$listGoods = CIBlockElement::GetList(
    false,
    array('PROPERTY_CML2_MANUFACTURER_VALUE' => $arResult['NAME']),
    false,
    false,
    array('ID')
);
while ($goods = $listGoods->Fetch()) {
    $ElementId = $goods['ID'];
    $db_groups = CIBlockElement::GetElementGroups($ElementId, true);
    while ($ar_group = $db_groups->Fetch()) {
        $arSections[$ar_group['ID']] = $ar_group['NAME'];
    }
}
?>
<h3>
    Товары <?= $arResult['NAME'] ?> по разделам:
</h3>
<div id="list_tabs2">
    <div class="tabs_links2">
        <?
        $i = 0;
        foreach ($arSections as $k => $arSection) {
            $i++;
            ?>
            <div class="tabs_link2 <?echo $i==1 ? ' active2' : ' ';?>"><?= $arSection ?></div>
            <?php
        } ?>
    </div>

    <div class="tabs_content2">
        <?
        $i = 0;
        foreach ($arSections as $k => $arSection) {
            $i++;
            ?>
            <div class="tab_cont2<?echo $i==1 ? ' active2' : ' ';?>">
                <h3 class="brand_title"><?= $arSection ?></h3>
                    <? $APPLICATION->IncludeComponent(
                        "bitrix:catalog.section",
                        "section",
                        array(
                            ... компонент bitrix:catalog.section  ...
                            "SECTION_ID" => $k,
                            "FILTER_NAME" => "arrFilterBrand",
                           ... компонент bitrix:catalog.section  ...
                        ),
                        false
                    ); ?>

            </div>
            <?php
        } ?>
    </div>
</div>

Здесь дважды обработали массив $arSections вывели отдельно названия и отдельно содержимое раздела. Осталось только добавить скрипт - переключалку табов и стили.


// script.js
$("#list_tabs2").on("click", ".tabs_link2", function () {
    var tabs2 = $("#list_tabs2 .tabs_link2"),
        cont2 = $("#list_tabs2 .tab_cont2");
    tabs2.removeClass("active2");
    cont2.removeClass("active2");
    $(this).addClass("active2");
    cont2.eq($(this).index()).addClass("active2");
    return false;
});

// style.scss
.tabs_links2 {
  display: flex;
  flex-wrap: wrap;
  margin: 30px 0px 0px 0px;
  .tabs_link2 {
    padding: 3px 15px;
    border:1px orange solid;
    margin: 0px 2px 2px 0px;
    border-radius: 3px;
    cursor: pointer;
    &.active2 {
       background: orange;
    }
  }
}

.tabs_content2 {
  margin: 0px -15px;
  .tab_cont2 {
    margin-left: 15px;
    .container {
      padding-left: 0;
      padding-right: 0;
    }
  }
  .tab_cont2 {
    display: none;
  }

  .tab_cont2.active2 {
    display: block;
  }
}

Михаил Базаров 23.08.2022
Так как здесь у catalog.section указан раздел, можно прикрутить сюда же и умный фильтр, так же передавая в него ID каждого раздела.

Работы из портфолио

В портфолио не публикуются работы, доля моего участия в которых менее 80%.
Часто обращаются за доработками уже существующих проектов или реализацией не стандратного функционала на готовых сайтах.