Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Множественное добавление товаров в корзину

00 голосов
1
Здравствуйте!

Редакция мылый бизнес, как можно реализовать в детальной карточки товара множественное добавление в корзину, т.е не по одному торговому предложению, а допустим указал у каждого торгового предложение колличество жмешь на кнопку добавить и добавляются все те размеры у которых указывал колличество?

Или хотябы как называется такой функцонал? мб на маркет плэйсе кто натыкался на такое?
спросил 15 Апр, 16 от loony (540 баллов)

1 Ответ

00 голосов

Добрый день.

Это совсем не сложно, так что в маркетплейсе решения не будет.

Суть примерно такая - в карточке вам надо что-то типа списка чекбоксов с ID товаров для добавления в корзину - 
<input type='checkbox' name='product[]' value='1'>

А на странице, обрабатывающий SUBMIT кнопки покупки, пройти по $_REQUEST['product'] и сделать Add2BasketByProductID.

int Add2BasketByProductID( $PRODUCT_ID, $QUANTITY = 1, $arRewriteFields = array(), $arProductParams = false);

Функция добавляет в корзину товар с кодом PRODUCT_ID в количестве QUANTITY единиц (по умолчанию одну штуку) и возвращает код позиции товара в корзине. Функция является оберткой надCSaleBasket::Add, но при этом размещена в модуле Торгового каталога.

ответил 16 Апр, 16 от root (25,590 баллов)
Я правильно вас понял?

            <form action="<?=$arResult["DETAIL_PAGE_URL"]?>" method="post">
                <!-- поля (цена, имя товара, свойства) -->
             
                <!-- ИД торгового предложения -->
                <input type="checkbox" name="id" value="152" id="product-id">
                <input type="checkbox" name="id" value="155" id="product-id">
             
                <input type="hidden" name="action" value="BUY">
                <input type="submit" value="КУПИТЬ" name="actionADD2BASKET">
            </form>

Но у меня добавляет, если я выберу все чекбоксы, только первый. Или я что то не так делаю?
<form action="<?=$_REQUEST['id']?>" method="post">
                <input type='checkbox' name="id" value='152'>
                                <input type='checkbox' name="id" value='153'>
                                 <input type='checkbox' name="id" value='154'>
                <input class="k-pole" type="text" name="quantity" value="1" id="quantity">
                <a class="bt-k" href="javascript:void(0)" onclick="BX('quantity').value++;">+</a>
                <a class="bt-k" href="javascript:void(0)" onclick="if (BX('quantity').value > 1) BX('quantity').value--;">-</a>
                <input type="hidden" name="action" value="BUY">
                <input type="submit" value="КУПИТЬ" name="Add2BasketByProductID">
            </form>


Маленько изменил под себя, по прежнему добавляется только первое ТП, можно как то тут поправить?
Ну а как вы в корзину добавляете?
Как-то так?
foreach($_REQUEST['id']  as $PRODUCT_ID){
Add2BasketByProductID( (int)$PRODUCT_ID, (int)$_REQUEST['quantity']);
}
Я не очень понимаю что нужно сделать с кнопкой submit, можете подсказать?
Этот код нужно перед формой разместить?
или у формы в action="" прописать файл в котором будет данный код?
Нет, submit и вся остальная форма остаётся как есть. Приведённый для примера код -
foreach($_REQUEST['id']  as $PRODUCT_ID){
Add2BasketByProductID( (int)$PRODUCT_ID, (int)$_REQUEST['quantity']);
}
должен быть где-то на странице, обрабатывающий POST (по SUBMIT). Это может быть и код в компоненте, и в частях шаблона компонента (component_epilog.php, result_modifier.php)
Вот в таком виде передается:
id=152&quantity=5&id=153&id=154&action=BUY&Add2BasketByProductID=%D0%9A%D0%A3%D0%9F%D0%98%D0%A2%D0%AC

Но передается опять только первый элемент.
Попробовал изменить name="id[152]" name="id[153]" в таком случает вообще ниче не падает в корзину, я что то не так делаю?
Да. Одинаковые id=152&id=154 приводят к тому, что в $_GET остаётся только последний id=154. А если будет id[]=152&id[]=154 - в $_GET['id'] будет массив из 152 и 154.
все верно в массиве $_GET вот такие данные:
Array
(
    [id] => Array
        (
            [0] => 152
            [1] => 153
            [2] => 154
        )

    [action] => BUY
    [Add2BasketByProductID] => КУПИТЬ
)

вот фрагмент кода который я разместил на странице:
        <form action="<?=$_REQUEST['id']?>" method="">
                <input type='checkbox' name="id[]" value='152'>
                <input type='checkbox' name="id[]" value='153'>
                <input type='checkbox' name="id[]" value='154'>
             
                <input type="hidden" name="action" value="BUY">
                <input type="submit" value="КУПИТЬ" name="Add2BasketByProductID">
        </form>
        <?foreach($_REQUEST['id']  as $PRODUCT_ID){
        Add2BasketByProductID( (int)$PRODUCT_ID, (int)$_REQUEST['quantity']);}?>


Все равно не падают товары в корзину, мб из за того что в ключе  [Add2BasketByProductID]  не то значение?
Тут вот такой момент - по идее вы вызов Add2BasketByProductID должны из шаблона компонента убрать. template.php может просто не выполняться, если компонент кеширует вывод. По идее Add2BasketByProductID логично расположить в component_epilog.php, который 100% не кешируется.
И submit делать через POST (защитит от двойных добавлений товара в корзину при обновлении страницы), и при успешной обработке добавления в корзину делать LocalRedirect($APPLICATION->GetCurPage());
у меня почему то в корзину падают все торговые предложения, хотя я количество ввел только у одного, это можно как то исправить?

Похожие вопросы

0 голосов
7 ответов
спросил 05 Июль, 13 от dQ (180 баллов)
0 голосов
0 ответов
0 голосов
2 ответов
0 голосов
3 ответов
0 голосов
1 ответ
спросил 14 Июль, 13 от vlastelin (120 баллов)