Разберём, как организовать вывод товаров бренда на странице бренда с помощью связки catalog.section + catalog.item.
Общая логика
- catalog.section — отвечает за выборку и постраничную навигацию товаров из инфоблока.
- catalog.item — отвечает за отрисовку одной карточки товара внутри шаблона catalog.section.
Страница бренда — это обычно детальная страница элемента справочника "Производители" (тип reference), либо страница, на которой известен XML_ID или ID бренда. Вам нужно передать фильтр по свойству-привязке к бренду в catalog.section, а в шаблоне компонента заменить стандартный вывод на вызов catalog.item.
Шаг 1. Размещение компонента catalog.section на странице бренда
Пример вызова компонента (в публичной части или в includeComponent):
$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"my_brand_template",
array(
"IBLOCK_TYPE" => "catalog",
"IBLOCK_ID" => 2, // ID каталога
"ELEMENT_SORT_FIELD" => "sort",
"ELEMENT_SORT_ORDER" => "asc",
"FILTER_NAME" => "brandFilter", // имя массива фильтра
"SECTION_ID" => "", // не передаём, фильтр будет по свойству
"SECTION_CODE" => "",
"INCLUDE_SUBSECTIONS" => "Y",
"SHOW_ALL_WO_SECTION" => "Y", // показывать товары из любых разделов
"PAGE_ELEMENT_COUNT" => "12",
"PROPERTY_CODE" => array("BRAND_REF"), // код свойства "Производитель"
// ... остальные параметры
),
false
);
А перед вызовом компонента задаёте фильтр по бренду:
global $brandFilter;
$brandFilter = array(
"=PROPERTY_BRAND_REF" => $arResult["PROPERTIES"]["BRAND"]["VALUE"] // ID бренда
);
Важно: Параметр FILTER_NAME задаёт имя глобальной переменной, которая будет использована как фильтр. Компонент автоматически применит её к запросу выборки товаров.
Шаг 2. Создаём шаблон catalog.section, в котором вызывается catalog.item
Скопируйте стандартный шаблон /bitrix/templates/.default/components/bitrix/catalog.section/my_brand_template/.
В файле template.php шаблона catalog.section вместо прямого вывода HTML для каждой карточки товара делаете:
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
use Bitrix\Main\Localization\Loc;
foreach ($arResult["ITEMS"] as $item):
// Передаём данные одного товара в catalog.item
$APPLICATION->IncludeComponent(
"bitrix:catalog.item",
"my_item_template",
array(
"RESULT" => array(
"ITEM" => $item,
"AREA_ID" => $areaId,
"SECTION" => $arResult["SECTION"],
),
"PARAMS" => $arParams, // можно передать общие параметры
),
$component,
array("HIDE_ICONS" => "Y")
);
endforeach;
Примечание: Компонент catalog.item принимает массив RESULT с ключами ITEM, AREA_ID, SECTION. Он сам отрисует карточку товара по своему шаблону.
Шаг 3. Создаём шаблон для catalog.item
Скопируйте стандартный шаблон /bitrix/components/bitrix/catalog.item/templates/.default/ в свою папку my_item_template и кастомизируйте под дизайн страницы бренда.
В файле template.php шаблона catalog.item данные товара доступны через $arResult["ITEM"]:
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$item = $arResult["ITEM"];
?>
<div class="brand-product-card" id="<?= $arResult["AREA_ID"] ?>">
<a href="<?= $item["DETAIL_PAGE_URL"] ?>">
<img src="<?= $item["PREVIEW_PICTURE"]["SRC"] ?>" alt="<?= $item["NAME"] ?>" />
</a>
<h4><?= $item["NAME"] ?></h4>
<p class="price"><?= $item["CATALOG_PRICE_1"] ?> ₽</p>
<button class="buy-btn">Купить</button>
</div>
Полная схема работы
- Страница бренда (например, /brands/brand1/) получает данные о бренде (ID свойства).
- Формируется фильтр $brandFilter с условием =PROPERTY_BRAND_REF => ID_бренда.
- Вызывается catalog.section с этим фильтром — он выбирает все товары, привязанные к бренду.
- В шаблоне catalog.section для каждого товара вызывается catalog.item.
- catalog.item отрисовывает карточку товара по своему шаблону.
Важные замечания
- Если бренд — это Highload-блок (а не справочник инфоблока), фильтр будет через PROPERTY_MANUFACTURER (код свойства) с XML_ID бренда.
- Компонент catalog.item требует правильного IBLOCK_ID и IBLOCK_TYPE в $arParams, иначе не сможет подгрузить цену, остатки и т.д.
- Не забудьте включить кеширование для catalog.section, чтобы страница бренда не грузилась долго.