Bitrix D7 создание заказа

Код не новый. Плюс его в том, что он не привязан к контексту компонента sale.basket или sale.order. Запрос аяксом можно делать с любого шаблона.


/* ///////////////////////////////////////////////////// поля пользователя */
global $user_errors;

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

use Bitrix\Main\Application;
use Bitrix\Sale;

$request = Application::getInstance()->getContext()->getRequest();

if(!CUser::IsAuthorized()){


	if (empty($request->getPost("phone"))) {
		$user_errors['phone'] = 'Телефон обязателен!';
	}
	if (empty($request->getPost("email"))) {
		echo ($request->getPost("email"));
		$user_errors['email'] = 'Email обязателен!';
	}
	$user_ID = null;
}else{
	$user_ID = $USER->GetID();
}
$address = '';
if(empty($user_errors)){

	// ///////////////////////////////////////////////////// поиск польз-ля 
	if(!isset($user_ID)){
		$arFilter = Array(	"EMAIL" => trim($request->getPost("email")).""	);
		$res = Bitrix\Main\UserTable::getList(Array(
		   "select"=>Array("ID","NAME"),
		   "filter"=>$arFilter,
		));
		while ($arRes = $res->fetch()) {
		   global $user_ID;
		   $user_ID = $arRes['ID'];
		}
	}

	// ///////////////////////////////////////////////////// создаю нового пользователя
	$new_password = randString(7);
	if(!isset($user_ID)){
		$user = new CUser;
		$arFields = Array(
		  "NAME"              => (!empty($request->getPost("name"))) ? $request->getPost("name") : '',
		  "LAST_NAME"         => "",
		  "EMAIL"             => $request->getPost("email"), // обязатель 
		  "LOGIN"             => $request->getPost("email"), // обязатель
		  "LID"               => "ru",
		  "PERSONAL_PHONE"    => $request->getPost("phone"),
		  "ACTIVE"            => "Y",
		  "GROUP_ID"          => array(2), // группа Все пользователи
		  "PASSWORD"          => $new_password, // обязатель
		  "CONFIRM_PASSWORD"  => $new_password, // обязатель
		  // "PERSONAL_PHOTO"    => $arIMAGE
		);
				
		$user_ID = $user->Add($arFields);
		if (intval($user_ID) > 0){
		    // echo "Пользователь успешно добавлен.";
		    // die();
		}
		else{
		    $user_errors['new_user'] = $user->LAST_ERROR;
		}

	}
	$USER->Authorize($user_ID); // авторизуем
}

// Корзина
$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite());

// //////////////////////////////////////// создаю заказ
	
if(!empty($basket->getQuantityList()) && isset($user_ID)){
	
	foreach ($basket as $product)
	    {
	    	$product_fields = [
	    		'PRODUCT_ID' => $product->getProductId(),
	    		'NAME' => $product->getField('NAME'), 
	    		'PRICE' => $product->getPrice(), 
	    		'CURRENCY' => $product->getField('CURRENCY'), 
	    		'QUANTITY' => $product->getQuantity() ,
	    		'PRODUCT_XML_ID' => $product->getField('PRODUCT_XML_ID') ,
	    		'CATALOG_XML_ID' => $product->getField('CATALOG_XML_ID')
	    	];
	        $item = $basket->createItem("catalog", $product->getProductId());
	        // unset($product[$product->getProductId()]);
	        $item->setFields($product_fields);
	    }
	// //////////////////////////////////////////////////
	$order = Bitrix\Sale\Order::create(SITE_ID, $user_ID);
	$order->setPersonTypeId(1); // Физич/Юридич. лицо
	$order->setBasket($basket);
	// ////////////////////////////////////////////////// Доставка
	$shipmentCollection = $order->getShipmentCollection();
	$deliv_id = $request->getPost('DELIVERY_ID');
	$shipment = $shipmentCollection->createItem(
	        Bitrix\Sale\Delivery\Services\Manager::getObjectById($deliv_id)  // Курьером до подъезда
	    );
	// //////////////////////////////////////////////////
	$shipmentItemCollection = $shipment->getShipmentItemCollection();

	foreach ($basket as $basketItem)
	    {
	        $item = $shipmentItemCollection->createItem($basketItem);
	        $item->setQuantity($basketItem->getQuantity());
	    }
	// ////////////////////////////////////////////////// Оплата
	$paymentCollection = $order->getPaymentCollection();
	$pay_id = $request->getPost('PAY_SYSTEM_ID');
	$payment = $paymentCollection->createItem(
	        Bitrix\Sale\PaySystem\Manager::getObjectById($pay_id) // ННаличными при получении
	    );
	// //////////////////////////////////////////////////
	$payment->setField("SUM", $order->getPrice());
	$payment->setField("CURRENCY", $order->getCurrency());
	// $order->setField("LOCATION" , 129);
	
	// ///////////////////////////////// user props
	// Устанавливаем свойства
	$propertyCollection = $order->getPropertyCollection();
	// телефон
        $phoneProp = $propertyCollection->getPhone();
	$phoneProp->setValue($request->getPost("phone"));
	// имя
        $nameProp = $propertyCollection->getPayerName();
	$nameProp->setValue(!empty($request->getPost("name")) ? $request->getPost("name") : '');
        // email
	$emailProp = $propertyCollection->getUserEmail();
	$emailProp->setValue($request->getPost("email"));
        // местоположение (поле типа Местоположение)
	$location = $propertyCollection->getItemByOrderPropertyId(7);
        $location->setValue($request->getPost("ORDER_PROP_7"));

	$result = $order->save();
    if (!$result->isSuccess()){
        // print_r($result->getErrors());
        echo json_encode(['error' => $result->getErrors()]);
    }else{  	
		echo json_encode(['success' =>  "/basket?ORDER_ID=".$order->getField('ACCOUNT_NUMBER')]);    	
    }
}elseif(!empty($basket->getQuantityList())){
	echo json_encode(['error' => 'пустая корзина']);
}elseif(isset($user_ID)){
	echo json_encode(['error' => 'не создался пользователь'])	;
}



2 Comments

  1. $basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite());

    Уже содержит список товаров, если пройтись по массиву foreach ($basket as $product) и добавить $item, то в заказ уйдут дубликаты товаров второй раз

  2. тогда надо раскоментировать
    // unset($product[$product->getProductId()]);

Leave a comment

Your email address will not be published.


*