Есть правило работы с корзиной. Если в корзине присутствуют определенные товары, предоставляется подарок.
На событие добавления товара в корзину добавил обработчик, в котором проверяется есть ли подарок(ки) для текущей корзины. При наличии подарка он кладется в корзину. Но почему-то подарок добавляется 2 раза, со скидкой и без. Обработчик срабатывает 4 раза. Как правильно добавить подарок в корзину?
Код |
---|
$eventManager->addEventHandler('sale', 'OnSaleBasketItemEntitySaved', 'addGiftToBasket');
function addGiftToBasket(Main\Event $event) {
$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite());
$basketItemEntity = $event->getParameter("ENTITY");
$basketItems = $basket->getBasketItems();
$arBasketProductIDs = [];
foreach ($basketItems as $basketItem) {
$arBasketProductIDs[] = $basketItem->getProductId();
}
$userId = Main\Engine\CurrentUser::get()->getId();
$giftManager = Gift\Manager::getInstance()->setUserId($userId);
DiscountCompatibility::stopUsageCompatible();
$giftCollections = $giftManager->getCollectionsByBasket($basket);
DiscountCompatibility::revertUsageCompatible();
if (!$giftManager->existsDiscountsWithGift()) {
return;
}
$giftProductID = 0;
foreach ($giftCollections as $collection) {
foreach ($collection as $gift) {
$giftProductID = $gift->getProductId();
break 2;
}
}
if (!$giftProductID) {
return;
}
if (CCatalogSKU::getExistOffers($giftProductID)) {
$giftProductID = array_shift(CCatalogSKU::getOffersList($giftProductID)[$giftProductID])["ID"];
}
// Gift in basket.
if (in_array($giftProductID, $arBasketProductIDs)) {
return;
}
$basketGiftItem = $basket->createItem("catalog", $giftProductID);
$basketGiftItem->setFields(array(
"QUANTITY" => 1,
"DISCOUNT_PRICE" => 0,
"CURRENCY" => Bitrix\Currency\CurrencyManager::getBaseCurrency(),
"LID" => $LID,
"PRODUCT_PROVIDER_CLASS" => "CCatalogProductProvider",
));
$basket->save();
}
|