Корзина в системе битрикс является одним из важных элементов работы интернет-магазина. Процесс оформления заказа как правило состоит из нескольких шагов. Сперва добавляются товары в корзину, после чего происходит процедура создания заказа. Товары на витрине, как и сама корзина, является самостоятельной логической частью интернет-магазина. При оформлении заказа записи в корзине привязываются к заказу. После создания заказа мы можем получить список товаров в корзине, связанных с заказом, и выполнять какие-либо манипуляции.
Ранее мы уже рассматривали пример создания копии заказа. В том примере, на основе ID заказа создавался новый, с переносом всех основных данных. Здесь мы рассмотрим другой пример, связанный с добавлением товаров в корзину, на основе существующего заказа.
Принцип работы будет прост для понимания, будут выбираться товары из существующего заказа, и добавляться в корзину текущего пользователя. Таким образом, после выполнения этой операции пользователь сможет увидеть все товары, в корзине которые были в другом заказе.
Страница с формой довольно простая. В заголовке подключена библиотека JQuery, а в теле документа находятся два ключевых элемента. Первый это сама кнопка button, по нажатию на которой будет происходить добавление товаров в корзину. Второй элемент – это блок div с классом response-msg, который будет выводить текстовые сообщения ответа сервера. Стоит обратить внимание на то, что ID заказа передаётся через атрибут кнопки data-order-id. В качестве ID вам следует подставлять номер существующего заказа.
<!DOCTYPE html> <html> <head> <title>Положить товары в корзину из заказа</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> </head> <body> <div class="text-center"> <div class="response-msg"></div><!--статус запроса--> <button class="btn btn-repeat" data-order-id="5">Добавить товары в корзину</button> </div> <script src="form.js"></script> </body> </html>
Скрипт для обработки нажатии кнопки подключён в конце страницы, называется form.js.
По нажатию на кнопке срабатывает событие on-click, в котором получается значение атрибута data-order-id с текущей кнопки. После этого параметр ORDER_ID отправляется на сервер посредством Ajax-запроса. В качестве ответа со стороны сервера должен прийти ответ с полем status (true/false), а также массив msg, в котором передаются сообщения на форму. Ответ со стороны скрипта на сервере приходит в формате Json.
$(".btn-repeat").on("click", function(){ var order_id = $(this).attr('data-order-id'), // ID исходного заказа btn = $(this); // объект кнопки $(".response-msg").html(''); // очищаем текст сообщений if (order_id > 0){ // отправка ajax-запроса $.ajax({ type: "POST", url: './ajax-basket-repeat.php', data: { 'ORDER_ID': order_id, }, dataType: "json", success: function(data){ // если статус успешный if (data.status == true){ btn.hide(); // скрываем кнопку } // показ текстовых сообщений if (data.msg && data.msg.length > 0){ $(".response-msg").fadeIn(); $.each( data.msg, function( key,field ) { if (field.type == true){ $(".response-msg").append('<p class="text-advance">'+field.text+'</p>'); } else { $(".response-msg").append('<p class="text-error">'+field.text+'</p>'); } }); } } }); } });
Сообщение передаётся со стороны сервера с указанием типа, true либо false. Это сделано для того, чтобы можно было задать соответствующие CSS-классы для сообщений.
Скрипт на стороне сервера выполняет проверку параметра ORDER_ID. После чего запрашивается соответствующий заказ и корзина связанная с ним. На основе существующего заказа получаются ID товаров, которые связаны с ним. После этого текущая корзина пользователя на сайте очищается, и добавляются товары по новой в соответствии со списком.
<?require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php"); global $USER; use Bitrix\Main, Bitrix\Sale\Basket, Bitrix\Sale, Bitrix\Sale\Order; CModule::IncludeModule("sale"); CModule::IncludeModule("catalog"); $arResult = array('status' => false); // проверяем параметр ORDER_ID if (isset($_REQUEST['ORDER_ID']) && $_REQUEST['ORDER_ID'] > 0){ // ID текущего заказа $ORDER_ID = intval($_REQUEST['ORDER_ID']); // получаем объект заказа по ID $order = Order::loadByAccountNumber( $ORDER_ID ); // корзина текущего заказа $basket = $order->getBasket(); $addProdIDS = array(); foreach ($basket as $key => $basketItem){ if (!in_array( $basketItem->getProductId(), $addProdIDS)){ $addProdIDS[] = $basketItem->getProductId(); } } if ($addProdIDS > 0){ // очищаем текущую корзину CSaleBasket::DeleteAll(CSaleBasket::GetBasketUserID()); // получаем объект корзины $basketNew = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite()); // добавляем товары $addCount=0; foreach ($addProdIDS as $prod_id){ $addCount++; if ($item = $basketNew->getExistsItem('catalog', $prod_id)) { $item->setField('QUANTITY', $item->getQuantity() + 1); echo $prod_id; } else { $item = $basketNew->createItem('catalog', $prod_id); $item->setFields( array( 'QUANTITY' => 1, 'CURRENCY' => 'RUB', 'LID' => SITE_ID, 'PRODUCT_PROVIDER_CLASS'=>'\CCatalogProductProvider', ) ); } } // сохраняем данные $basketNew->save(); } if ($addCount > 0){ $arResult['status'] = true; // в качестве результата показываем ссылку в корзину /personal/cart/ $arResult['msg'][] = array( 'type' => true, 'text' => '<a href="/personal/cart/" class="btn btn-repeat" role="button">Перейти в корзину</a>' ); } } else { $arResult['msg'][] = array('type' => false, 'text' => 'Не передан параметр ORDER_ID'); } echo json_encode($arResult); ?>
Все ключевые моменты в коде я постарался комментировать, чтобы у вас было лучше представление о логике работы скрипта. В случае необходимости вы спокойно сможете изменить логику работы под свои нужды. Так же, вы можете скачать исходники примера по этой ссылке. На этом у меня всё, надеюсь материал был вам полезен, всего доброго!