Недавно возникла нестандартная задача, отобразить список скидок, которые применяются к корзине из "Правил работы с корзиной". А точнее достать хотя бы название скидки и отобразить ее покупателю, что-то вроде "Скидка на всю покупку 10% при сумме от 50 000 руб.".
Скидки на товар подсчитываются при добавлении товара в корзину, а вот скидки на корзину рассчитываются налету для всего заказа функцией CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors);
В этой функции я и нашёл ответ для получения применяемых скидок на корзину.
Итак, в файл init.php вносим изменения:
Вызываем эту функцию в файле basket_items.php:
Скидки на товар подсчитываются при добавлении товара в корзину, а вот скидки на корзину рассчитываются налету для всего заказа функцией CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors);
В этой функции я и нашёл ответ для получения применяемых скидок на корзину.
Итак, в файл init.php вносим изменения:
// достаем список скидок, применяемых к корзине из "Правила работы с корзиной"
if (!function_exists("getDiscountCartList")) {
function getDiscountCartList($arOrder, $USER_ID = null, $ORDER_PRICE = 0, $ORDER_WEIGHT = 0)
{
$discountList = array();
$arIDS = array();
$groupDiscountIterator = Bitrix\Sale\Internals\DiscountGroupTable::getList(array(
'select' => array('DISCOUNT_ID'),
'filter' => array('@GROUP_ID' => CUser::GetUserGroup($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 ($arIDS) {
$discountIterator = Bitrix\Sale\Internals\DiscountTable::getList(array(
'select' => array(
"ID", "NAME", "PRIORITY", "SORT", "LAST_DISCOUNT", "UNPACK", "APPLICATION", "USE_COUPONS"
),
'filter' => array(
'@ID' => $arIDS
),
'order' => array(
"PRIORITY" => "DESC",
"SORT" => "ASC",
"ID" => "ASC"
)
));
foreach ($arOrder as &$order) {
$order['PRICE'] = $order['FULL_PRICE'];
}
$arOrderAll = array(
'SITE_ID' => SITE_ID,
'USER_ID' => $USER_ID,
'ORDER_PRICE' => $ORDER_PRICE,
'ORDER_WEIGHT' => $ORDER_WEIGHT,
'BASKET_ITEMS' => $arOrder
);
while ($discount = $discountIterator->fetch()) {
$checkOrder = null;
$strUnpack = $discount['UNPACK'];
if (empty($strUnpack))
continue;
eval('$checkOrder=' . $strUnpack . ';');
if (!is_callable($checkOrder))
continue;
$boolRes = $checkOrder($arOrderAll);
unset($checkOrder);
if ($boolRes) {
$discountList[] = $discount;
}
}
}
return $discountList;
}
} |
$USER_ID = $GLOBALS["USER"]->GetID(); $discountListCart = getDiscountCartList($arResult["ITEMS"]["AnDelCanBuy"], $USER_ID, $arResult['allSum'] + $arResult['DISCOUNT_PRICE_ALL'], $arResult['allWeight']); |