Если авторизоваться не получается, то попробуйте восстановить пароль. Если у вас нет аккаунта на сайте, то вы можете зарегистрироваться.
Если авторизоваться не получается, то попробуйте восстановить пароль. Если у вас нет аккаунта на сайте, то вы можете зарегистрироваться.
Если авторизоваться не получается, то попробуйте восстановить пароль. Если у вас нет аккаунта на сайте, то вы можете зарегистрироваться.

Произвольная цена товара при добавлении в корзину

6 июня 2016
Заметки программиста

Появилась у нас задачка, сделать возможным выбор пользователем тип цены, который будет добавлен вместе с товаром в корзину.

Беглый гуглеш показал, что есть нативная обертка над CSaleBasket::Add, под названием Add2Basket, которая, в свою очередь, принимает первым аргументом ID типа цен.

Отлично, подумали мы, но счастье длилось не долго - ровно до того момента, пока мы не начали тестировать это чудо. Функция никак не желала класть в корзину товар, с той ценой, которую мы просили.

Виной тому, было событие GetOptimalPrice, которое изменяла нашу цену на “оптимально-дешевую”, что нас в корне не устраивало. Все бы ничего, можно было бы подписаться на событие и делать все что угодно, но ни один из аргументов не говорил нам, какой PRICE_ID выбрал пользователь - в итоге мы отбросили этот вариант.

Гугление и изучение исходников дало нам ответ - есть два чудесных параметра, которые, конечно, по канонам Битрикса, не были задокументированы:

CUSTOM_PRICE
IGNORE_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;
}