Решение проблемы с сохранением купона на скидку при повторном заказе

За что люблю битрикс, так за то, что не дает расслабиться и все время держит в тонусе. (с)

В рамках CMS Битрикс существует возможность создавать на основе правил работы с корзиной соответствующие купоны на заказ для привлечения покупателей (не следует путать с купонами скидок на товар, которые создаются на основе скидок на товар. В рамках Битрикс это две разные сущности).

Подробнее про купоны на товары,
  
Подробнее про правила работы с корзиной.

Окно создания купонов выглядит следующим образом:

coupon.jpg

и находится в административном разделе, в «Маркетинг\Товарный Маркетинг». Само создание купонов правил работы с корзиной является частью модуля «Интернет-магазин», подробная документация для разработчиков изложена здесь .

Создаваемые купоны, в частности, могут быть трех разных видов действия – многоразовые, на один товар и на один заказ.

Одной из частых проблем с многоразовыми купонами, которой и посвящена настоящая статья, является сохранение ранее введенного кода такого купона в соответствующем поле для ввода (такое происходит в силу работы механизма сессий Битрикс), что может нарушать требования заказчика к графическому оформлению сайта (или ломать логику его работы, если работа некоторых некачественных «решений» некорректно использует многоразовые купоны).

Согласно позиции разработчика Битрикс, такое поведение системы нормально в рамках логики системы (недоступными для повторного использования после оформления заказа становятся только одноразовые купоны), однако может быть исправлено следующим путем:

В рамках модуля Интернет-Магазин существует класс DiscountCouponsManager (документация ), в рамках которого можно автоматизированного проводить операции с купонами, минуя административную часть.

Необходимо осуществить следующие действия:

1. Выбираем место для подключения кода. Разумнее это сделать в рамках обработчика события OnSaleComponentOrderOneStepComplete (Вызывается в компоненте bitrix:sale.order.ajax после создания заказа и всех его параметров, после отправки письма, но до редиректа на страницу с информацией о созданном заказе и оплате заказа), написав соответствующий класс в файле /bitrix/php_interface/init.php (или ином, используемом на вашем проекте для подобных включений).

 2.Класс обработчика выглядит следующим образом:
AddEventHandler("НАЗВАНИЕ МОДУЛЯ", "НАЗВАНИЕ СОБЫТИЯ", Array("НАЗВАНИЕ КЛАССА", "НАЗВАНИЕ МЕТОДА КЛАССА"));
Array("НАЗВАНИЕ КЛАССА", "НАЗВАНИЕ МЕТОДА КЛАССА")); - может быть заменено "НАЗВАНИЕ ФУНКЦИИ");
*НАЗВАНИЕ КЛАССА ИЛИ ФУНКЦИИ*
*КОД*
Подробнее о написании обработчиков событий в битрикс вы можете узнать на официальном сайте

3. В состав кода включаем следующие абстрактные методы класса:

DiscountCouponsManager::init(); //очищаем список купонов для данного хита

DiscountCouponsManager::clear(true); //инициализируем корзину пользователя 
 
$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite()); //применяем купон, должен идти после инициализации корзины, так как иначе купон не будет применен 
DiscountCouponsManager::add($coupon);
4.Если логика вашего магазина предусматривает ввод купона на этапе создания заказа – возможно использование методов очистки купона и на событии создания\изменения корзины – OnBeforeBasketAdd.
В таком случае разумнее воспользоваться методами DiscountCouponsManager::init(), а затем DiscountCouponsManager::clearApply или тем же DiscountCouponsManager::clear() без дополнительных событий по добавлению купона.
Можно вообще использовать DiscountCouponsManager::init(
где необходимо указать после первый двух третий параметр -
$clearStorage = true); что автоматически очистит ранее введенные купоны.

5. Возможна очистка введенных значений купонов и в рамках других событий, например, при авторизации пользователя или при его заходе на страницу корзину и начале создания заказа, например OnPageStart или OnAfterUserLogin (подробнее).

Рабочий пример кода для очистки введенных многоразовых купонов.
Он должен быть расположен в init.php либо во включаемых файлах к нему.

#Удаление информации о введенных купонах после оформления заказа
AddEventHandler("sale", "OnSaleOrderSaved", Array("clearCupon", "OnSaleOrderSavedHandler"));
class clearCupon
{
    function OnSaleOrderSavedHandler()
    {
        \Bitrix\Main\Loader::includeModule('sale');
        \Bitrix\Sale\DiscountCouponsManager::init();
        \Bitrix\Sale\DiscountCouponsManager::clear(true);
        \Bitrix\Sale\DiscountCouponsManager::clearApply(true);
    }
}
Надеемся, что предоставленная нами информация оказалась для вас полезной!



support@capyba.ru