Недавно возникла нестандартная задача, отобразить список скидок, которые применяются к корзине из "Правил работы с корзиной". А точнее достать хотя бы название скидки и отобразить ее покупателю, что-то вроде "Скидка на всю покупку 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']); |