Появилась у нас задачка, сделать возможным выбор пользователем тип цены, который будет добавлен вместе с товаром в корзину.
Беглый гуглеш показал, что есть нативная обертка над CSaleBasket::Add, под названием Add2Basket, которая, в свою очередь, принимает первым аргументом ID типа цен.
Отлично, подумали мы, но счастье длилось не долго - ровно до того момента, пока мы не начали тестировать это чудо. Функция никак не желала класть в корзину товар, с той ценой, которую мы просили.
Виной тому, было событие GetOptimalPrice, которое изменяла нашу цену на “оптимально-дешевую”, что нас в корне не устраивало. Все бы ничего, можно было бы подписаться на событие и делать все что угодно, но ни один из аргументов не говорил нам, какой PRICE_ID выбрал пользователь - в итоге мы отбросили этот вариант.
Гугление и изучение исходников дало нам ответ - есть два чудесных параметра, которые, конечно, по канонам Битрикса, не были задокументированы:
CUSTOM_PRICEIGNORE_CALLBACK_FUNC
именно они позволяют отключать GetOptimalPrice и использовать кастомную цену.
Быстро “наваяли” функцию, дабы упростить жизнь и нам и вам.
Пользуйтесь и модернизируйте на здоровье.
function AddProductToBasket($priceID, $qty = 1) { $qty = ($qty <= 0) ? 1 : $qty; $rsPrice = CPrice::GetList(array(),array("ID" => intval($priceID))); if (!$arPrice = $rsPrice->Fetch()) return false; $arProduct = CCatalogProduct::GetByIDEx($arPrice['PRODUCT_ID']); $arFields = Array ( "PRODUCT_ID" => $arProduct['ID'], "PRODUCT_PRICE_ID" => $arPrice["ID"], "PRICE" => $arPrice["PRICE"], "CURRENCY" => "RUB", "QUANTITY" => intval($qty), "LID" => LANG, "DELAY" => "N", "CAN_BUY" => "Y", "NAME" => $arProduct['NAME'], "CUSTOM_PRICE" => "Y", "IGNORE_CALLBACK_FUNC" => "Y", "WEIGHT" => $arProduct['PRODUCT']['WEIGHT'], ); $basketItem = CSaleBasket::Add($arFields); if ($basketItem) return $basketItem; return false; }