пятница, 28 сентября 2018 г.

Получение списка товаров со скидкой Bitrix D7

Примеры из интернета реализации получения списка товаров на которые установлена скидка в большинстве случаев не работают.
Внятной документации по методам api ядра D7 не нашел.
В итоге расковырял модуль вывода скидок из админки и слепил функцию.
Оставлю это чтобы потом не искать и не придумывать велосипед заново.


function GET_SALE_FILTER(){
    //Получаем разделы на которые применены скидки
    $listDiscountIds = array(
        'PRODUCTS'=>array(),
        'SECTIONS'=>array()
    );
    //Получаем информацию о скидках (исключая из выдачи купоны)
    $discountIterator = Internals\DiscountTable::getList(array(
        'select' => array('*'),
        'filter'=> array('ACTIVE'=>'Y','USE_COUPONS'=>'N'),
    ));
    while ($discount = $discountIterator->fetch()){
        $conditions_list = $discount['CONDITIONS_LIST'];
        $children = $conditions_list['CHILDREN'];
        foreach ($children as $child){
            $children_inn = $child['CHILDREN'];
            foreach ($children_inn as $item){
                switch ($item['CLASS_ID']){
                    case 'CondIBSection':       //Выбираем скидки на секции
                        {
                            if(is_array($item['DATA']['value'])) {
                                $listDiscountIds['SECTIONS'] = array_merge(
                                    $listDiscountIds['SECTIONS'],
                                    $item['DATA']['value']
                                );
                            }else {
                                $listDiscountIds['SECTIONS'][] = $item['DATA']['value'];
                            }
                            break;
                        }
                    case 'CondIBElement' :      //Выьираем скидки на товары
                        {
                            if(is_array($item['DATA']['value'])) {
                                $listDiscountIds['PRODUCTS'] = array_merge(
                                    $listDiscountIds['PRODUCTS'],
                                    $item['DATA']['value']
                                );
                            }else {
                                $listDiscountIds['PRODUCTS'][] = $item['DATA']['value'];
                            }
                            break;
                        }
                }

            }
        }
    }


    //Получаем список товаров из групп на которые висят скидки
    if(count($listDiscountIds['SECTIONS'])>0){
        $arFilter = Array('IBLOCK_SECTION_ID'=>$listDiscountIds['SECTIONS'],"ACTIVE"=>"Y");
        $res = CIBlockElement::GetList(Array(), $arFilter);
        while($ob = $res->GetNextElement())
        {
            $arFields = $ob->GetFields();
            $listDiscountIds['PRODUCTS'][]=$arFields['ID'];
        }
    }

    //Чистим дубли если они есть
    $discountProducts = $listDiscountIds['PRODUCTS'];
    $discountProducts = array_unique($discountProducts);
    unset($listDiscountIds);

    return $discountProducts;
}

Комментариев нет: