Задача: Отобразить SKU товаров в каталоге как простые товары, учитывая текущий раздел. Необходимо вывести все торговые предложения (варианты, комплектации) для товаров, находящихся в текущем разделе каталога.
Получение ID инфоблока торговых предложений зная ID инфоблока каталога
Для начала нужно получить ID инфоблока с торговыми предложениями. В файле section.php комплексного шаблона каталога добавьте следующий код:
$skuIblockInfo = \Bitrix\Catalog\CatalogIblockTable::getList(array(
'filter' => [
'PRODUCT_IBLOCK_ID' => $arParams['IBLOCK_ID']
],
'select' => [
'IBLOCK_ID' // нам нужен только ID. Можете дополнительные поля если нужны
]
))->fetch();
В результате в переменной $skuIblockInfo['IBLOCK_ID'] будет храниться ID инфоблока с торговыми предложениями. Если параметр 'select' не указывать, вы получите дополнительную информацию:
Array
(
[IBLOCK_ID] => 3
[YANDEX_EXPORT] => N
[SUBSCRIPTION] => N
[VAT_ID] => 0
[PRODUCT_IBLOCK_ID] => 2
[SKU_PROPERTY_ID] => 19
)
В большинстве магазинов используется один инфоблок каталога и один связанный с ним инфоблок предложений. В таком случае нет необходимости использовать CatalogIblockTable::getList — достаточно посмотреть ID SKU инфоблока в админке и использовать его.
Я предлагаю универсальный подход, который будет полезен, если у вас много инфоблоков каталога (и, соответственно, много инфоблоков с предложениями), но вы используете один шаблон комплексного каталога для всех.
Получаем текущий раздел и ID торговых предложений по ID элементов раздела
- Получение информации об инфоблоке SKU. Используем метод Bitrix\Iblock\IblockTable::getList, чтобы получить тип инфоблока, его ID и путь к детальной странице элемента.
- Получение ID текущего раздела. Сначала получаем ID текущего раздела с помощью CIBlockFindTools::GetSectionID.
- Получение ID элементов текущего раздела. Используем метод Bitrix\Iblock\ElementTable::getList, чтобы получить ID всех товаров в текущем разделе.
- Получение торговых предложений. Для каждого элемента текущего раздела используем метод CCatalogSku::getOffersList, чтобы получить информацию о торговых предложениях и собрать их ID в массив $allOfferIds.
- Передача массива в глобальный фильтр. Применяем его к компоненту bitrix:catalog.section и заполняем параметры для работы с инфоблоком торговых предложений.
Привожу весь код с комментариями:
// Получаем ID инфоблока SKU принадлежащего инфоблоку каталога
$skuIblockInfo = \Bitrix\Catalog\CatalogIblockTable::getList(array(
'filter' => [
'PRODUCT_IBLOCK_ID' => $arParams['IBLOCK_ID']
],
'select' => [
'IBLOCK_ID' // нам нужен только ID
],
'cache' => [
'ttl' => $arParams["CACHE_TIME"]
]
))->fetch();
// Получаем информацию об инфоблоке предложений
$resSkuIblock = Bitrix\Iblock\IblockTable::getList([
'filter' => [
'ID' => $skuIblockInfo['IBLOCK_ID']
],
'select' => [
'*' // Можно отобрать только нужные поля
],
'cache' => [
'ttl' => $arParams["CACHE_TIME"]
]
])->Fetch();
// Получаем ID текущего раздела
$currentSectionId = CIBlockFindTools::GetSectionID(
$arResult['VARIABLES']['SECTION_ID'],
$arResult['VARIABLES']['SECTION_CODE'],
[
'IBLOCK_ID' => $arParams['IBLOCK_ID']
]
);
// Получение ID элементов текущего раздела
$listElements = Bitrix\Iblock\ElementTable::getList([
'filter' => [
'IBLOCK_ID' => $arParams['IBLOCK_ID'],
'IBLOCK_SECTION_ID' => $currentSectionId
],
'select' => ['ID'],
'cache' => [
'ttl' => $arParams["CACHE_TIME"]
]
])->fetchAll();
// Проходим по каждому элементу
$allOfferIds = [];
foreach ($listElements as $element) {
// Получаем предложения (SKU) для текущего элемента
$offers = CCatalogSku::getOffersList($element['ID']);
// Перебираем все предложения
foreach ($offers as $offerGroup) {
foreach ($offerGroup as $offer) {
// Собираем только ID предложений
$allOfferIds[] = $offer['ID'];
}
}
}
// Передача в глобальный фильтр
$GLOBALS[$arParams["FILTER_NAME"]] = [
'ID' => $allOfferIds,
];
$intSectionID = $APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"",
[
"IBLOCK_TYPE" => $resSkuIblock["IBLOCK_TYPE_ID"],
"IBLOCK_ID" => $resSkuIblock["ID"], // или $skuIblockInfo['IBLOCK_ID']
"FILTER_NAME" => $arParams["FILTER_NAME"],
"SECTION_ID" => '',
"SECTION_CODE" => '',
"SECTION_URL" => '',
"DETAIL_URL" => $resSkuIblock['DETAIL_PAGE_URL'],
"SHOW_ALL_WO_SECTION" => "Y",
// ....
// Остальные настройки bitrix:catalog.section
// ....
],
$component
);