
Делаем ajax добавление в корзину на битрикс
Все мы знаем, что у Битрикс есть свой механизм добавления в корзину, но он громоздкий и довольно тяжелый в кастромизации.
Потому мы рассмотрим свой механизм добавления в корзину товаров и торговых предложений . В современных реалиях все будем делать ajax добавление в корзину на битрикс.
И так начнем с самого начала.
В файле catalog.item/.default/card/template.php — это шаблон отдельного товара в категории товаров битрикс, находим строку с кнопкой в корзину.
Приблизительно следующего содержания:
case 'buttons': ?> <div class="product-item-info-container product-item-hidden" data-entity="buttons-block"> <? if (!$haveOffers) { if ($actualItem['CAN_BUY']) { <a href="javascript:void(0);" data-ids="<?=$actualItem['ID']?>" data-count="1" data-url="<?=SITE_TEMPLATE_PATH?>/ajax/add2basket.php" class="product_button button-cart">В корзину</a> <? }
Для ссылки добавления в корзину прописываем свой уникальный класс или айди. Мы пропишем свой класс addbitrix в итоге у нас получится так:
case 'buttons': ?> <div class="product-item-info-container product-item-hidden" data-entity="buttons-block"> <? if (!$haveOffers) { if ($actualItem['CAN_BUY']) { <a href="javascript:void(0);" data-ids="<?=$actualItem['ID']?>" data-count="1" data-url="<?=SITE_TEMPLATE_PATH?>/ajax/add2basket.php" class="product_button button-cart addbitrix">В корзину</a> <? }
Идем далее. Создадим js файл с следующим содержимым
$(document).ready(function() { $('.addbitrix').on('click', function(event) { event.preventDefault(); var $this = $(this); var prodId = parseInt($this.data('ids')); var cartAddUrl = $this.data('url'); var cnt = $this.data('count');; var ajaxDataSend = { OFFER_ID: prodId, QUANTITY: cnt, AJAX_ADD_TO_BASKET_WITH_DOP: 'Y', }; ///console.log(ajaxDataSend); $.ajax({ url:cartAddUrl, type: 'POST', data: ajaxDataSend, }) .done(function(data) { var data = $.parseJSON(data); if(data.RESPONSE == 'OK'){ BX.onCustomEvent('OnBasketChange'); // Обновляем корзину //здесь уже Ваше модальное окно с уведомлением об успешном добавлении alert("Товар успешно добавлен в корзину"); /// modal.style.display = "block"; } }) .fail(function() { //console.log("error"); }) .always(function() { //console.log("complete"); }); ///также нужно добавить прибавление и убавление товара. здесь уже в каждой верстке свои классы, код примерный $('.product_summ .counter_plus').on('click', function (e) { var price = $('.products_variants input[name=1]:checked').attr('data-price'); if(price == undefined){ price = $('#price_current_none_offer').html(); } var count = $('.product_summ .counter_counter').html(); $('#btn_basket_add').attr('data-count', count); var result = Number(price) * Number(count); result = result.toFixed(); $('.product_summ .product_summ span').html(result + ' p'); console.log(price); }); $('.product_summ .counter_minus').on('click', function (e) { var price = $('.products_variants input[name=1]:checked').attr('data-price'); if(price == undefined){ price = $('#price_current_none_offer').html(); } var count = $('.product_summ .counter_counter').html(); if(Number(count) < Number(1)){ return false; } var count = $('.product_summ .counter_counter').html(); $('#btn_basket_add').attr('data-count', count); var result = Number(price) * Number(count); result = result.toFixed(); $('.product_summ .product_summ span').html(result + ' p'); console.log(price); }); });
назовем его addcart.js и выведем его в подвале нашего шаблона.
///Правильное подключение $APPLICATION->AddHeadScript(SITE_TEMPLATE_PATH."/addcart.js");
далее создаем файл аджакс и размещаем его по пути
<?=SITE_TEMPLATE_PATH?>/ajax/add2basket.php
Содержимое файла
<? define("NO_KEEP_STATISTIC", true); define('BX_SESSION_ID_CHANGE', false); define('NO_AGENT_CHECK', true); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); use \Bitrix\Main, \Bitrix\Main\Localization\Loc as Loc, Bitrix\Main\Loader, Bitrix\Main\Config\Option, Bitrix\Sale\Delivery, Bitrix\Sale\PaySystem, Bitrix\Sale, Bitrix\Catalog, Bitrix\Sale\Order, Bitrix\Sale\Basket, Bitrix\Currency\CurrencyManager, Bitrix\Sale\DiscountCouponsManager, Bitrix\Main\Context; use \Bitrix\Highloadblock as HL; if(!Loader::includeModule("catalog") || !Loader::includeModule("sale") || !Loader::includeModule("main") || !Loader::includeModule("iblock")) die(); global $USER; $SITE_ID = Context::getCurrent()->getSite(); $CURRENCY_CODE = CurrencyManager::getBaseCurrency(); //Форма магазина if( isset($_REQUEST["AJAX_ADD_TO_BASKET_WITH_DOP"]) && $_REQUEST["AJAX_ADD_TO_BASKET_WITH_DOP"] == "Y" ) { // $request = Context::getCurrent()->getRequest(); $OFFER_ID = intval($request->get("OFFER_ID")); $QUANTITY = intval($request->get("QUANTITY")); $PRODUCT = CIBlockElement::GetByID(/*CCatalogSku::GetProductInfo(*/$OFFER_ID/*)['ID']*/)->GetNext(); // Получение корзины для текущего пользователя $basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite() ); if($QUANTITY > 1) $QUANTITY = $QUANTITY; else $QUANTITY = 1; if ($item = $basket->getExistsItem('catalog', $PRODUCT["ID"])){ //Обновление товара в корзине $item->setField('QUANTITY', $item->getQuantity() + $QUANTITY); }else{ //Добавление товара $item = $basket->createItem('catalog', $PRODUCT["ID"]); $item->setFields([ 'QUANTITY' => $QUANTITY, 'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(), 'LID' => \Bitrix\Main\Context::getCurrent()->getSite(), 'PRODUCT_PROVIDER_CLASS' => \Bitrix\Catalog\Product\Basket::getDefaultProviderName() , ]); } //Сохранение изменений $basket->save(); echo json_encode(Array('RESPONSE' => 'OK')); } require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php"); die();
Если вни мательно рассмотреть код , то видим что данный файл добавляет товар в корзину если его нету, или обновляет значение в корзине если товар там уже есть.
На детальной странице товара код добавления следующий.
<a href="javascript:void(0);" data-ids="<?=$actualItem["ID"]?>" data-count="<?=COUNT_ADD_BASKET?>" data-url="<?=SITE_TEMPLATE_PATH?>/ajax/addToCart.php" class="product_button ваш класс">В корзину</a>