Итак, у нас есть несколько компонентов, которые выводят товарна странице и есть задача сделать так, чтобы при нажатии на кнопку "Купить" в корзину добавлялось необходимое количество товара, который клиент вводит на странице.
Данный функционал в компоненты Битрикса заложен, но не используется в шаблонах, поэтому у многих разработчиков с этим возникают трудности.[spoiler]
Если разобрать код шаблона компонента, например, eshop.catalog.top, то обнаружим следующий код:
<a href="<?=$arItem["ADD_URL"]?>" rel="nofollow" onclick="return addToCart(this, 'list', '<?=GetMessage("CATALOG_IN_CART")?>', 'noCart');" id="catalog_add2cart_link_<?=$arItem['ID']?>"> ...... </a> |
Задача сводится к прикручиванию количества товара к отправляемому запросу.
Для этих целей доабвим в шаблон поле ввода количества:
<input name="quantity_<?=$arItem['ID']?>" type="text" value="1" /> |
Далее вносим изменения в функцию "addToCart", которая располагается в файле script.js шаблона сайта.
В результате изменений функция принимает следующий вид:
function addToCart(element, mode, text, type) { if (!element && !element.href) return; var href = element.href; var button = $(element); button.unbind('click').removeAttr("href"); titleItem = button.parents(".R2D2").find(".item_title").attr('title'); imgItem = button.parents(".R2D2").find(".item_img").attr('src'); $('#addItemInCart .item_title').text(titleItem); $('#addItemInCart .item_img img').attr('src', imgItem); var ModalName = $('#addItemInCart'); CentriredModalWindow(ModalName); OpenModalWindow(ModalName); //определяем количество товара, введенное в поле input el_quantity_id = href.match(/id=([\d]+)/); quan = $('input[name=quantity_'+el_quantity_id[1]+']').attr('value'); if (href) $.post( href+"&ajax_buy=1&quantity="+quan, //изменяем метод отправки с get на post {quantity: quan}, //добавляем параметр quantity со значением количества товара $.proxy( function(data) { $("#cart_line").html(data); /*if (type == "cart") //picture cart in button this.html(text).removeClass("addtoCart").addClass("incart"); else if (type == "noButton") this.html(text); else this.html(text).removeClass("addtoCart").addClass("incart"); */ }, button) ); return false; } |
Для отправки запроса используется метод POST, а не GET, как по умолчанию написано в функции AddToCart, поскольку во всех компонентах проверка количества товара жестко берется из глобального массива $_POST.
Таким образом, для добавления количества товара не требуется кастомизировать сам компонент, а достаточно скорректировать функцию AddToCart.
Подводный камень:
Не рассматривал все компоненты, но, например, в компоненте eshop.catalog.top в настройках нет параметра USE_PRODUCT_QUANTITY, который внутри компонента проверяется. Если он не задан Y, то какие бы мы запросы не отправляли, в корзину будет добавляться 1 товар. Поэтому в коде вызова компонента необходимо добавить это свойство. Например:
<?$APPLICATION->IncludeComponent( "bitrix:eshop.catalog.top", ".default", Array( "DISPLAY_IMG_WIDTH" => "130", "DISPLAY_IMG_HEIGHT" => "130", "SHARPEN" => "30", "IBLOCK_TYPE_ID" => "catalog", "IBLOCK_ID" => "3", "ELEMENT_SORT_FIELD" => "sort", "ELEMENT_SORT_ORDER" => "asc", "ACTION_VARIABLE" => "action", "PRODUCT_ID_VARIABLE" => "id", "PRODUCT_QUANTITY_VARIABLE" => "quantity", "PRODUCT_PROPS_VARIABLE" => "prop", "SECTION_ID_VARIABLE" => "SECTION_ID", "DISPLAY_COMPARE" => "N", "ELEMENT_COUNT" => "4", "FLAG_PROPERTY_CODE" => "SPECIALOFFER", "OFFERS_LIMIT" => "5", "PRICE_CODE" => array("BASE"), "USE_PRICE_COUNT" => "Y", //------->>"USE_PRODUCT_QUANTITY" => "Y", //<<----Вот наш параметр "SHOW_PRICE_COUNT" => "1", "PRICE_VAT_INCLUDE" => "Y", "PRODUCT_PROPERTIES" => array(), "CACHE_TYPE" => "A", "CACHE_TIME" => "180", "CACHE_GROUPS" => "N" ) );?> |