Помогите с кодом изменения типа цены в Битриксе

Статус
В этой теме нельзя размещать новые ответы.

Menro

web, seo, email, hack
Регистрация
27 Янв 2008
Сообщения
689
Реакции
138
Всем привет!
Заранее спасибо за любую помощь.
Есть вот такой код:

PHP:
AddEventHandler("catalog", "OnGetOptimalPrice", "MyGetOptimalPrice");

global $LocalPrice;
$LocalPrice = 0;


function MyGetOptimalPrice($productID, $quantity = 1, $arUserGroups = array(), $renewal = "N", $arPrices = array(), $siteID = false, $arDiscountCoupons = false)
{
    global $LocalPrice;

    if($LocalPrice <= 0)
     
    {
        // Выведем актуальную корзину для текущего пользователя
        $dbBasketItems = CSaleBasket::GetList(false,
            array(
                "FUSER_ID" => CSaleBasket::GetBasketUserID(),
                "LID" => SITE_ID,
                "ORDER_ID" => "NULL"
                ),
            false,
            false,
            array("ID", "MODULE", "PRODUCT_ID", "CALLBACK_FUNC", "QUANTITY", "DELAY", "CAN_BUY", "PRICE")
        );
 
        while ($arItem = $dbBasketItems->Fetch())
        {
            if($arItem['DELAY'] == 'N' && $arItem['CAN_BUY'] == 'Y')
            {
                $LocalPrice += $arItem['PRICE']*$arItem['QUANTITY'];
                $test += $arItem['PRICE']*$arItem['QUANTITY'];
                echo '<pre>';
        print_r($test);
        echo '</pre>';
            }
        }
    }
     
    //Получаем настройки из инфоблока settings
    CModule::IncludeModule("iblock");
    $arOrder = array();
    $arFilter = array("IBLOCK_ID" =>18);
    $arSelectFields = array();
    $res = CIBlockElement::GetByID(28925);
    $test = $arProps['MIN_SUM']['VALUE'];
    while($ob = $res->GetNextElement())
    {
        $arProps = $ob->GetProperties();
    }

    $MIN_SUM = $arProps['MIN_SUM']['VALUE'];

    //ОПТ 1 при сумме заказа до 10 000 рублей
    //ОПТ 2 при сумме заказа до 20 000 рублей
    //ОПТ 3 при сумме заказа более 20 000 рублей

    // получаем все типы цен, возможные для данного товара
    $arOptPrices = CCatalogProduct::GetByIDEx($productID);


    if($LocalPrice < $MIN_SUM){ //Если цена меньше 10 тысяч, то показываем тип цены с ID 3
        $price = $arOptPrices['PRICES'][3]['PRICE'];
        $catalog_group_id = 3;
     
    }
 
    elseif($LocalPrice >= $MIN_SUM){  //Если цена 10 или больше 10 тысяч то показываем цену с ID 4
        $price = $arOptPrices['PRICES'][4]['PRICE'];
        $catalog_group_id = 4;

    }

        return array(
        'PRICE' => array(
            "ID" => $productID,
            'CATALOG_GROUP_ID' => $catalog_group_id,
            'PRICE' => $price,
            'CURRENCY' => "RUB",
            'ELEMENT_IBLOCK_ID' => $productID,
            'VAT_INCLUDED' => "Y",
        ),
        'DISCOUNT' => array(
            'VALUE' => $discount,
            'CURRENCY' => "RUB",
        ),
    );

}

Если коротко, то есть переменная $LocalPrice, которая хранит в себе сумму заказа. Если сумма заказа больше чем например 10000, то присваивается тип цены с ID=2, если больше 20000 тип цены с ID=3 и т.д. Тип цены - это другая цена, например оптовая цена, крупно оптовая.
После того как $LocalPrice стал больше 10000 ему присваивается другой тип цены (оптовая цена ID=2) и $LocalPrice становится опять меньше 10000 и коль он меньше 10000 ему присваивается розничная цена и т.д. Короче замкнутый круг...

PHP:
if($LocalPrice < 10000){
        $price = $arOptPrices['PRICES'][3]['PRICE'];
        $catalog_group_id = 3;
    }
    elseif($LocalPrice >= 10000 and $LocalPrice < 20000){
        $price = $arOptPrices['PRICES'][4]['PRICE'];
        $catalog_group_id = 4;
    }


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

