Апрель 9, 2020
Теги: Магазин
Назначить условия предоставления подарков можно в административной части на странице Маркетинг > Товарный маркетинг > Правила работы с корзиной.
При этом, чтобы пользователь получил подарок, он должен добавить его в корзину и он появится там со стопроцентной скидкой (при условии количества 1, при большем количестве подарок предоставляться не будет, это логика, заложенная в ядре интернет-магазина).
Получение коллекции подарков для текущей корзины пользователя:
\Bitrix\Sale\Compatible\DiscountCompatibility::stopUsageCompatible();
$basketStorage = \Bitrix\Sale\Basket\Storage::getInstance(\Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite());
$basket = $basketStorage->getBasket();
$giftManager = \Bitrix\Sale\Discount\Gift\Manager::getInstance();
if($userId = \Bitrix\Main\Engine\CurrentUser::get()->getId())
$giftManager->setUserId($userId);
$collections = $giftManager->getCollectionsByBasket($basket);
\Bitrix\Sale\Compatible\DiscountCompatibility::revertUsageCompatible();
Получение коллекции подарков при покупке конкретных товаров:
\Bitrix\Sale\Compatible\DiscountCompatibility::stopUsageCompatible();
$giftManager = \Bitrix\Sale\Discount\Gift\Manager::getInstance();
$collections = $giftManager->getCollectionsByProduct(
\Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite()), $potentialBuy
);
\Bitrix\Sale\Compatible\DiscountCompatibility::revertUsageCompatible();
Пример разбора коллекции с определением типа товара:
foreach ($collections as $collection)
{
foreach ($collection as $gift)
{
if(!$product=\Bitrix\Catalog\ProductTable::getById($gift->getProductId())->fetch())
continue;
switch($product['TYPE'])
{
case \Bitrix\Catalog\ProductTable::TYPE_PRODUCT:
case \Bitrix\Catalog\ProductTable::TYPE_SKU:
...
break;
case \Bitrix\Catalog\ProductTable::TYPE_OFFER:
...
break;
case \Bitrix\Catalog\ProductTable::TYPE_SET:
case \Bitrix\Catalog\ProductTable::TYPE_EMPTY_SKU:
case \Bitrix\Catalog\ProductTable::TYPE_FREE_OFFER:
break;
}
}
}