Мы используем файлы Cookies для улучшения работы сайта. Также на сайте присутствуют Яндекс метрика и Google аналитика для статистики посещаемости и пользовательского поведения. Оставаясь на сайте, вы соглашаетесь с условиями использования файлов cookies и вас устраивает использование метрики. Принять
Представим себе, что перед нами стоит следующая прикладная задача. Есть правило работы с корзиной, применяющее 10% скидку на определённые товары
Необходимо на уровне Bitrix API добавить в это правило еще несколько товаров. Данная задача актуальна, когда товаров много и вручную добавлять слишком трудозатратно.
Прежде чем приступить к решению задачи, стоит уточнить, что начиная с версии 16.6.0 модулей Информационные блоки, Торговый каталог и Интернет-магазин, доступны объединенные скидки каталога и магазина. Соответственно после конвертации правила работы с корзиной «переплыли» с CCatalogDiscount в CSaleDiscount. В новых же версиях Битрикс необходимо пользоваться классом CSaleDiscount.
Для решения задачи посмотрим, что там под капотом у нашего правила работы с корзиной (2 — это ID правила работы с корзиной):
CModule::IncludeModule('sale');
//получим список товаров в правиле работы с корзиной:
$new_ids = [];
$new_ids = unserialize(CSaleDiscount::GetByID(2)['ACTIONS'])['CHILDREN'][0]['CHILDREN'][0]['DATA']['value'];
$new_ids[] = $item_id;
$new_ids = array_unique($new_ids);
//добавим в правило работы с корзиной:
$upd = [
'ACTIVE'=>'Y',
'ACTIONS'=>[
'CLASS_ID' => 'CondGroup',
'DATA' => ['All'=>'AND'],
'CHILDREN' =>[
[
'CLASS_ID'=>'ActSaleBsktGrp',
'DATA'=> [
'Type'=>'Discount',
'Value'=>10,
'Unit'=>'Perc',
'Max'=>0,
'All'=>'AND',
'True'=>'True'
],
'CHILDREN'=>[
[
'CLASS_ID'=>'CondIBElement',
'DATA'=>[
'logic'=>'Equal',
'value'=>$new_ids
]
]
]
]
]
]
];
CSaleDiscount::Update(2, $upd );
CModule::IncludeModule('sale');
//получим список товаров в правиле работы с корзиной:
$new_ids = [];
$new_ids = unserialize(CSaleDiscount::GetByID(2)['ACTIONS'])['CHILDREN'][0]['CHILDREN'][0]['DATA']['value'];
$new_ids[] = $item_id;
$new_ids = array_unique($new_ids);
//добавим в правило работы с корзиной:
$upd = [
'ACTIVE'=>'Y',
'ACTIONS'=>[
'CLASS_ID' => 'CondGroup',
'DATA' => ['All'=>'AND'],
'CHILDREN' =>[
[
'CLASS_ID'=>'ActSaleBsktGrp',
'DATA'=> [
'Type'=>'Discount',
'Value'=>10,
'Unit'=>'Perc',
'Max'=>0,
'All'=>'AND',
'True'=>'True'
],
'CHILDREN'=>[
[
'CLASS_ID'=>'CondIBElement',
'DATA'=>[
'logic'=>'Equal',
'value'=>$new_ids
]
]
]
]
]
]
];
CSaleDiscount::Update(2, $upd );
p.s. Обращаю внимание, что создание правил работы с корзиной основанной на выборке товаров по ID может привести к проблемам с производительностью. Эта проблема обычно возникает, когда товаров в правиле много. Для улучшения ситуации лучше использовать идею, описанную в этой статье: