Делаем ajax добавление в корзину на битрикс

Делаем 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>
Summary