Last active
April 1, 2023 09:10
-
-
Save livevasiliy/56ba930a340b596ff248c359a77a148e to your computer and use it in GitHub Desktop.
Ajax обработчик для оформление заказа на Bitrix D7.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'); | |
use Bitrix\Main\Application; | |
use Bitrix\Main\Loader; | |
use Bitrix\Main\LoaderException; | |
use Bitrix\Sale\Order; | |
use Bitrix\Sale\Delivery; | |
use Bitrix\Sale\PaySystem; | |
use Bitrix\Sale\Basket; | |
use Bitrix\Currency\CurrencyManager; | |
use Bitrix\Main\Context; | |
global $USER; | |
Loader::includeModule('main'); | |
Loader::includeModule('sale'); | |
Loader::includeModule('catalog'); | |
// Получаем данные. | |
$requestPayload = json_decode(file_get_contents('php://input'), true); | |
// Поля с формы. | |
$credentials = $requestPayload['credentials']; | |
// Элементы корзины. | |
$basketItems = $requestPayload['items']; | |
$siteId = 's1'; | |
$userId = null; | |
if ($USER->isAuthorized()) | |
{ | |
$userId = $USER->GetID(); | |
} else { | |
$email = null; | |
foreach($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[email]') | |
{ | |
$email = $credential['value']; | |
break; | |
} | |
} | |
$name = null; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[name]') | |
{ | |
$name = $credential['value']; | |
break; | |
} | |
} | |
$login = stristr($email, '@', true); | |
$password = randString(10); // randString встроенная helper функция Битрикс. | |
$filter = array( | |
'NAME' => $name, | |
'LAST_NAME' => '', | |
'EMAIL' => $email, | |
'LOGIN' => $login, | |
'LID' => 's1', | |
'ACTIVE' => 'Y', | |
'GROUP_ID' => array(2,3,4), | |
); | |
$fillerBy = $by = "email"; | |
$orderBy = $order = "desc"; | |
$rsUsers = CUser::GetList($fillerBy, $orderBy, $filter); | |
if ($rsUsers->is_filtered) | |
{ | |
while ($existUser = $rsUsers->Fetch()) | |
{ | |
$userId = $existUser['ID']; | |
} | |
} | |
else | |
{ | |
$newUser = new CUser; | |
$arFieldsUser = array( | |
'NAME' => $name, | |
'LAST_NAME' => '', | |
'EMAIL' => $email, | |
'LOGIN' => $login, | |
'LID' => 's1', | |
'ACTIVE' => 'Y', | |
'GROUP_ID' => array(2, 3, 4), | |
'PASSWORD' => $password, | |
'CONFIRM_PASSWORD' => $password | |
); | |
$userId = $newUser->Add($arFieldsUser); | |
// Отправляем письмо новому пользователю с данными для дальнейших авторизаций. | |
CEvent::SendImmediate( | |
'NEW_AUTO_REGISTERED_USER', | |
's1', | |
array( | |
'NAME' => $name, | |
'LOGIN' => $login, | |
'PASSWORD' => $password, | |
'EMAIL' => $email | |
), | |
'Y', | |
'49' | |
); | |
} | |
if ((int)($userId) > 0) | |
{ | |
$USER->Authorize($userId); | |
$userId = $USER->GetID(); | |
} | |
}; | |
$products = []; | |
foreach ($basketItems as $key => $basketItem) | |
{ | |
$products[$key]['PRODUCT_ID'] = $basketItem['PRODUCT_ID']; | |
$products[$key]['PRODUCT_PROVIDER_CLASS'] = $basketItem['PRODUCT_PROVIDER_CLASS']; | |
$products[$key]['NAME'] = $basketItem['NAME']; | |
$products[$key]['PRICE'] = $basketItem['PRICE']; | |
$products[$key]['CURRENCY'] = 'RUB'; | |
$products[$key]['QUANTITY'] = $basketItem['QUANTITY']; | |
} | |
// Устанавливаем корзину. | |
$basket = Basket::create($siteId); | |
foreach ($products as $product) | |
{ | |
$item = $basket->createItem('catalog', $product['PRODUCT_ID']); | |
$item->setFields($product); | |
} | |
// Создаём заказ. | |
$order = Order::create($siteId, $userId); | |
$order->setPersonTypeId(1); | |
$order->setBasket($basket); | |
/** | |
* @var Bitrix\Sale\PropertyValueCollection $propertyCollection | |
*/ | |
$propertyCollection = $order->getPropertyCollection(); | |
// Устанавлием значения полей заказа. | |
foreach ($propertyCollection as $propertyItem) | |
{ | |
if ($propertyItem->getField('CODE') == 'name') | |
{ | |
$value = '-'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[name]') | |
{ | |
$value = $credential['value']; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field name'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'phone') | |
{ | |
$value = '-'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[phone]') | |
{ | |
$value = $credential['value']; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field phone'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'email') | |
{ | |
$value = '-'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[email]') | |
{ | |
$value = $credential['value']; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field email'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'selected_region') | |
{ | |
$value = '-'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[selected_region]') | |
{ | |
$value = $credential['value']; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field selected_region'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'check_recipient') | |
{ | |
$value = 'N'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] == 'order[check_recipient]') | |
{ | |
$value = 'Y'; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field check_recipient'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'address') | |
{ | |
$value = '-'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] == 'order[address]') | |
{ | |
$value = $credential['value']; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field address'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'name_recipient') | |
{ | |
$value = '-'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[name_recipient]') | |
{ | |
$value = $credential['value']; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field name_recipient'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'phone_recipient') | |
{ | |
$value = '-'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[phone_recipient]') | |
{ | |
$value = $credential['value']; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field phone_recipient'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'delivery_time') | |
{ | |
$value = '-'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[delivery_time]') | |
{ | |
$value = $credential['value']; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field email'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'delivery_date') | |
{ | |
$value = '-'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] == 'order[delivery_date]') | |
{ | |
$value = $credential['value']; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field address'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'delivery_anonymous') | |
{ | |
$value = 'N'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[delivery_anonymous]') | |
{ | |
$value = 'Y'; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field delivery_anonymous'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'no_call_recipient') | |
{ | |
$value = 'N'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[no_call_recipient]') | |
{ | |
$value = 'Y'; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field no_call_recipient'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'notify_me') | |
{ | |
$value = 'N'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[notify_me]') | |
{ | |
$value = 'Y'; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field notify_me'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'add_card') | |
{ | |
$value = 'N'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[add_card]') | |
{ | |
$value = 'Y'; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field add_card'); | |
} | |
continue; | |
} | |
if ($propertyItem->getField('CODE') == 'card_text') | |
{ | |
$value = '-'; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[card_text]') | |
{ | |
$value = $credential['value']; | |
break; | |
} | |
} | |
$result = $propertyItem->setField('VALUE', $value); | |
if (!$result->isSuccess()) | |
{ | |
die('Error in set value for order field card_text'); | |
} | |
continue; | |
} | |
} | |
// Доставка | |
$deliveryServiceId = null; | |
$deliveryPrice = null; | |
// Платежная система | |
$payServiceId = null; | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[delivery]' && !empty($credential['value'])) | |
{ | |
$deliveryServiceId = $credential['value']; | |
break; | |
} | |
} | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[selected_region_price]' && !empty($credential['value'])) | |
{ | |
$deliveryPrice = $credential['value']; | |
break; | |
} | |
} | |
foreach ($credentials as $credential) | |
{ | |
if ($credential['name'] === 'order[pay]' && !empty($credential['value'])) | |
{ | |
$payServiceId = $credential['value']; | |
break; | |
} | |
} | |
// Создаём одну отгрузку и устанавливаем выбранный способ доставки. | |
$shipmentCollection = $order->getShipmentCollection(); | |
$deliveryService = Delivery\Services\Manager::getById($deliveryServiceId); | |
$shipment = $shipmentCollection->createItem( | |
Delivery\Services\Manager::getObjectById($deliveryServiceId) | |
); | |
$shipment->setFields( | |
array( | |
'DELIVERY_ID' => $deliveryService['ID'], | |
'DELIVERY_NAME' => $deliveryService['NAME'], | |
'ALLOW_DELIVERY' => 'Y', | |
'PRICE_DELIVERY' => $deliveryPrice, | |
'CUSTOM_PRICE_DELIVERY' => 'Y' | |
) | |
); | |
$shipmentItemCollection = $shipment->getShipmentItemCollection(); | |
$totalBasketPrice = 0; | |
foreach ($basket as $basketItem) | |
{ | |
$item = $shipmentItemCollection->createItem($basketItem); | |
$item->setQuantity($basketItem->getQuantity()); | |
$totalBasketPrice += $basketItem->getFinalPrice(); | |
} | |
// Устанавливаем оплату. | |
$paySystemService = PaySystem\Manager::getObjectById($payServiceId); | |
$paymentCollection = $order->getPaymentCollection(); | |
$payment = $paymentCollection->createItem($paySystemService); | |
$totalOrderPrice = $deliveryPrice + $totalBasketPrice; | |
$payment->setField("SUM", $totalOrderPrice); | |
$payment->setField('CURRENCY', $order->getCurrency()); | |
$order->setField('PRICE', $totalOrderPrice); | |
// Сохраняем | |
$order->doFinalAction(true); | |
$result = $order->save(); | |
// Очищаем корзину пользователя. | |
$res = CSaleBasket::GetList(array(), array( | |
'FUSER_ID' => CSaleBasket::GetBasketUserID(), | |
'LID' => 's1', | |
'ORDER_ID' => 'null', | |
'DELAY' => 'N', | |
'CAN_BUY' => 'Y')); | |
while ($row = $res->fetch()) { | |
CSaleBasket::Delete($row['ID']); | |
} | |
// Возвращаем JSON со ссылкой нового заказа. | |
echo json_encode( | |
array( | |
'order_url' => 'order/?ORDER_ID=' . $order->getId(), | |
'success' => 200 | |
) | |
); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment