Предлагаю в методы GetProductData и OrderProduct интерфейса IBXSaleProductProvider обязательно передавать ID элемента корзины (BASKET_ID).
[spoiler]
Например внутри вызова CSaleBasket::UpdateBasketPrices:
Было:
$arFields = $productProvider::GetProductData(array(
"PRODUCT_ID" => $arItem["PRODUCT_ID"],
"QUANTITY" => $arItem["QUANTITY"],
"RENEWAL" => "N",
"CHECK_COUPONS" => ('Y' == $arItem['CAN_BUY'] && 'N' == $arItem['DELAY'] ? 'Y' : 'N')
)); |
Сделать:
$arFields = $productProvider::GetProductData(array(
"BASKET_ID" => $arItem["ID"],
"PRODUCT_ID" => $arItem["PRODUCT_ID"],
"QUANTITY" => $arItem["QUANTITY"],
"RENEWAL" => "N",
"CHECK_COUPONS" => ('Y' == $arItem['CAN_BUY'] && 'N' == $arItem['DELAY'] ? 'Y' : 'N')
)); |
Это позволит создавать очень гибкие собственные обработчики при установке своего PRODUCT_PROVIDER_CLASS, производить любые расчеты цены (и возможности покупки товара) на основании параметров элемента корзины. Например, можно при добавлении товара в корзину устанавливать ему параметр скидку в 55 рублей, и потом не зависимо от того есть ли сейчас активные скидки на сайте, всегда вычитать из стоимости товара 55 рублей. Т.е даже после окончания акции, если пользователь успел добавить товар в корзину, у него останется скидка.
В общем передача ID элемента корзины даст огромные возможности по расширению функционала корзины с сохранением возможности обновления ядра.