Вывести торговые предложения (SKU) как простые товары в каталоге, с учетом раздела.

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

Задача: Отобразить 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
);

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 500 000 руб. от 6-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 150 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 500 000 руб. от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 350 000 руб. от 1-го месяца

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

Инфресурс

от 400 000 руб. от 5-ти недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

Лечение сайтов от вирусов

от 40 000 руб. от 2-х дней

Выполню полную проверку сайта и окружения. В случае обнаружения вирусов проведу полный комплекс лечения проекта и закрытия лазеек.