Каталог с комплектами и торговыми предложениями.
Если в корзину добавить комплект и потом торговое предложение, то цена соответствующая - 100р.
Если убрать комплект из корзины, то цена добавленного раннее торгового предложения - 0р.
Что я делал:
1. Отключил все правила работы с корзиной.
2. Отключил все обработчики событий (OnSaleBasketBeforeSaved, OnSaleBasketItemRefreshDataHandler).
3. Очистил кеш на всем сайте.
Все CustomProviderClass убрал.
Товар добавляется в корзину вызовом
Loader::includeModule('catalog');
Loader::includeModule('sale');
$price = self::getPriceElement($id, 1); // возвращает цену, данные берутся из каталога поле BASE_PRICE.
$arFields = [
'PRODUCT_ID' => (int)$id,
'QUANTITY' => (int)$quantity,
'PRICE' => $price,
'CURRENCY' => 'RUB',
];
if ($sort > 0)
{
$arFields['SORT'] = $sort;
}
$obBasket = self::getBasketForCurrentFUser();
$strategy = \Bitrix\Sale\Basket\RefreshFactory::create(\Bitrix\Sale\Basket\RefreshFactory::TYPE_FULL);
$items = $obBasket->getBasketItems();
$bHasItem = false;
$thisItem = false;
$itemId = false;
foreach ($items as $item)
{
if ($item->getField('PRODUCT_ID') !== $id) continue;
$thisItem = $item;
$bHasItem = true;
$itemId = $item->getId();
break;
}
$isSuccess = false;
$rs = false;
if (! $bHasItem)
{
$rs = \Bitrix\Catalog\Product\Basket::addProductToBasketWithPermissions($obBasket, $arFields, ['SITE_ID' => 's3'], false);
}
else
{
if ($quantity > 0)
{
$thisItem->setField('QUANTITY', $quantity);
}
else
{
$rsDelete = $thisItem->delete();
$obBasket->refresh($strategy);
$rsSaved = $obBasket->save();
return $rsSaved->isSuccess();
}
}
if (!$bHasItem && !$rs->isSuccess())
{
self::log($rs->getErrorMessages(), 'logs/erronbasketadd.log');
return false;
}
$obBasket->refresh($strategy);
$saved = $obBasket->save();
В init.php есть только подключение файлов handlers.php и functions.php и ниже - регистрация кастомных классов.
Почему так происходит?