вот как попробовал реализовать (выполняться будет крон один раз в день)
Минус:
Много правил работы с корзиной
Думаю скорость работы системы будет ниже
Плюсы:
Маркетинговые акции автоматически создаются
Реализовано на базовом функционале 1С битрикс
Обновление шаблона без переборки кода
Отсюда вопрос к знатокам:
1) правильно ли я все сделал, что пошел таким путем?
2) если ли смысл переделать шаблон корзины вместо того чтобы использовать маркетинговые акции?
3) как сильно падает производительность, в зависимости от количества акций?
В моем случае возможно применение кода ниже, так как фактически нет других правил работы с корзиной чем текущие, которые все одинаковые. Если правила будут разные код не подойдет
Код |
---|
<? // получаем список маркетинговых акций
$arrDiscount = []; // массив с существующими размерами скидок
$arrElements = []; // массив с существующими значениями свойств элементов
// Выберем существующие правила работы с корзиной
$arDiscount = \Bitrix\Sale\Internals\DiscountTable::getList( );
while($ar2 = $arDiscount->fetch()) {
array_push($arrDiscount ,$ar2["ACTIONS_LIST"]["CHILDREN"]["0"]["DATA"]["Value"]); // добавляем значения текущих скидок в массив
}
?>
<?
$elementIdBlock = 2; // id инфоблока
$arSelect = Array("ID","NAME", "PROPERTY_SALEPERCENT"); // выброрка элементов и значений свойств
$arFilter = Array("IBLOCK_ID"=>IntVal($elementIdBlock),"!PROPERTY_SALEPERCENT"=>false ); // выбираем только элементы с заполненными свойствами
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($ob = $res->GetNextElement()){
$arFields = $ob->GetFields();
array_push($arrElements ,$arFields["PROPERTY_SALEPERCENT_VALUE"]); //сохраняем в массив значения свойства элементов
}
$arrElements = array_unique($arrElements); // убираем дубли в массиве
$arrAddElements = array_diff ($arrElements, $arrDiscount); // оставляем только уникальные значение, для которых нет правил
sort($arrElements);
?>
<? // создаем маркетинговые акции для недостающих элементов
foreach ($arrElements as $value) {
$DISCOUNT_VALUE = $value;//размер скидки рублей.
$userGroups = [2];
$arDiscountFields = [
"LID" => "s1",
"NAME"=> "Скидка ".$DISCOUNT_VALUE." руб.",
"LAST_LEVEL_DISCOUNT" => "N",
"LAST_DISCOUNT" => "Y",
"ACTIVE" => "N",
"SORT" => $DISCOUNT_VALUE,
"PRIORITY" => 1,
"USER_GROUPS" => $userGroups,
'ACTIONS' => [
"CLASS_ID" => "CondGroup",
"DATA" => [
"All" => "AND"
],
"CHILDREN" => [
[
"CLASS_ID" => "ActSaleBsktGrp",
"DATA" => [
"Type" => "Discount",
"Value" => $DISCOUNT_VALUE,
"Unit" => "CurEach",
"Max" => 0,
"All" => "AND",
"True" => "True",
],
"CHILDREN" => [
[
"CLASS_ID" => "CondIBProp:2:1346",
"DATA" => [
"logic" => "Equal",
"value" => $DISCOUNT_VALUE,
],
]
]
]
]
],
"CONDITIONS" => [
'CLASS_ID' => 'CondGroup',
'DATA' => [
'All' => 'AND',
'True' => 'True',
],
'CHILDREN' => [
[
"CLASS_ID" => "CondSalePaySystem",
"DATA" => [
"logic" => "Equal",
"value" => [1],
],
],
],
]
];
$IDS = CSaleDiscount::Add($arDiscountFields); //Создаем правило корзины
}
?>
|