Перейти к содержимому

Свойства торговых предложений - вывод выбора и связь с товаром

Настраиваем свойства торговых предложений так, чтобы в карточке товара появился выбор размера или цвета, и разбираемся с лишними вариантами.

Решение

Смотрим, где какие свойства заведены:

use Bitrix\Main\Loader;
Loader::includeModule('catalog');
$offersIblock = CCatalogSku::GetInfoByProductIBlock(5); // инфоблок предложений
printf("товары=%s предложения=%s связь=%s\n",
$offersIblock['PRODUCT_IBLOCK_ID'], $offersIblock['IBLOCK_ID'],
$offersIblock['SKU_PROPERTY_ID']);

Товары и предложения лежат в разных инфоблоках, связанных между собой отдельным свойством. Свойство, заведённое у товара, у предложений не появится, и это первая причина жалобы «завёл размер, а выбора в карточке нет».

Отмечаем свойства, по которым строится выбор:

$prop = new CIBlockProperty();
$prop->Update($sizePropertyId, [
'IBLOCK_ID' => $offersIblock['IBLOCK_ID'],
'PROPERTY_TYPE' => 'L', // список: значения выбираются, а не вводятся
'MULTIPLE' => 'N', // множественное свойство выбор ломает
]);
// свойства для выбора отмечаются в настройках торгового каталога

Выбор строится по свойствам типа «список» и по привязкам к справочникам значений. Множественное свойство для выбора не годится в принципе: одно торговое предложение должно соответствовать ровно одному сочетанию значений.

Выводим выбор в карточке товара:

'OFFERS_PROPERTY_CODE' => ['SIZE', 'COLOR'], // свойства выбора
'OFFERS_CART_PROPERTIES' => ['SIZE', 'COLOR'], // что запомнить в корзине
'OFFERS_SORT_FIELD' => 'SORT', // порядок вариантов в карточке
'PRODUCT_PROPERTIES' => [], // свойства товара, не предложений
// список свойств выбора и список свойств корзины настраиваются раздельно

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

Считаем, сколько предложений получилось у товара:

$res = CIBlockElement::GetList([], [
'IBLOCK_ID' => $offersIblock['IBLOCK_ID'],
'PROPERTY_' . $offersIblock['SKU_PROPERTY_ID'] => $productId,
], false, false, ['ID', 'NAME', 'PROPERTY_SIZE', 'PROPERTY_COLOR']);
printf("предложений: %d\n", $res->SelectedRowsCount());
// свойство связи у каждого инфоблока своё: его номер берут из настроек каталога

Число предложений равно числу сочетаний значений выбранных свойств. Три размера и два цвета дают шесть отдельных предложений, и каждое из них - самостоятельный элемент со своей ценой и своим остатком на складе.

Лишние торговые предложения почти всегда приезжают из учётной системы. Там характеристика номенклатуры может отличаться пробелом или регистром, и на сайте это уже другое значение, а значит и другое предложение. Чистят такие дубли на стороне источника, а не правкой элементов на сайте.

Разделение свойств между товаром и предложением стоит продумать до первой выгрузки. Всё, что различает варианты, живёт у предложения; всё, что одинаково для них всех, - у товара. Смешение этих двух наборов приводит либо к дублированию характеристик в каждом предложении, либо к невозможности их отфильтровать.

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

Типичные проблемы

Свойство заведено, но выбора в карточке нет.

Оно заведено у товара, а не у инфоблока торговых предложений. Это два разных инфоблока с разными наборами свойств.

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

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

В корзине пропал размер.

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

Предложений больше, чем реальных вариантов.

Значения характеристик из учётной системы различаются регистром или лишним пробелом. Каждое такое отличие создаёт на сайте отдельное предложение.

У предложения нет цены.

Цена задана у товара, а покупается торговое предложение. Цены и остатки хранятся у того элемента, который в итоге кладётся в корзину.

Частые вопросы

Сколько свойств выбора разумно заводить?

Два-три: размер, цвет, объём. Каждое новое свойство умножает число предложений, и на пятом измерении каталог становится неуправляемым.

Можно ли вывести выбор списком вместо картинок?

Да, это оформление шаблона: данные о вариантах компонент отдаёт одинаково. Тип отображения свойства влияет только на фильтр.

Как показать предложение по умолчанию?

Сортировкой предложений: первым выбирается верхнее по порядку. Осмысленный порядок задают полем сортировки при выгрузке.

Что делать с предложением без характеристик?

Оно приезжает, когда у номенклатуры нет ни одной характеристики. Такой товар правильнее выгружать обычным элементом, без инфоблока предложений.

Смежное

Первоисточник