Ajax поле промо-код на любой странице Битрикс с помощью D7
Последние записи
Иногда от нас требуется организовать поле промо-код (ввод купона) в произвольном месте или добавить результат обработки промо-кода во всплывающей форме. В этих случаях нам требуется динамически отправлять запрос и в зависимости от результата производить действие на странице. Я расскажу как организовать данное взаимодействие
На тестовой странице добавляем поле ввода купона и кнопку "Применить".
<label class="coupon">Промокод</label></br>
<input id="basket-coupon" type="text" name="ONE_CLICK_BUY_coupon" value="" />
<button class="basket-coupon-block-coupon-btn">Применить</button>
</br>
<span class="answer"></span>Добавляем js-скрипт :
$('body').on('click','.basket-coupon-block-coupon-btn',function(e){
    e.preventDefault();
    e.stopPropagation();
    var coupon = $('#basket-coupon').val();
    $.ajax({
        url: "/include/libs/addcoupon.php", // куда отправляем
        type: "post", // метод передачи
        dataType: "json", // тип передачи данных
        data: {
            "coupon": coupon
        },
        success: function(data){
            $('.popupCoupon h2').html(data.title);
            $('.popupCoupon .subtitle').html(data.result);
            formLoad('popupCoupon');
        },
        error:function(XMLHttpRequest, textStatus, errorThrown) {
            console.log("Status: " + textStatus); alert("Error: " + errorThrown);
        }
    });
});Создаем файл /include/oneclick_addcoupon.php:
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
if (CModule::IncludeModule("sale"))
{ //Если в корзине нет товаров, то и купон не применится, поэтому проверяем, есть ли товары в корзине
    $arBasketItems = array();
    $dbBasketItems = CSaleBasket::GetList(
        array("NAME" => "ASC","ID" => "ASC"),
        array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"),
        false,
        false,
        array("ID","MODULE","PRODUCT_ID","QUANTITY","CAN_BUY","PRICE"));
    while ($arItems=$dbBasketItems->Fetch())
    {
        $arItems=CSaleBasket::GetByID($arItems["ID"]);
        $arBasketItems[]=$arItems;
        $cart_num+=$arItems['QUANTITY'];
    }
}
$msg_box = $msg_title = "";
$errors = array(); // контейнер для ошибок
if($_POST['coupon'] == ""){$errors[] = "Код купона не введен";}// проверяем корректность поля
if($cart_num<=1){$errors[] = "Добавьте товар в корзину";}
// если поле заполнено
if(empty($errors)){
    if (CModule::IncludeModule("sale") && CModule::IncludeModule("catalog")) {
        $coupon = $_POST['coupon']; // номер купона
        $couponinfo = \Bitrix\Sale\DiscountCouponsManager::getData($coupon, true); // получаем информацио о купоне
        if ($couponinfo['ACTIVE'] == "Y") {
            $addCoupon = \Bitrix\Sale\DiscountCouponsManager::add($coupon); // true - купон есть / false - его нет
            if ($addCoupon) {
                $msg_box = "Промо-код активирован";
                $msg_title = "Промо-код успешно активирован";
            } else {
                $msg_box = "Промо-код уже активирован";
                $msg_title = "Некорректный промо-код";
            }
        } else if (!$couponinfo['ACTIVE']) {
            $msg_box = "Такого промо-кода нет";
            $msg_title = "Некорректный промо-код";
        } else {
            $msg_box = "Ошибка активации промо-кода";
            $msg_title = "Некорректный промо-код";
        }
    }
}else{
    // если были ошибки, то выводим их
    $msg_box = "";
    foreach($errors as $one_error){
        $msg_box .= "$one_error";
    }
    $msg_title = "Некорректный промо-код";
}
// делаем ответ на клиентскую часть в формате JSON
echo json_encode(array(
    'result' => $msg_box,
    'title' => $msg_title
));По мотивам материала:
Комментарии