PHP:
$price = $arOptPrices['PRICES'][3]['PRICE'];
$catalog_group_id = 3;
 
Последнее редактирование:
Вопрос решен.
Нашел чисто случайно на просторах интернете кусок кода без каких либо пояснений и всё работает!

PHP:
AddEventHandler("catalog", "OnGetOptimalPrice", "MyGetOptimalPrice");
global $SUM_ALL;
function MyGetOptimalPrice(
    $productID,
    $quantity = 1,
    $arUserGroups = array(),
    $renewal = "N",
    $arPrices = array(),
    $siteID = false,
    $arDiscountCoupons = false
) {
    global $SUM_ALL;
    $SUM_MAX = 20000;
    $RETAIL_PRICE_ID = 4;
    $WHOLESALE_PRICE_ID = 1;
    $IBLOCK_ID = 3;
    $CURRENCY = "RUB";
    $arOptPrices = array();
// Выведем актуальную корзину для текущего пользователя
    if($SUM_ALL <= 0) {
        $dbBasketItems = CSaleBasket::GetList(false,
            array(
                "FUSER_ID" => CSaleBasket::GetBasketUserID(),
                "LID" => SITE_ID,
                "ORDER_ID" => "NULL",
//              "PRODUCT_ID" => $productID,
                "DELAY" => "N"
            ),
            false,
            false,
            array(
                "ID",
                "CALLBACK_FUNC",
                "MODULE",
                "PRICE",
                "PRODUCT_ID",
                "QUANTITY",
                "PRODUCT_PROVIDER_CLAS"
            )
        );
        while ($arItem = $dbBasketItems->Fetch()) {
            $PRODUCT_ID = $arItem["PRODUCT_ID"];
            $QUANTITY = intval($arItem['QUANTITY']);
            // Считаем общую стоимость товаров по розничной цене
            $arOptPrices = CCatalogProduct::GetByIDEx($PRODUCT_ID);
            $arOptPrices = $arOptPrices["PRICES"];
            $PRICE = $arOptPrices[$RETAIL_PRICE_ID]["PRICE"];
            $SUM_ALL += $PRICE * $QUANTITY;
            // Считаем общую стоимость товаров по розничной цене
        }
    }
// Выведем актуальную корзину для текущего пользователя
// получаем все типы цен, возможные для данного товара
    $arOptPrices = array();
    $arOptPrices = CCatalogProduct::GetByIDEx($productID);
    $arOptPrices = $arOptPrices["PRICES"];
// получаем все типы цен, возможные для данного товара
// устанавливаем тип цен
    if($SUM_ALL < $SUM_MAX){
        $PRICE = $arOptPrices[$RETAIL_PRICE_ID]['PRICE'];
        $CATALOG_GROUP_ID = $RETAIL_PRICE_ID;
    } elseif($SUM_ALL >= $SUM_MAX) {
        $PRICE = $arOptPrices[$WHOLESALE_PRICE_ID]['PRICE'];
        $CATALOG_GROUP_ID = $WHOLESALE_PRICE_ID;
    }
    $arResult = array(
        'PRICE' => array(
            'ID' => $productID,
            'CATALOG_GROUP_ID' => $CATALOG_GROUP_ID,
            'PRICE' => $PRICE,
            'CURRENCY' => $CURRENCY,
            'ELEMENT_IBLOCK_ID' => $IBLOCK_ID,
            'VAT_RATE' => 0,
            'VAT_INCLUDED' => "N",
        ),
        'RESULT_PRICE' => array(
            'BASE_PRICE' => $PRICE,
            'DISCOUNT_PRICE' => $PRICE,
            'DISCOUNT' => 0,
            'PERCENT' => 0,
            'CURRENCY' => $CURRENCY,
        ),
        'DISCOUNT_PRICE' => $PRICE,
        'DISCOUNT' => array(),
        'DISCOUNT_LIST' => array()
    );
// устанавливаем тип цен
    return $arResult;
}
 
После присвоения типа цены не проверяй сумму заказа и все
 
Не доверял бы непроверенным кускам кода из интернета... Очевидно, надо завести переменную, в которой хранить уровень скидок, например, DISCOUNT_GRADE (у вас она от 0 до 4, например).

А дальше проверять не только по LocalPrice, но и по этим уровням - если DISCOUNT_GRADE == 0 и LocalPrice > 10000, это одно, а если DISCOUNT_GRADE > 0, то LocalPrice нас интересует начиная с 20000 уже.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху