АРАМА: Покупай больше - плати меньше

Обновление корзины 1С-Битрикс методом Ajax

При включении опции Дублировать товар в корзине при изменении его количества в модуле АРАМА: Покупай больше - плати меньше появляются ряд особенностей.

Главное — это при добавлении количества одного и того же товара, данный товар дублируется в корзине, т.е. создается новая аналогичная позиция, количество же каждого в итоге равно единице. Например, если вы добавили 10 штук Товара 1, то в корзине появится 10 строчек этого же товара. У каждой этой позиции создается служебное свойство корзины с кодом PRODUCT.DOUBLE_VALUE со случайным значением.

Внимание! В статье приведены фрагменты кода, описывающие принцип реализации, а не полностью рабочий продукт. Для внедрения рекомендуется обратиться к разработчикам.

Большинство стандартных шаблонов корзины bitrix:sale.basket.basket, в том числе и шаблон корзины по умолчанию от 1С-Битрикс не учитывает автоматического добавления позиций в корзине, поэтому их нужно немного доработать. Для этого, после модификаций в корзине, его нужно обновить с помощью ajax.

Обновление с версии 2.0

<script type="text/javascript">
   BX.ready(function(){
      BX.addCustomEvent('OnBasketChange', function(){
         BX.Sale.BasketComponent.sendRequest('refreshAjax', {
            fullRecalculation: 'Y',
            otherParams: {
               param: 'N'
            }
         });
      });
   });
</script>

Приведенный код считывает изменения на странице корзины и обновляет ее повторно после выполнения всех расчетов.

Обновление до версии 2.0

В старом режиме работы модуля [до версии 2.0] код будет более ёмкий.

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Корзина");
CJSCore::Init(array("jquery", "ajax"));      //ПОДКЛЮЧАЕМ JS БИБЛИОТЕКИ. ЕСЛИ ОНИ УЖЕ ПОДКЛЮЧЕНЫ В ШАБЛОНЕ САЙТА, ТО НЕТ НЕОБХОДИМОСТИ В ПОВТОРНОМ ПОДКЛЮЧЕНИИ
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
?>
<!--ОПРЕДЕЛЯЕМ БЛОК КУДА БУДЕТ ВСТАВЛЯТЬСЯ КОД КОРЗИНЫ ПОСЛЕ AJAX ЗАПРОСА-->
<div id = "sc-cart">
   <?if ($request->get('SCODER_AJAX') == "Y"))
      $GLOBALS['APPLICATION']->RestartBuffer();
      $APPLICATION->IncludeComponent(
         "bitrix:sale.basket.basket", 
         "", 
         array(
            "COUNT_DISCOUNT_4_ALL_QUANTITY" => "N",
            "COLUMNS_LIST" => array(
               0 => "NAME",
               1 => "DISCOUNT",
               2 => "PRICE",
               3 => "QUANTITY",
               4 => "SUM",
               5 => "PROPS",
               6 => "DELETE",
               7 => "DELAY",
            ),
            "AJAX_MODE" => "N",
            "AJAX_OPTION_JUMP" => "N",
            "AJAX_OPTION_STYLE" => "Y",
            "AJAX_OPTION_HISTORY" => "N",
            "PATH_TO_ORDER" => "/personal/order/make/",
            "HIDE_COUPON" => "N",
            "QUANTITY_FLOAT" => "N",
            "PRICE_VAT_SHOW_VALUE" => "Y",
            "TEMPLATE_THEME" => "site",
            "SET_TITLE" => "Y",
            "AJAX_OPTION_ADDITIONAL" => "",
            "OFFERS_PROPS" => array(
               0 => "SIZES_SHOES",
               1 => "SIZES_CLOTHES",
               2 => "COLOR_REF",
            ),
         ),
         false
      );
   if ($request->get('SCODER_AJAX') == "Y"))
      die();
   ?>
</div>
<script type="text/javascript">
   BX.ready(function(){
         BX.addCustomEvent('onAjaxSuccess', function(e, params){
            if (params.url == "/bitrix/components/bitrix/sale.basket.basket/ajax.php")
            {
               // определяем текучий адрес страницы
               var url = window.location.href.split('?')[0];
               BX.ajax({
                  url: url,
                  method: 'POST',
                  data: {'SCODER_AJAX':'Y'},
                  onsuccess: function(data){
                     $("#sc-cart").html(data);
                  },
               });
            }
         });
   });
</script>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Обработчики событий на javascript

Триггеры, доступные в стандартных шаблонах компонента корзины bitrix:sale.basket.basket.

 Событие  Описание 
OnBasketChangeсобытие, используемое для отслеживания изменений в корзине (добавление, удаление, изменение количества товаров) на стороне клиента (фронтенд). 
OnCouponApply событие, вызываемое в случае успешного добавления купона.  
OnAjaxSuccessсобытие в 1С-Битрикс, которое автоматически срабатывает при успешном завершении асинхронного (ajax) запроса через библиотеку BX.ajax. 

Внимание! Если вы хотите миновать промежуточный шаг с корзиной, а сразу использовать форму заказа с управляемым составом корзины, то рекомендуем рассмотреть модуль Шаблон формы заказа с управляемой корзиной. В этом шаблоне не нужно выполнять вышеуказанных манипуляций, т.к. он учитывает добавление товаров с помощью обработчиков событий.