0  /  4

Произвольное PHP условие правил работы с корзиной. Свои (кастомные) условия в скидках

Примеры

В данной главе приведены наиболее яркие, распространенные примеры использования модуля.

Нарастающие скидки

Один из наиболее частых случаев применения модуля - реализация механизма Нарастающие скидки.

Решение данного примера вынесено в отдельный модуль, с возможностями которого можно познакомиться на странице модуля Покупай больше - плати меньше. Документация по модулю доступна на странице..

Применение скидки / наценки при выборе точек самовывоза в форме заказа

Механизм правил работы с корзиной в 1С-Битрикс дает возможность представлять скидки в зависимости от многих условий, таких как: тип плательщика, служба доставки, платежные системы и т.п. Но нет зависимости от выбранной точки самовывоза (склада). Но, как показывает практика, подобное очень часто требуется.

Внимание: Решение задачи рассмотрено на примере дефолтного шаблона компонента sale.order.ajax. В кастомизированных шаблонах решение некоторых моментов может отличаться.

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

Например, имеется 2 склада:

  • Основной склад. (идентификатор склада равно 2)
  • Дополнительный склад. (идентификатор склада равно 3)
Склады

Требуется применить скидку на товары 10%, если покупатель выбрал точку самовывоза Основной склад.

Для этого необходимо:

1) Создать соответствующее правило работы с корзиной.

Скидка 10%

Скидка 10% - условия применения

Как видно из скриншота, в качестве PHP-выражения указана обычная функция __scoder_check_stores(). Данная функция будет описана в файле init.php, к ней мы еще вернемся

2) Необходимо определить, какая на данный момент выбрана точка самовывоза. Для этого понадобится обработчик события OnSaleComponentOrderUserResult, подробнее в документации.

AddEventHandler("sale", "OnSaleComponentOrderUserResult", Array("CScoderClass", "OnSaleComponentOrderUserResultHandler"));
class CScoderClass
{
   const STORE_ID = 2;		//Ид точки самовывоза - Основной склад
   function OnSaleComponentOrderUserResultHandler(
	&$arUserResult,
	$request,
	&$arParams
   )
   {
         //если выбрана точка самовывоза - Основной склад
         if ($arUserResult['BUYER_STORE']==self::STORE_ID)
         {
               $_SESSION['IS_DISCOUNT'] = true;
         }
         else
         {
               $_SESSION['IS_DISCOUNT'] = false;
         }
   }
}

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

3. Описываем PHP-выражение - функцию __scoder_check_stores().

function __scoder_check_stores()
{
   $btrue = false;
   if ($_SESSION['IS_DISCOUNT']===true)
      $btrue = true;
   
   return $btrue;
}

Данная функция проверяет признак сессии и возвращает истину (true) или ложь (false), т.е. применять или нет скидку.

4) Остается доработать шаблон компонента формы заказа sale.order.ajax, чтобы покупатель видел скидку сразу после выбора точки самовывоза, предварительно скопировав шаблон.

По умолчанию, при выборе точки самовывоза пересчета в форме заказа не происходит, как это, например происходит при смене местоположения или службы, доставки. Поэтому покупатель при выборе точки самовывоза не сразу увидит скидку.

Чтобы это изменить, необходимо внести изменения в js-код формы заказа - в order_ajax.js. Пересчет осуществляется командой BX.Sale.OrderAjaxComponent.sendRequest(). Вызов данной команды необходимо разместить в 2-х местах.

В методе editFadePickUpContent.и в методе initMaps

phpcondition_js1.jpg

phpcondition_js2.jpg

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

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

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

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

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

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

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