Задавайте свои вопросы и отвечайте на вопросы других участников форума
Была задача сделать скидку на первый заказ покупателя. Сразу добавил туда плюсом скидку зависящую от типа цены. Переварил много информации из интернета. И написал действительно работающий функционал.
Чтобы добавить свое кастомное условие в список правила работы с корзиной нужно наследовать класс CGlobalCondCtrlComplex и описать его правильно
Ниже разместил работающий код, который необходимо разместить в отдельном файле например \local\php_interface\lib\eventhelpers\SaleActionCustomDiscount.php
В итоге в списке условий появится дополнительный список кастомных правил. В моем случае это два правила. Первое правило делает скидку на первый заказ. Второе правило позволяет использовать скидку для определенного типа цены
namespace ProjectName\EventHelpers;
use \Bitrix\Main\Loader;
class SaleActionCustomDiscount extends \CGlobalCondCtrlComplex
{
public static function GetClassName()
{
return __CLASS__;
}
public static function GetControlID()
{
return array('DiscountPriceType','DiscountFirstOrder');
}
public static function GetControlShow($arParams)
{
$arControls = static::GetControls();
$arResult = array(
'controlgroup' => true,
'group' => false,
'label' => 'Дополнительные правила',
'showIn' => static::GetShowIn($arParams['SHOW_IN_GROUPS']),
'children' => array()
);
foreach ($arControls as &$arOneControl)
{
$arResult['children'][] = array(
'controlId' => $arOneControl['ID'],
'group' => false,
'label' => $arOneControl['LABEL'],
'showIn' => static::GetShowIn($arParams['SHOW_IN_GROUPS']),
'control' => array(
array(
'id' => 'prefix',
'type' => 'prefix',
'text' => $arOneControl['PREFIX']
),
static::GetLogicAtom($arOneControl['LOGIC']),
static::GetValueAtom($arOneControl['JS_VALUE'])
)
);
}
if (isset($arOneControl))
unset($arOneControl);
return $arResult;
}
public static function GetControls($strControlID = false)
{
$arSalePersonTypes = [
'1' => "Да"
];
$priceList = [];
if (Loader::includeModule('main')) {
// Получение типов цен
$arGroupPrice = \Bitrix\Catalog\GroupTable::getList([
'select' => ['ID', 'NAME'],
'cache' => [
'ttl' => 60,
'cache_joins' => true,
]
]);
while ($el = $arGroupPrice->fetch()) {
$priceList[$el['ID']] = $el['NAME'] . " [" . $el['ID'] . "]";
}
}
$arControlList = array(
'DiscountPriceType' => array(
'ID' => 'DiscountPriceType',
'FIELD' => 'PRICE_TYPE',
'FIELD_TYPE' => 'string',
'LABEL' => 'Тип цены',
'PREFIX' => 'Тип цены',
'LOGIC' => static::GetLogic(array(BT_COND_LOGIC_EQ, BT_COND_LOGIC_NOT_EQ)),
'JS_VALUE' => array(
"type" => "select",
"values" => $priceList,
),
'PHP_VALUE' => ''
),
'DiscountFirstOrder' => array(
'ID' => 'DiscountFirstOrder',
'FIELD' => 'ORDER_AVAILABILITY',
'FIELD_TYPE' => 'string',
'LABEL' => 'Первый заказ пользователя',
'PREFIX' => 'Первый заказ',
'LOGIC' => static::GetLogic(array(BT_COND_LOGIC_EQ, BT_COND_LOGIC_NOT_EQ)),
'JS_VALUE' => array(
'type' => 'select',
'values' => $arSalePersonTypes,
),
'PHP_VALUE' => ''
),
);
foreach ($arControlList as &$control)
{
if (!isset($control['PARENT']))
$control['PARENT'] = true;
$control['MULTIPLE'] = 'N';
}
unset($control);
if ($strControlID === false)
{
return $arControlList;
}
elseif (isset($arControlList[$strControlID]))
{
return $arControlList[$strControlID];
}
else
{
return false;
}
}
public static function Generate($arOneCondition, $arParams, $arControl, $arSubs = false)
{
if($arOneCondition['logic']=='Equal')
{
$logic='true';
}
else
{
$logic='false';
}
if (is_string($arControl))
{
$arControl = static::GetControls($arControl);
}
$boolError = !is_array($arControl);
$arValues = false;
if (!$boolError)
{
$arValues = static::Check($arOneCondition, $arOneCondition, $arControl, false);
$boolError = ($arValues === false);
}
$strResult = __CLASS__ . '::applyProductDiscount($row, "'.$arControl['FIELD'].'", "'.$arValues['value'].'")==='.$logic;
return $strResult;
}
public static function applyProductDiscount($row, $field, $value)
{
$check = true;
if($field == "ORDER_AVAILABILITY"){
global $USER;
$orderData = \Bitrix\Sale\Order::getList([
'select' => ['ID'],
'filter' => ['=USER_ID' => $USER->GetID()],
'order' => ['ID' => 'DESC']
]);
if ($order = $orderData->fetch())
{
$check = false;
}
}
if($field == "PRICE_TYPE"){
if($row['PRICE_TYPE_ID'] == $arValues['value']){
$check = false;
}
}
return $check;
}
}
и подключить в init.php сам файл и повесить на событие OnCondSaleActionsControlBuildList
include_once('lib/eventhelpers/SaleActionCustomDiscount.php');
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandlerCompatible(
'sale',
'OnCondSaleActionsControlBuildList',
['ProjectName\EventHelpers\SaleActionCustomDiscount', 'GetControlDescr']
);
Если повесить событие на OnCondSaleControlBuildList и наследуемый класс заменить на CGlobalCondCtrlComplex, данные правила будут располагаться в списке дополнительных условий