Недавно возникла нестандартная задача по использованию сервиса купонов. Нужно было реализовать применение многоразового купона только один раз для каждого посетителя сайта, независимо зарегистрирован он или нет. Для зарегистрированных пользователей код купона записывается в пользовательской свойство UF_COUPON, для проверки вводимого купона, если пользователь, например, зашел с другого браузера.
Это пригодится для проведения акций вроде "Если ты первый раз на сайте, введи купон, чтобы получить скидку" и не было нужды создавать множество одноразовых купонов.
Решил эту задачу изменением поведения двух событий: OnSaleComponentOrderOneStepComplete и OnBeforeBasketUpdate
Итак, в файл init.php вносим изменения:
1. Установка купона при оформлении заказа
2. Проверка купона на использование при изменение корзины
Это пригодится для проведения акций вроде "Если ты первый раз на сайте, введи купон, чтобы получить скидку" и не было нужды создавать множество одноразовых купонов.
Решил эту задачу изменением поведения двух событий: OnSaleComponentOrderOneStepComplete и OnBeforeBasketUpdate
Итак, в файл init.php вносим изменения:
1. Установка купона при оформлении заказа
AddEventHandler('sale', 'OnSaleComponentOrderOneStepComplete', "OnSaleComponentOrderOneStepCompleteHandler"); function OnSaleComponentOrderOneStepCompleteHandler($ID, $arOrder, $arParams) { global $USER; $userID = $USER->GetID(); CModule::IncludeModule("catalog"); //получаем куки-массив купонов $CouponList = $_COOKIE['SESSION_COUPON']; //получаем текущий купон $CurCoupon = CCatalogDiscountCoupon::GetCoupons(); //если текущий купон уже есть в куки-массиве, то не записываем его if (!in_array($CurCoupon[0], $CouponList)) { $k = count($CouponList); $k++; } //перезаписываем куки-массив setcookie('KUPON[' . $k . ']', $CurCoupon[0], time() + (90 * 24 * 60 * 60)); //получаем значение купона в свойствах if (CUser::IsAuthorized()) { $rsUser = CUser::GetList($by, $order, array( "ID" => $USER->GetID(), ), array( "SELECT" => array( "UF_COUPON", ), ) ); $arUser = $rsUser->Fetch(); } //записываем текущий купон в свойства пользователя if (!in_array($CurCoupon[0], $arUser["UF_COUPON"])) { $arUser["UF_COUPON"][] = $CurCoupon[0]; $us = new CUser; $fields = Array( "UF_COUPON" => $arUser["UF_COUPON"]); $us->Update($userID, $fields); } //удаляем купон из сессии пользователя $_SESSION["CATALOG_USER_COUPONS"] = NULL; } |
AddEventHandler("sale", "OnBeforeBasketUpdate", "Checkin"); function Checkin($ID, $arFields) { global $USER; CModule::IncludeModule("catalog"); $userID = $USER->GetID(); $CurCoupon = CCatalogDiscountCoupon::GetCoupons(); $CouponList = $_COOKIE['SESSION_COUPON']; //получаем свойства пользователя if (CUser::IsAuthorized()) { $rsUser = CUser::GetList($by, $order, array( "ID" => $USER->GetID(), ), array( "SELECT" => array( "UF_COUPON", ), ) ); $arUser = $rsUser->Fetch(); } //проверка купона на присутсвие в куки-массиве или свойствах пользователя if (in_array($CurCoupon[0], $CouponList) || in_array($CurCoupon[0], $arUser["UF_COUPON"])) { CCatalogDiscountCoupon::OnClearCouponList($userID, $CurCoupon[0], array()); echo "<sc ript> function ready() { alert( 'Вы уже вводили этот купон!'); } document.addEventListener('DOMContentLoaded', ready); </sc ript>"; } } |