Вывод торговых предложений как простые товары в каталоге
Как вывести торговые предложения (SKU) как простые товары в каталоге, с учетом раздела
Предлагаю универсальное решение, которое подойдет для ситуаций, когда у вас один и когда у вас несколько разных инфоблоков каталога, но все они выводятся через один шаблон комплексного компонента.
<?php
// получаем ID инфоблока SKU принадлежащего инфоблоку каталога
$skuIblockInfo = \Bitrix\Catalog\CatalogIblockTable::getList([
'filter' => [
'PRODUCT_IBLOCK_ID' => $arParams['IBLOCK_ID'],
],
'select' => [
'IBLOCK_ID', // нужен только ID
],
'cache' => [
'ttl' => $arParams['CACHE_TIME'],
],
])->fetch();
// получаем информацию об инфоблоке ТП
$skuIbInfo = \Bitrix\Iblock\IblockTable::getList([
'filter' => [
'ID' => $skuIblockInfo['IBLOCK_ID'],
],
'select' => [
'*',
],
'cache' => [
'ttl' => $arParams['CACHE_TIME'],
],
])->Fetch();
// получаем ID текущего раздела
$curSectionId = CIBlockFindTools::GetSectionID(
$arResult['VARIABLES']['SECTION_ID'],
$arResult['VARIABLES']['SECTION_CODE'],
[
'IBLOCK_ID' => $arParams['IBLOCK_ID'],
]
);
// получаем ID элементов текущего раздела
$elementsList = \Bitrix\Iblock\ElementTable::getList([
'filter' => [
'IBLOCK_ID' => $arParams['IBLOCK_ID'],
'IBLOCK_SECTION_ID' => $curSectionId,
],
'select' => ['ID'],
'cache' => [
'ttl' => $arParams['CACHE_TIME'],
],
])->fetchAll();
$allOfferIds = [];
// проходимся по каждому элементу
foreach ($elementsList as $element) {
// получаем все ТП для текущего элемента
$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' => $skuIbInfo['IBLOCK_TYPE_ID'],
'IBLOCK_ID' => $skuIbInfo['ID'],
'FILTER_NAME' => $arParams['FILTER_NAME'],
'SECTION_ID' => '',
'SECTION_CODE' => '',
'SECTION_URL' => '',
'DETAIL_URL' => $skuIbInfo['DETAIL_PAGE_URL'],
'SHOW_ALL_WO_SECTION' => 'Y',
//...
],
$component
);
Но обычно в интернет-магазинах на Битрикс используется один основной инфоблок каталога и один дополнительный для торговых предложений. В таком случае можно усложнять код с CatalogIblockTable::getList, а можно просто посмотреть ID инфоблока предложений в админке и вставить его в код напрямую – вместо $skuIblockInfo['IBLOCK_ID'].
Оставьте комментарий
Если эта статья была полезной для вас, оставьте комментарий ниже или задайте интересующий Вас вопрос. Ваш опыт может помочь другим читателям!
Написать комментарий