Skip to content

Instantly share code, notes, and snippets.

@FlameInTheDark
Last active April 7, 2024 17:14
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save FlameInTheDark/2f418ce16237ed6b69c413b0fd8e16e4 to your computer and use it in GitHub Desktop.
Save FlameInTheDark/2f418ce16237ed6b69c413b0fd8e16e4 to your computer and use it in GitHub Desktop.
Добавление кастомных условий для модуля скидок в 1C Bitrix
<?php
/**
* Добавление кастомного условия для скидок.
* Подключить данный файл в init.php
*
* В данном примере устанавливается проверка города сохраненного в сессии
*/
use Bitrix\Main\Loader;
Loader::includeModule('catalog');
AddEventHandler("sale", "OnCondSaleControlBuildList", Array("CatalogCondCtrlCityName", "GetControlDescr")); // Корзина
AddEventHandler("catalog", "OnCondCatControlBuildList", Array("CatalogCondCtrlCityName", "GetControlDescr")); // Каталог
class CatalogCondCtrlCityName extends CGlobalCondCtrlComplex
{
public static function GetClassName()
{
return __CLASS__;
}
/**
* @return string|array
*/
public static function GetControlID()
{
return array('CondCityName');
}
/**
* Функция добавляет категорию условий и добавляет в нее
* сами условия описнные в функции GetControls()
*
* @param $arParams
* @return array
*/
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(
'CondCityName' => array(
'ID' => 'CondCityName',
'FIELD' => 'CITY_NAME',
'FIELD_TYPE' => 'text',
'LABEL' => 'Название города',
'PREFIX' => 'текущий город',
'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['MULTIPLE'] = 'N';
}
unset($control);
if ($strControlID === false)
{
return $arControlList;
}
elseif (isset($arControlList[$strControlID]))
{
return $arControlList[$strControlID];
}
else
{
return false;
}
}
/**
* Функция подготавливает строчное представление метода проверки условий.
* Эта строка запускается языковой конструкцией eval() в модуле скидок.
*
* @param $arOneCondition array Массив состояний
* @param $arParams
* @param $arControl
* @param bool $arSubs
* @return string
*/
public static function Generate($arOneCondition, $arParams, $arControl, $arSubs = false)
{
if($arOneCondition['logic']=='Equal')
{
$logic='true';
}
else
{
$logic='false';
}
$strResult = 'CatalogCondCtrlCityName::CityCheck($_SESSION["city"], "'.$arOneCondition["value"].'")==='.$logic;
return $strResult;
}
/**
* Функция выполняющая проверку условия (если возвращает true условие считается выполненым)
*
* @param array|array
* @return bool
*/
public static function CityCheck($city, $targetCity)
{
$check = false;
if ($city === $targetCity) {
$check = true;
}
return $check;
}
}
?>
@Factcore
Copy link

Здравствуйте, а можно ли как-то это правило засунуть не под Дополнительные условия, а под действия? Нужно иметь возможность выполнять разные действия в зависимости от результата действия правила.

@Factcore
Copy link

Нашёл, нужно повесить событие на OnCondSaleActionsControlBuildList и наследуемый класс заменить на CCatalogActionCtrlBasketProductFields

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment