Пример оформления заказа на D7

Пример оформления заказа на D7

1520
04.10.2017

Иногда возникает ситуация, когда для оформления заказа по каким-то причинам нельзя воспользоваться системным компонентом оформления заказа, приходится производить оформление напрямую, через api.

Для оформления заказа через API сотрудниками техподдержки был предложен код, позволяющий оформить заказ.

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
	global $USER;
	use Bitrix\Main,
		Bitrix\Main\Loader,
		Bitrix\Main\Config\Option,
		Bitrix\Sale,
		Bitrix\Sale\Order,
		Bitrix\Main\Application,
		Bitrix\Sale\DiscountCouponsManager;

	if (!Loader::IncludeModule('sale')) die();
	$request = Application::getInstance()->getContext()->getRequest();
    global $USER, $APPLICATION;

    $siteId = \Bitrix\Main\Context::getCurrent()->getSite();
	$registeredUserID = $USER->GetID(); // или тут присваиваем идентификатор анонимного пользователя

	$order = Order::create($siteId, $registeredUserID);
    $order->setPersonTypeId(1); // ИД типа пользователя

	$basket = Sale\Basket::loadItemsForFUser(\CSaleBasket::GetBasketUserID(),
		Bitrix\Main\Context::getCurrent()->getSite())->getOrderableItems();

    $order->setBasket($basket);

	$shipmentCollection = $order->getShipmentCollection();
	$shipment = $shipmentCollection->createItem();

	$shipment->setFields(array(
       'DELIVERY_ID' => 1,
       'DELIVERY_NAME' => 'Самовывоз',
       'CURRENCY' => $order->getCurrency()
    ));
	$shipmentItemCollection = $shipment->getShipmentItemCollection();

	foreach ($order->getBasket() as $item)
    {
        $shipmentItem = $shipmentItemCollection->createItem($item);
        $shipmentItem->setQuantity($item->getQuantity());
    }

	$paymentCollection = $order->getPaymentCollection();
    $extPayment = $paymentCollection->createItem();
    $extPayment->setFields(array(
        'PAY_SYSTEM_ID' => 2,
        'PAY_SYSTEM_NAME' => 'Наличные',
        'SUM' => $order->getPrice()
    ));

	$order->doFinalAction(true);
	$propertyCollection = $order->getPropertyCollection();

		foreach ($propertyCollection->getGroups() as $group)
		{
			foreach ($propertyCollection->getGroupProperties($group['ID']) as $property)
			{
                $p = $property->getProperty();
                if( $p["CODE"] == "CONTACT_PERSON")
                    $property->setValue("VASYA");
			}
		}

    $order->setField('CURRENCY', $currencyCode);
    $order->setField('COMMENTS', 'Заказ оформлен через АПИ. ' . $comment);
    $r = $order->save();
    $orderId = $order->GetId();
	if(!$r->isSuccess()){
		if ($ex = $APPLICATION->GetException())
			echo $aaaa = $ex->GetString();

		// либо объекты ошибок с доп данными
		print_r($r->getErrors());
		// либо только сообщения
		print_r($r->getErrorMessages());

		// так же в заказе могут быть предупреждения, которые не являются причиной остановки процесса сохранения заказа, но мы их сохраняем в маркировки
		print_r($r->getWarnings());
		print_r($r->getWarningMessages());
		echo "Ошибка оформления";
	} else {
		echo "Ваш заказ " . $orderId . " оформлен";
	}

Вот такой код помог мне решить проблему с оформлением заказа на одном сайте с очень древним кодом - у них весь механизм оформления написан на старом API. Перевести их механизм оформления на работу компонента оказалось дольше, чем переписать само оформление на чистом API.

В общем, как всегда, низкий поклон техподдержке:)



Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

Еще никто не комментировал данную публикацию. Будьте первыми!

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

captcha

Возврат к списку