В данном примере представим, что у нас установлены правила работы с корзиной, где в зависимости от количества товара меняется его цена. В фильтре учтём также, что акция может иметь ограничение по дате.
1. Соберем массив товаров со скидкой
$arDiscountItems = array(); // запишем все товары сюда if(CModule::IncludeModule('sale')){ $result = Bitrix\Sale\Internals\DiscountTable::getList( array( 'filter' => array( "LID" => SITE_ID, 'ACTIVE' => 'Y', array( "LOGIC" => "OR", "<=ACTIVE_FROM" => $DB->FormatDate(date("Y-m-d H:i:s"), "YYYY-MM-DD HH:MI:SS", CSite::GetDateFormat("FULL")), "ACTIVE_FROM" => false, ), array( "LOGIC" => "OR", ">=ACTIVE_TO" => $DB->FormatDate(date("Y-m-d H:i:s"), "YYYY-MM-DD HH:MI:SS", CSite::GetDateFormat("FULL")), "ACTIVE_TO" => false, ), ), // фильтр )); while ($data = $result->fetch()){ if($data['SHORT_DESCRIPTION_STRUCTURE']['VALUE'] >= '10'){ // размер скидки в списке маркетинговых акций foreach ($data['CONDITIONS_LIST']['CHILDREN'] as $arData){ foreach ($arData['CHILDREN'] as $arElements){ // получаем ID секций и элементов switch ($arElements['CLASS_ID']) {
case "CondBsktFldProduct": // ID товара есть if($arElements['DATA']['logic'] == 'Equal'){ $data['PRODUCT_ID'] = $arElements['DATA']['value']; $arDiscountItems[$data['PRODUCT_ID']][] = array( 'PRODUCT_ID' => $data['PRODUCT_ID'], 'NAME' => $data['NAME'], 'ACTIVE' => $data['ACTIVE'], 'CONDITIONS_LIST' => $data['CONDITIONS_LIST'], 'ACTIONS_LIST' => $data['ACTIONS_LIST'], 'SHORT_DESCRIPTION_STRUCTURE' => $data['SHORT_DESCRIPTION_STRUCTURE'], ); } break; case "CondIBSection": // отбор секций $sectionsvalue['SECTION_ID'][] = $arElements['DATA']['value']; // сохраняем ID секций break;
case "CondIBElement": // отбор элементов foreach ($arElements['DATA']['value'] as $arElementsList){ // получаем ID элементов $elementsvalue['ID'][] = $arElementsList; } break; } } } } }
2. Далее пройдемся по списку товаров раздела и добавим условия скидки
foreach($arResult['ITEMS'] as $k => $item){ if(isset($arDiscountItems[$item['ID']])){ foreach($arDiscountItems[$item['ID']] as $extra){ $cond = array(); foreach($extra['CONDITIONS_LIST']['CHILDREN'] as $v){ if($v['CLASS_ID'] == 'CondBsktCntGroup'){ $cond[] = $v['DATA']; } } $discount = $extra['SHORT_DESCRIPTION_STRUCTURE']['VALUE']; $discountType = $extra['SHORT_DESCRIPTION_STRUCTURE']['VALUE_TYPE']; $currency = $item['PRICES']['BASE']['CURRENCY']; if($discountType == 'P'){ $value = $item['PRICES']['BASE']['VALUE'] - ($item['PRICES']['BASE']['VALUE']*$discount/100); }else{ $value = $item['PRICES']['BASE']['VALUE'] - $discount; } $measure = $item['ITEM_MEASURE']['TITLE']; // [ID] = 11 мес foreach($cond as $c){ if($c['logic'] == 'Great'){ $max = $c['Value']; }elseif($c['logic'] == 'Less'){ $min = $c['Value']; }else{ $equal = $c['Value']; } } if(empty($min) && !empty($max)){ $qty = $max+1; }elseif(!empty($min) && !empty($max)){ $qty = $max+1; }elseif(!empty($equal)){ $qty = $equal; } $price = array( 'measure' => $measure, 'qty' => $qty, 'name' => $extra['NAME'], 'BASE' => $item['PRICES']['BASE']['VALUE'], 'VALUE' => $value, 'PRINT_VALUE' => CurrencyFormat($value, $currency), 'DISCOUNT' => $extra['SHORT_DESCRIPTION_STRUCTURE']['VALUE'], 'DISCOUNT_TYPE' => $extra['SHORT_DESCRIPTION_STRUCTURE']['VALUE_TYPE'], //'BUY_URL' => Add2BasketByProductID($item['ID'], $qty, array(), false), 'ACTIONS_LIST' => $extra['SHORT_DESCRIPTION_STRUCTURE'], 'conditions' => $cond ); if($item['PRICES']['BASE']['VALUE'] == $item['PRICES']['BASE']['DISCOUNT_VALUE']){ $arResult['ITEMS'][$k]['PRICES_EXTRA'][] = $price; } unset($min); unset($max); unset($qty); unset($equal); } } }
Логику обработки можно доработать под конкретные нужды, а также добавить обработку секций и элементов.
Подробнее про метод DiscountTable в документации.
Отправьте заявку нашим специалистам