Как настроить собственные условия в скидках «Битрикс»?

Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.

Всем хорош встроенный редактор условий скидок в «1С-Битрикс:Управление сайтом». Однако нередко условий "по умолчанию" недостаточно, и возникает необходимость настроить свои собственные. Например, если нужно создать условие по дополнительному полю. Предлагаем вариант решения:

1. Настроим базовый класс

Прежде всего найдем файл init.php по адресу /php_interface/init.php. Создадим его копию и будем с ней работать дальше. Надо создать класс, дочерний к CCatalogCondCtrlComplex, и определить в нем методы, возвращающие имя и идентификатор. Это будут GetClassName, а также GetControlID.

class CatalogCondCtrlUserProps extends \CCatalogCondCtrlComplex
{
    public static function GetClassName()
    {
        return __CLASS__;
    }
    /**
     * @return string|array
     */
    public static function GetControlID()
    {
        return array('CondUser', 'CondUserDestinationStore');
    }
}


2. Настроим метод, отдающий список условий, а именно GetControlShow

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;
    }

    /**
     * @param bool|string $strControlID
     * @return bool|array
     */
    public static function GetControls($strControlID = false)
    {
        $arControlList = array(
            'CondUser' => array(
                'ID' => 'CondUser',
                'FIELD' => 'ID',
                'FIELD_TYPE' => 'int',
                'LABEL' => 'ID Пользователя',
                'PREFIX' => 'поле ID Пользователя',
                'LOGIC' => static::GetLogic(array(BT_COND_LOGIC_EQ, BT_COND_LOGIC_NOT_EQ)),
                'JS_VALUE' => array(
                    'type' => 'input'
                ),
                'PHP_VALUE' => ''
            ),
            'CondUserDestinationStore' => array(
                'ID' => 'CondUserDestinationStore',
                'FIELD' => ''UF_USER_FIELD',
                'FIELD_TYPE' => 'string',
                'LABEL' => 'UF_USER_FIELD Пользователя',
                'PREFIX' => 'поле 'UF_USER_FIELD Пользователя',
                'LOGIC' => static::GetLogic(array(BT_COND_LOGIC_EQ, BT_COND_LOGIC_NOT_EQ)),
                'JS_VALUE' => array(
                    'type' => 'input'
                ),
                'PHP_VALUE' => ''
            ),
        );

        foreach ($arControlList as &$control)
        {
            if (!isset($control['PARENT']))
                $control['PARENT'] = true;

            $control['EXIST_HANDLER'] = 'Y';

            $control['MODULE_ID'] = 'mymodule';

            $control['MULTIPLE'] = 'N';
            $control['GROUP'] = 'N';
        }
        unset($control);

        if ($strControlID === false)
        {
            return $arControlList;
        }
        elseif (isset($arControlList[$strControlID]))
        {
            return $arControlList[$strControlID];
        }
        else
        {
            return false;
        }
    }


3. Настроим методы, работающие со строковыми представлениями

Метод Generate будет создавать условие в строковом представлении. А метод ApplyValues будет подставлять в строку конкретные значения.

public static function checkUserField($strUserField, $strCond, $strValue)
    {
        global $USER;
        $arUser = $USER->GetByID($USER->GetID())->Fetch();

        $field = $arUser[$strUserField];

        return str_replace(array('#FIELD#', '#VALUE#'), array($field, $strValue), $strCond);
    }


4. Подключим класс к обработке события

В модуле catalog подключим наш класс к обработчику OnCondCatControlBuildList.

AddEventHandler("catalog", "OnCondCatControlBuildList", Array("CatalogCondCtrlUserProps", "GetControlDescr"));



Готово!



Назад в раздел

Подписаться на новые материалы раздела:














CAPTCHA