Skip to content

Instantly share code, notes, and snippets.

@livevasiliy
Last active April 1, 2023 09:10
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save livevasiliy/56ba930a340b596ff248c359a77a148e to your computer and use it in GitHub Desktop.
Save livevasiliy/56ba930a340b596ff248c359a77a148e to your computer and use it in GitHub Desktop.
Ajax обработчик для оформление заказа на Bitrix D7.
<? 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