Разработка на 1С-Битрикс Михаил Базаров
Блог-note

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

Просмотров: 2531
Задача: Отобразить 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С-Битрикс

Стоимость разработки сайта зависит от объёма и сложности проекта. Ниже приведены ориентировочные цены, как правило не выходят за обозначенные рамки. Срок разработки зависит от сложности проекта: как правило называю сроки с запасом.

Финальная стоимость и сроки разработки обговариваются на этапе обсуждения. Скачайте опросник на разработку, заполните как можно подробнее и вышлите удобным способом. После ознакомления смогу задать уточняющие вопросы и оценить проект.

Включено в стоимость разработки

В цену уже заложено всё, что нужно для легального и быстрого запуска. Доплачивать за базовые вещи не придётся.

  • Лицензия и модули

    Лицензия на «1С-Битрикс» нужной редакции, дополнительные модули и видео-инструкции по работе с готовым проектом.

  • Скорость и SEO

    Оптимизация кода и сервера под быструю загрузку, базовая SEO-оптимизация и добавление сайта в поисковые системы.

Блог-note

Заметки по 1С-Битрикс