Появилась у нас задачка, сделать возможным выбор пользователем тип цены, который будет добавлен вместе с товаром в корзину.
Беглый гуглеш показал, что есть нативная обертка над 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;
}