Выбрать курс
4  /  8

Один купон на разные скидки

Внимание: В статье приведены фрагменты кода, описывающие принцип реализации. Для внедрения рекомендуется обратиться к разработчикам.

В зависимости от задач функция может быть более сложной. В данном материале описан принцип реализации.

Вопрос предоставления разной величины скидки с учетом стоимости всех товаров в корзине по одному купону не так тривиален.

Например, необходимо решить следующую задачу:

  • 5% - при сумме от 500 руб. до 1 000 руб.
  • 10% - при сумме от 1 000 руб. до 5 000 руб.
  • 15% - при сумме выше 5 000 руб.

Эта задача легко бы решалась, если не одно НО: они должны применяться только при активации купона, причем один купон на всех.

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

В условиях 3-х правил указываем необходимые интервалы применения, а также дополнительное PHP-условие, которое будут доступно после установки модуля. В значении условия укажем функцию, например с названием __check_coupon(), к данной функции мы еще вернемся. Произвольное PHP условие правил работы с корзиной

Выглядит все это следующим образом:

I. Скидка 5%

Один купон на все скидки - 5%

II. Скидка 10%

Один купон на все скидки - 10%

III. Скидка 15%

Один купон на все скидки - 15%

Также создаем 4-е (служебное) правило, скидку для неё указываем 0% и создаем нужный нам купон, например, SL-WI8UK-QU3ENAW

Служебное правило с купоном

Остается прописать функцию __check_coupon() в файле init.php. В данной функции будем проверять применен или нет наш купон и возвращать истину (true) или ложь (false).

function __check_coupon()
{
	$btrue = false;
	$coupon = "SL-WI8UK-QU3ENAW";	//TODO код купона
	
	//Проверяем примененные купону для текучего пользователя
	$arCoupons = Bitrix\Sale\DiscountCouponsManager::get(true, array(), true, true);
	if (is_array($arCoupons) && array_key_exists($coupon, $arCoupons))
		$btrue = true;
	
	return $btrue;
}