Форум 1С-Битрикс

Задавайте свои вопросы и отвечайте на вопросы других участников форума


Собственные условия для правил работы с корзиной Битрикс на первый заказ и тип цены

Собственные условия для правил работы с корзиной Битрикс на первый заказ и тип цены

Как создать свое условие для правил корзины битрикс, скидка на первый заказ и скидка зависящая от типа цены?

Ответ 1

Была задача сделать скидку на первый заказ покупателя. Сразу добавил туда плюсом скидку зависящую от типа цены. Переварил много информации из интернета. И написал действительно работающий функционал.

Чтобы добавить свое кастомное условие в список правила работы с корзиной нужно наследовать класс 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, данные правила будут располагаться в списке дополнительных условий

Возврат к списку