Корзина. Памятка по компоненту sale.basket.basket
Запись от 13.11.2015
Проблема: в корзину у неавторизованного пользователя в $arResult отсутствуют ключи ["GRID"]["ROWS"][0]["CATALOG"].
Было установлено, что добавляется ["CATALOG"] в обработке события "OnExtendBasketItems" в файле:
/bitrix/modules/catalog/general/discount.php
CAllCatalogDiscount::ExtendBasketItems();
Регистрация на событие в файле:
/bitrix/modules/catalog/install/index.php
RegisterModuleDependences("sale", "OnExtendBasketItems", "catalog", "CCatalogDiscount", "ExtendBasketItems", 100);
Запуск события в файле:
/bitrix/modules/sale/general/discount.php
ExecuteModuleEventEx($arEvent, array(&$arOrder['BASKET_ITEMS'], $arExtend));
На сколько я понял, событие не запускается, т.к. у неавторизованного нет скидок (пустой $arIDS):
Подробное объяснение механизма работы от Евгения Жукова:
Было установлено, что добавляется ["CATALOG"] в обработке события "OnExtendBasketItems" в файле:
/bitrix/modules/catalog/general/discount.php
CAllCatalogDiscount::ExtendBasketItems();
Регистрация на событие в файле:
/bitrix/modules/catalog/install/index.php
RegisterModuleDependences("sale", "OnExtendBasketItems", "catalog", "CCatalogDiscount", "ExtendBasketItems", 100);
Запуск события в файле:
/bitrix/modules/sale/general/discount.php
ExecuteModuleEventEx($arEvent, array(&$arOrder['BASKET_ITEMS'], $arExtend));
На сколько я понял, событие не запускается, т.к. у неавторизованного нет скидок (пустой $arIDS):
$arIDS = array();
$groupDiscountIterator = Internals\DiscountGroupTable::getList(array(
'select' => array('DISCOUNT_ID'),
'filter' => array('@GROUP_ID' => CUser::GetUserGroup($arOrder['USER_ID']), '=ACTIVE' => 'Y')
));
while ($groupDiscount = $groupDiscountIterator->fetch())
{
$groupDiscount['DISCOUNT_ID'] = (int)$groupDiscount['DISCOUNT_ID'];
if ($groupDiscount['DISCOUNT_ID'] > 0)
$arIDS[$groupDiscount['DISCOUNT_ID']] = true;
}
if (!empty($arIDS))
{
$arIDS = array_keys($arIDS);
$couponList = DiscountCouponsManager::getForApply(array('MODULE' => 'sale', 'DISCOUNT_ID' => $arIDS), array(), true);
$arExtend = array(
'catalog' => array(
'fields' => true,
'props' => true,
),
);
foreach (GetModuleEvents('sale', 'OnExtendBasketItems', true) as $arEvent)
{
ExecuteModuleEventEx($arEvent, array(&$arOrder['BASKET_ITEMS'], $arExtend));
}
Подробное объяснение механизма работы от Евгения Жукова:
1. Ключ CATALOG в массиве элементов корзины, появляющийся после вызова CSaleDiscount::DoProcessOrder - СЛУЖЕБНЫЙ. Он не должен был выходить за пределы метода - это наша ошибка, к сожалению.
2. Ключ заполняется данными из каталога только при наличии правил корзины, действующих на группы текущего пользователя (публичка) или клиента, для которого менеджер создает заказ (админка). Авторизован пользователь или нет (в публичке) - роли НЕ ИГРАЕТ.
3. Ключ CATALOG содержал все поля и свойства товара по одной причине - до версии sale 15.5.1 правила корзины не могли сообщать, какие данные о товарах необходимы для правильного расчета. Сейчас этот механизм реализован, но пока используется только при оформлении заказа из админки.
4. С выходом sale 16.0.0 компоненты тоже перейдут на новый механизм получения свойств и полей товаров для правил корзины. Это означает что ключ CATALOG для товаров либо вообще не будет заполнен (нет правил корзины с условиями каталога), либо будет содержать информацию об отдельных свойствах и полях. По этой причине ключ исчезнет.