Меню

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

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

Задача: Отобразить SKU товаров в каталоге как простые товары, учитывая текущий раздел. Необходимо вывести все торговые предложения (варианты, комплектации) для товаров, находящихся в текущем разделе каталога.
Лучше всего вынести всю описанную логику в отдельный компонент со своим классом и просто подключить в section.php

Чтобы сделать класс (например подключаемый из /vendor).
Код
<?php
namespace Ваш\namespace\если делаем модулем;

use Bitrix\Catalog\CatalogIblockTable;
use Bitrix\Iblock\IblockTable;
use Bitrix\Iblock\ElementTable;
use CCatalogSku;
use Bitrix\Iblock\SectionTable;

class IblockDataFetcher // или наследуемся от CBitrixComponent если делаем свой компонент
{
    protected $iblockId;
    protected $cacheTime;

    public function __construct($iblockId, $cacheTime)
    {
        $this->iblockId = $iblockId;
        $this->cacheTime = $cacheTime;
    }

    // Получить ID инфоблока SKU, принадлежащего каталогу
    public function getSkuIblockId()
    {
        $result = CatalogIblockTable::getList([
            'filter' => ['PRODUCT_IBLOCK_ID' => $this->iblockId],
            'select' => ['IBLOCK_ID'],
            'cache' => ['ttl' => $this->cacheTime],
        ])->fetch();

        return $result ? $result['IBLOCK_ID'] : null;
    }

    // Получить информацию об инфоблоке по ID
    public function getIblockInfo($iblockId)
    {
        return IblockTable::getList([
            'filter' => ['ID' => $iblockId],
            'select' => ['*'], // Можно урезать
            'cache' => ['ttl' => $this->cacheTime],
        ])->fetch();
    }

    // Получить текущий раздел
    public function getCurrentSectionId($sectionVariable)
    {
        return CIBlockFindTools::GetSectionID(
            $sectionVariable['SECTION_ID'],
            $sectionVariable['SECTION_CODE'],
            ['IBLOCK_ID' => $this->iblockId]
        );
    }

    // Получить список элементов текущего раздела
    public function getElementsInSection($sectionId)
    {
        return ElementTable::getList([
            'filter' => [
                'IBLOCK_ID' => $this->iblockId,
                'IBLOCK_SECTION_ID' => $sectionId,
            ],
            'select' => ['ID'],
            'cache' => ['ttl' => $this->cacheTime],
        ])->fetchAll();
    }

    // Получить предложения (SKU) для элемента
    public function getOffersForElement($elementId)
    {
        return CCatalogSku::getOffersList($elementId);
    }

    // Получить все предложения по списку элементов
    public function getAllOffers($elements)
    {
        $allOfferIds = [];
        foreach ($elements as $element) {
            $offers = $this->getOffersForElement($element['ID']);
            foreach ($offers as $offerGroup) {
                foreach ($offerGroup as $offer) {
                    $allOfferIds[] = $offer['ID'];
                }
            }
        }
        return $allOfferIds;
    }
}

Использование:
Код
// Использование класса в вашем основном файле
use App\IblockDataFetcher;

$fetcher = new IblockDataFetcher($arParams['IBLOCK_ID'], $arParams['CACHE_TIME']);

// Получаем ID инфоблока SKU
$skuIblockId = $fetcher->getSkuIblockId();

if ($skuIblockId) {
    // Получаем информацию об инфоблоке SKU
    $skuIblockInfo = $fetcher->getIblockInfo($skuIblockId);
}

// Получаем текущий раздел
$currentSectionId = $fetcher->getCurrentSectionId($arResult['VARIABLES']);

// Получаем элементы раздела
$listElements = $fetcher->getElementsInSection($currentSectionId);

// Получаем все предложения по элементам
$allOfferIds = $fetcher->getAllOffers($listElements);

// Передача в глобальный фильтр
$GLOBALS[$arParams["FILTER_NAME"]] = [
    'ID' => $allOfferIds,
];
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 

Блог-note: заметки разработчика

Кастомизация компонента восстановления пароля bitrix:system.auth.forgotpasswd

Достаточно часто спрашивают как кастомизировать компонент восстановления пароля пользователя. Типовая задача, это измени...

Если товар в корзине, поменять значение input на "В корзине"

Если Вам нужно поменять текст на кнопке, добавляющей товар в корзину, достаточно воспользоваться методом API "CSaleBaske...

Фильтрация разделов каталога с помощью умного фильтра

Задача: В каталоге выводится умный фильтр, нужно сделать так чтобы он применялся не только к товарам но и к компоненту &...

Умный фильтр только на последнем уровне разделов каталога.

Если в разработаываемом магазине или в принципе в каталоге на Битрикс, вы выводите умный фильтр в разделах - он выводитс...

Постраничная навигация в списке разделов Битрикс- catalog.section.list

Если в магазине очень много разделов и хочется вывести их с постраничной навигацией: можно воспользоваться методами CDBR...

Отключить поиск по описаниям товаров в Битрикс

Иногда, нужно отключить поиск по описаниям анонсов и детальному описанию товаров, при разработке сайтов на Битрикс. Сдел...

Бонус за выполненный заказ на внутренний счет пользователя

Задача: после того как заказ, в интернет-магазине, перешел в статус "Выполнен" начислить пользователю 5% от стоимости за...

Обновление 1С-Битрикс с PHP 7, до поддержки версии PHP 8.3

Задача: обновить устаревший сайт на платформе 1С-Битрикс, который не получал обновлений уже более 4 лет и работает на PH...

Отсортировать предложения по цене в каталоге 1С-Битрикс

Задача: в 1С-Битрикс есть настройка для вывода предложений по стоимости, но она не функционирует должным образом. Необхо...