О web-разработке
и даже немного больше...

Создание копии корзины из заказа на Bitrix D7

Корзина в системе битрикс является одним из важных элементов работы интернет-магазина. Процесс оформления заказа как правило состоит из нескольких шагов. Сперва добавляются товары в корзину, после чего происходит процедура создания заказа. Товары на витрине, как и сама корзина, является самостоятельной логической частью интернет-магазина. При оформлении заказа записи в корзине привязываются к заказу. После создания заказа мы можем получить список товаров в корзине, связанных с заказом, и выполнять какие-либо манипуляции.

Ранее мы уже рассматривали пример создания копии заказа. В том примере, на основе 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.

JS скрипт для отправки Ajax запроса

По нажатию на кнопке срабатывает событие 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-классы для сообщений.

PHP скрипт-обработчик на стороне сервера

Скрипт на стороне сервера выполняет проверку параметра 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);
?>

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

Опубликован: 21.06.2020 г.

См. также:

«Не удалось установить соединение с сервером. Проверьте …».
Получение Email-адреса покупателя в заказе (Bitrix D7)
Работа с URL-адресами в Bitrix D7
Работа с купонами в Bitrix API
Добавляем пункт меню для списков в админке Битрикс
Диалоговые окна в Bitrix API
Создание инфоблока при установке модуля
Создание копии заказа в Bitrix D7

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта