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

Тема в разделе "Как сделать...", создана пользователем Menro, 5 янв 2019.

XEvil 4.0 Релиз Состоялся!
Статус темы:
Закрыта.
  1. Menro

    Menro web, seo, email, hack

    Регистр.:
    27 янв 2008
    Сообщения:
    688
    Симпатии:
    132
    Всем привет!
    Заранее спасибо за любую помощь.
    Есть вот такой код:

    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;
     
    Последнее редактирование: 5 янв 2019
  2. Menro

    Menro web, seo, email, hack

    Регистр.:
    27 янв 2008
    Сообщения:
    688
    Симпатии:
    132
    Вопрос решен.
    Нашел чисто случайно на просторах интернете кусок кода без каких либо пояснений и всё работает!

    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;
    }
     
  3. yaski

    yaski

    Moderator
    Регистр.:
    21 фев 2010
    Сообщения:
    636
    Симпатии:
    442
    После присвоения типа цены не проверяй сумму заказа и все
     
  4. mSnus

    mSnus Постоялец

    Регистр.:
    4 дек 2015
    Сообщения:
    77
    Симпатии:
    29
    Не доверял бы непроверенным кускам кода из интернета... Очевидно, надо завести переменную, в которой хранить уровень скидок, например, DISCOUNT_GRADE (у вас она от 0 до 4, например).

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