Корзина в системе битрикс является одним из важных элементов работы интернет-магазина. Процесс оформления заказа как правило состоит из нескольких шагов. Сперва добавляются товары в корзину, после чего происходит процедура создания заказа. Товары на витрине, как и сама корзина, является самостоятельной логической частью интернет-магазина. При оформлении заказа записи в корзине привязываются к заказу. После создания заказа мы можем получить список товаров в корзине, связанных с заказом, и выполнять какие-либо манипуляции.
Ранее мы уже рассматривали пример создания копии заказа. В том примере, на основе 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);
?>
Все ключевые моменты в коде я постарался комментировать, чтобы у вас было лучше представление о логике работы скрипта. В случае необходимости вы спокойно сможете изменить логику работы под свои нужды. Так же, вы можете скачать исходники примера по этой ссылке. На этом у меня всё, надеюсь материал был вам полезен, всего доброго!