Вот полная инструкция, как вывести товары конкретного бренда на странице бренда, используя компонент bitrix:catalog.item.
Принцип работы
Компонент bitrix:catalog.item — это карточка единичного товара. Он не делает выборку из базы сам, а только рендерит готовый переданный ему массив данных ITEM. Ответственность за получение списка товаров лежит на вас. Вам нужно:
- Получить ID текущего бренда (из URL, элемента инфоблока или свойства).
- Выбрать из инфоблока товаров все элементы, у которых свойство "Бренд"/"Производитель" равно ID бренда.
- Для каждого товара подготовить структуру данных
$itemи вызватьbitrix:catalog.item.
Пошаговая реализация
1. Получение ID бренда на странице
Предположим, что страница бренда — это детальная страница элемента инфоблока "Бренды". Тогда ID бренда берётся из $arResult['ID'] или из URL:
<?php
// Вариант 1: если это детальная страница бренда (компонент news.detail / catalog.element)
$brandId = $arResult['ID'];
// Вариант 2: если ID передан в параметре URL
$brandId = (int)$_REQUEST['brand_id'];
// Вариант 3: если бренд — раздел, то ID раздела
$sectionId = $arResult['ID']; // ID раздела-бренда
?>
2. Выборка товаров бренда через CIBlockElement::GetList
Свойство "Бренд" может быть разного типа: привязка к элементам (E), справочник HL-блок или просто список. Ниже пример для привязки к элементам (свойство с кодом BRAND):
<?php
if (!\Bitrix\Main\Loader::includeModule('iblock') || !\Bitrix\Main\Loader::includeModule('catalog'))
{
return;
}
$catalogIblockId = CATALOG_IBLOCK_ID; // ID вашего инфоблока товаров
$brandPropertyCode = 'BRAND'; // Код свойства "Производитель"
$brandId = (int)$arResult['ID']; // ID текущего бренда
// Получаем данные для подготовки карточек
$productIterator = \CIBlockElement::GetList(
['SORT' => 'ASC'], // сортировка
[
'IBLOCK_ID' => $catalogIblockId,
'ACTIVE' => 'Y',
'PROPERTY_' . $brandPropertyCode => $brandId,
'=AVAILABLE' => 'Y', // новые ключи каталога
],
false, // группировка
['nPageSize' => 20], // пагинация
[
'ID', 'IBLOCK_ID', 'NAME', 'CODE',
'DETAIL_PAGE_URL', 'PREVIEW_PICTURE', 'DETAIL_PICTURE',
'PREVIEW_TEXT', 'DETAIL_TEXT',
'CATALOG_QUANTITY', 'CATALOG_AVAILABLE',
]
);
$items = [];
$areaIds = [];
while ($product = $productIterator->GetNext())
{
$product['ID'] = (int)$product['ID'];
$items[] = $product;
$areaIds[$product['ID']] = 'item_' . $product['ID'] . '_' . randString(8);
}
?>
3. Подготовка параметров для catalog.item
Компонент bitrix:catalog.item ожидает структуру, аналогичную той, что формирует catalog.section. Вам нужно подготовить массив $generalParams (общие настройки каталога) и массив $itemParameters (дополнительные параметры для каждого товара):
<?php
// Параметры каталога, общие для всех товаров
$generalParams = [
'IBLOCK_ID' => $catalogIblockId,
'PRICE_CODE' => ['BASE'], // типы цен
'CONVERT_CURRENCY' => 'Y', // конвертировать валюты
'CURRENCY_ID' => 'RUB',
'BASKET_URL' => '/personal/cart/',
'USE_PRODUCT_QUANTITY' => 'N',
'ADD_PROPERTIES_TO_BASKET' => 'Y',
'PRODUCT_PROPS_VARIABLE' => 'prop',
'PARTIAL_PRODUCT_PROPERTIES' => 'N',
'ADD_PROPERTIES_TO_BASKET' => 'Y',
'PRODUCT_PROPERTIES' => [], // свойства, передаваемые в корзину
'OFFERS_FIELD_CODE' => ['ID', 'NAME'],
'OFFERS_PROPERTY_CODE' => [], // свойства ТП
'OFFERS_SORT_FIELD' => 'sort',
'OFFERS_SORT_ORDER' => 'asc',
'USE_COMPARE' => 'N',
];
// Дополнительные параметры для каждого конкретного товара (могут различаться)
$itemParameters = [];
foreach ($items as $item)
{
$itemParameters[$item['ID']] = [];
}
?>
4. Вывод товаров в цикле с помощью catalog.item
Теперь в шаблоне проходите по массиву $items и для каждого вызываете компонент:
<?php if (!empty($items)): ?>
<div class="brand-products">
<h2>Товары бренда</h2>
<div class="product-list">
<?php foreach ($items as $item):
$APPLICATION->IncludeComponent(
'bitrix:catalog.item',
'card', // ваш шаблон карточки
[
'RESULT' => [
'ITEM' => $item,
'AREA_ID' => $areaIds[$item['ID']],
'TYPE' => 'CARD',
'BIG_LABEL' => 'N',
'BIG_DISCOUNT_PERCENT' => 'N',
'BIG_BUTTONS' => 'N',
'SCALABLE' => 'N',
],
'PARAMS' => $generalParams + $itemParameters[$item['ID']],
],
$component,
['HIDE_ICONS' => 'Y']
);
endforeach; ?>
</div>
<?php // Постраничная навигация
$APPLICATION->IncludeComponent(
'bitrix:main.pagenavigation',
'',
[
'NAV_OBJECT' => $productIterator,
],
$component,
['HIDE_ICONS' => 'Y']
);
?>
</div>
<?php endif; ?>
Важные замечания
- Структура
$itemдолжна содержать поля, ожидаемые шаблономcard. Если шаблон использует дополнительные данные (цены, склады, торговые предложения), их нужно догрузить черезCIBlockElement::GetListили черезCCatalogSKU::getOffersList(). - Цены — если в шаблоне
cardиспользуются цены, их нужно получить отдельно через\Bitrix\Catalog\PriceTable::getList()и добавить в массив$itemв ключPRICES(как это делает компонентcatalog.section). - Торговые предложения — если товар имеет SKU, используйте
CCatalogSKU::getOffersList(), чтобы получить предложения и передать их в$item['OFFERS']. - Альтернатива — проще всего использовать компонент
bitrix:catalog.sectionс фильтром по свойству бренда, передав параметр~PROPERTY_BRANDили через настройкиFILTER_NAME. Он сам сформирует правильную структуру данных дляcatalog.item.
Пример с catalog.section (рекомендуемый упрощённый вариант)
<?php
$GLOBALS['arrFilterBrand'] = [
'PROPERTY_BRAND' => $brandId,
];
$APPLICATION->IncludeComponent(
'bitrix:catalog.section',
'',
[
'IBLOCK_TYPE' => 'catalog',
'IBLOCK_ID' => CATALOG_IBLOCK_ID,
'ELEMENT_SORT_FIELD' => 'sort',
'ELEMENT_SORT_ORDER' => 'asc',
'FILTER_NAME' => 'arrFilterBrand',
'SECTION_USER_FIELDS' => [],
'SHOW_ALL_WO_SECTION' => 'Y',
'PAGE_ELEMENT_COUNT' => 20,
'PRICE_CODE' => ['BASE'],
'CONVERT_CURRENCY' => 'Y',
'CURRENCY_ID' => 'RUB',
'TEMPLATE_THEME' => 'blue',
'ADD_PROPERTIES_TO_BASKET' => 'Y',
'PRODUCT_DISPLAY_MODE' => 'Y',
// остальные параметры...
],
$component,
['HIDE_ICONS' => 'Y']
);
?>
Компонент catalog.section сам выполнит всю подготовку данных и внутри своего шаблона вызовет bitrix:catalog.item для каждого товара. Это самый правильный и производительный способ.
Заключение
Вы можете выводить товары бренда как через ручной цикл с bitrix:catalog.item (нужна самостоятельная подготовка структуры $item с ценами, галереей, наличием), так и через готовый bitrix:catalog.section с фильтром по свойству бренда. Второй способ предпочтительнее, так как он гарантирует корректную структуру данных для карточки товара.