24.окт.2024

Заказ. Создаем заказ из веб-формы.

Перехватываем событие веб-формы

$eventManager->addEventHandler(
	'form',
	'onAfterResultAdd',
	'onAfterFormCreateOrder'
);

Сам обработчик

function onAfterFormCreateOrder($formId, $resId)
{
	if ($formId == 2) {
		Bitrix\Main\Loader::includeModule("sale");
		Bitrix\Main\Loader::IncludeModule("form");
		global $USER;

		$arQuestions = [];
		$arAnswer = [];
		$resultId = $resId;
		$email = '';
		$name = '';
		$phone = '';
		$aptekaNum = '';
		$pickupAddress = '';


		CFormResult::GetDataByID($resultId, [], $arQuestions, $arAnswer);
		\Bitrix\Main\Diag\Debug::writeToFile($arAnswer, '', 'rpoLog.txt');
		foreach ($arAnswer as $code => $answer) {
			switch ($code) {
				case 'EMAIL' :
				{
					$email = array_values(array_values($answer))[0]['USER_TEXT'];
					break;
				}
				case 'NAME' :
				{
					$name = array_values(array_values($answer))[0]['USER_TEXT'];
					break;
				}
				case 'PHONE' :
				{
					$phone = array_values(array_values($answer))[0]['USER_TEXT'];
					$phone = str_replace(['+', ' ', '(', ')', '-'], ['', '', '', '', ''], $phone);
					break;
				}
				case 'PICKUP' :
				{

					$aptekaNum = array_values(array_values($answer))[0]['ANSWER_VALUE'];
					$pickupAddress = array_values(array_values($answer))[0]['ANSWER_TEXT'];

					break;
				}
			}
		}
		// Допустим некоторые поля приходит в запросе
		$request = Context::getCurrent()->getRequest();

		$siteId = Context::getCurrent()->getSite();
		$currencyCode = CurrencyManager::getBaseCurrency();

		// Создаёт новый заказ
		$order = Order::create($siteId, $USER->isAuthorized() ? $USER->GetID() : 1);
		$order->setPersonTypeId(1);
		$order->setField('CURRENCY', $currencyCode);

		// Создаём одну отгрузку и устанавливаем способ доставки - "Без доставки" (он служебный)
		$shipmentCollection = $order->getShipmentCollection();
		$shipment = $shipmentCollection->createItem();
		$service = Delivery\Services\Manager::getById(
			Delivery\Services\EmptyDeliveryService::getEmptyDeliveryServiceId()
		);
		$shipment->setFields(array(
			'DELIVERY_ID' => $service['ID'],
			'DELIVERY_NAME' => $service['NAME'],
		));

		// Создаём оплату со способом #11 (онлайн оплата)
		$paymentCollection = $order->getPaymentCollection();
		$payment = $paymentCollection->createItem();
		$paySystemService = PaySystem\Manager::getObjectById(11);
		$payment->setFields(array(
			'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"),
			'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"),
		));

		// Устанавливаем свойства
		$propertyCollection = $order->getPropertyCollection();
		$phoneProp = $propertyCollection->getItemByOrderPropertyCode('PHONE');
		$phoneProp->setValue($phone);
		$nameProp = $propertyCollection->getPayerName();
		$resName = $nameProp->setValue($name);
		\Bitrix\Main\Diag\Debug::writeToFile($resName, '', 'rpoLog.txt');
		$emailProp = $propertyCollection->getUserEmail();
		$emailProp->setValue($email);
		$obPickupAddress = $propertyCollection->getItemByOrderPropertyCode('PICKUP_ADDRESS');
		$obPickupAddress->setValue($pickupAddress);
		$obAptekaNum = $propertyCollection->getItemByOrderPropertyCode('APTEKA_NUM');
		$obAptekaNum->setValue($aptekaNum);
		$obIsRpoOrder = $propertyCollection->getItemByOrderPropertyCode('IS_RPO_ORDER');
		$obIsRpoOrder->setValue('Y');
		$order->setField("STATUS_ID", "FR");

		// Сохраняем
		$order->doFinalAction(true);
		$order->save();
		$order->getId();
		// запишем в дополнительное поле 'user_ip' IP-адрес пользователя
	}
}
← Назад к списку новостей