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