От заказчика поступил вопрос: "Возможно ли в форме "Быстрый заказ" тоже вывести поле "Промокод" и чтобы клиенты могли вбивать его и скидка рассчитывалась?".
Ну что ж - вот и нашлась интересная задача.
Сайт работает на решении от Аспро, поэтому компонент используется их.
Для начала посмотрим на наши купоны:
На тестовой странице через API попробуем добавить скидку по купону на корзину.
if (CModule::IncludeModule("sale") && CModule::IncludeModule("catalog")) {
$coupon = 'SL-XU0Y5-HJ41R7T'; // номер нашего купона
$addCoupon = \Bitrix\Sale\DiscountCouponsManager::add($coupon);
if ($addCoupon) {
echo 'Купон применен';
} else {
echo 'Купон не применен';
}
}
Проверили - работает.
Посмотрим на код шаблона быстрого заказа (bitrix/templates/mtdd.ru-new/components/aspro/oneclickbuy.mshop/shop (у вас вероятнее всего другое название шаблона)).
В шаблон добавляем поле ввода купона и кнопку "Применить".
В нашем случае так:
<label class="coupon">Промокод</label></br>
<input id="one_click_buy_id_coupon" type="text" name="ONE_CLICK_BUY_coupon" value="" class="<?=$class;?>" style="width: 50%;"/>
<button class="button transparent big_btn long apply-button" style="float: right;">Применить</button>
</br>
<span class="answer"></span>
</br>
Добавляем js-скрипт :
<script> /* По нажатию на кнопку с классом apply-button будет делаться ajax-запрос вот сюда /include/oneclick_addcoupon.php */
$('.apply-button').click(function(){
var coupon = $('#one_click_buy_id_coupon').val();
$.ajax({
url: "/include/oneclick_addcoupon.php", // куда отправляем
type: "post", // метод передачи
dataType: "json", // тип передачи данных
data: {
"coupon": coupon
},
// после получения ответа сервера
success: function(data){
$('.answer').html('');
$('.answer').html(data.result); // выводим ответ сервера
}
});
})
</script>
Создаем файл /include/oneclick_addcoupon.php :
<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); // Обязательно подключаем, чтобы работали методы API Битрикс
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 = "";
$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 = "<span style='color: green;'>Купон Активирован</span><br/>";
} else {
$msg_box = "<span style='color: red;'>Купон уже активирован</span><br/>";
}
} else if (!$couponinfo['ACTIVE']) {
$msg_box = "<span style='color: red;'>Такого купона нет</span><br/>";
} else {
$msg_box = "<span style='color: red;'>Ошибка Активации купона</span><br/>";
}
}
}else{
// если были ошибки, то выводим их
$msg_box = "";
foreach($errors as $one_error){
$msg_box .= "<span style='color: red;'>$one_error</span><br/>";
}
}
// делаем ответ на клиентскую часть в формате JSON
echo json_encode(array(
'result' => $msg_box
));
?>
Ну вот и все.
У нас получилось так:
Всем спасибо за внимание!