В данном примере представим, что у нас установлены правила работы с корзиной, где в зависимости от количества товара меняется его цена. В фильтре учтём также, что акция может иметь ограничение по дате.
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 в документации.
(0)
Отправьте заявку нашим специалистам

Начните проект сейчас

Оставить заявку