В данной главе приведены наиболее яркие, распространенные примеры использования модуля.
Один из наиболее частых случаев применения модуля - реализация механизма Нарастающие скидки.
Решение данного примера вынесено в отдельный модуль, с возможностями которого можно познакомиться на странице модуля Покупай больше - плати меньше. Документация по модулю доступна на странице..
Механизм правил работы с корзиной в 1С-Битрикс дает возможность представлять скидки в зависимости от многих условий, таких как: тип плательщика, служба доставки, платежные системы и т.п. Но нет зависимости от выбранной точки самовывоза (склада). Но, как показывает практика, подобное очень часто требуется.
Внимание: Решение задачи рассмотрено на примере дефолтного шаблона компонента sale.order.ajax. В кастомизированных шаблонах решение некоторых моментов может отличаться.
В статье приведены фрагменты кода, описывающие принцип реализации, а не полностью рабочий продукт. Для внедрения рекомендуется обратиться к разработчикам.
Например, имеется 2 склада:
Требуется применить скидку на товары 10%, если покупатель выбрал точку самовывоза Основной склад.
Для этого необходимо: |
1) Создать соответствующее правило работы с корзиной.
Как видно из скриншота, в качестве 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
Если вы сделали все правильно, то настроенная вами скидка должна применяться при выборе нужной точки самовывоза.
Внимание: В статье приведены фрагменты кода, описывающие принцип реализации. Для внедрения рекомендуется обратиться к разработчикам.
В зависимости от задач функция может быть более сложной. В данном материале описан принцип реализации.
Вопрос предоставления разной величины скидки с учетом стоимости всех товаров в корзине по одному купону не так тривиален.
Например, необходимо решить следующую задачу:
Эта задача легко бы решалась, если не одно НО: они должны применяться только при активации купона, причем один купон на всех.
Для решения данной задачи необходимо создать 3 правила работы с корзиной с самими скидками (т.к. в нашем примере их 3) и еще одно правило под купон (назовем его служебным), последнее правило с нулевой скидкой.
В условиях 3-х правил указываем необходимые интервалы применения, а также дополнительное PHP-условие, которое будут доступно после установки модуля. В значении условия укажем функцию, например с названием __check_coupon(), к данной функции мы еще вернемся. Произвольное PHP условие правил работы с корзиной
Выглядит все это следующим образом:
Также создаем 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; }
В 1С-Битрикс имеются как одноразовые купоны, так и многоразовые.
Как быть, если многоразовый купон необходимо сделать одноразовым? Как это понимать?
Очень просто, бывает стоит задача создать какой то один купон с кодом, например СКИДКА и ограничить его использование одним и тем же пользователем много раз. Т.е. если покупатель уже воспользовался купоном и создал заказ, то чтобы более не мог его использовать. Деактивировать купон или сделать его одноразовым нельзя, т.к. этим же купоном должны иметь возможность воспользоваться другие покупатели.
Внимание: В статье приведены фрагменты кода, описывающие принцип реализации. Для внедрения рекомендуется обратиться к разработчикам.
В зависимости от задач функция может быть более сложной. В данном материале описан принцип реализации.
Конечно, задачу можно решить не одним способом. Но мы предлагаем воспользоваться модулем Произвольное PHP условие правил работы с корзиной.
Принцип реализации не сложен. Также необходимо создать правило для работы с корзиной, создать нужный многоразовый купон. На дополнительных условиях правила прописать произвольную PHP-функцию, которая будет проверять совершал ли покупатель с данным купоном заказ или нет, и возвращать ИСТИНУ (true) или ЛОЖЬ (false). Например функция __sc_check_multi_coupon() (это всего лишь пример, как может выглядеть функция, для внедрения рекомендуется обратиться к разработчикам.):
function __sc_check_multi_coupon() { $btrue = true; $ar_orders = array(); $arFilter = Array( "USER_ID" => $GLOBALS["USER"]->GetID(), "!CANCELED" => "Y", ); $db_sales = CSaleOrder::GetList( array("DATE_INSERT" => "desc"), $arFilter, false, false, array("ID") ); while ($ar_sales = $db_sales->Fetch()) { $ar_orders[] = $ar_sales["ID"]; } if (count($ar_orders)>0) { $str_coupons = "КУПОН1,КУПОН2,...,КУПОНN"; //TODO заменить на свои купоны $ar = explode(",",$str_coupons); if (is_array($ar) && count($ar)>0) { $ar_coupons = array(); foreach ($ar as $key => $coupon) { if (strlen(trim($coupon))>0) $ar_coupons[] = trim($coupon); } } if (is_array($ar_coupons)) { $couponList = \Bitrix\Sale\Internals\OrderCouponsTable::getList(array( 'select' => array('COUPON'), 'filter' => array( '=ORDER_ID' => $ar_orders, 'COUPON' => $ar_coupons ) )); if ($coupon = $couponList->fetch()) { $btrue = false; } } } return $btrue; }