Skip to content

Instantly share code, notes, and snippets.

@sukhikh18
Created November 29, 2019 11:31
Show Gist options
  • Save sukhikh18/3f812309c947ea8ddb0b4fedf6e16b82 to your computer and use it in GitHub Desktop.
Save sukhikh18/3f812309c947ea8ddb0b4fedf6e16b82 to your computer and use it in GitHub Desktop.
Заказ в один клик (не оптимизированно) #Bitrix #Raw
<?php
require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php");
// добавление заказа в один клик, только по имени и телефону
CModule::IncludeModule("sale");
CModule::IncludeModule("catalog");
if(!empty($_REQUEST['name']) && !empty($_REQUEST['phone']))
{
$name = $_REQUEST['name'];
$phone = $_REQUEST['phone'];
if(!empty($_REQUEST['oneProduct']) && $_REQUEST['oneProduct'] == 'Y' && !empty($_REQUEST['productId']))
{
// заказ в один клик только одного товара
// --- очистка корзины
CSaleBasket::DeleteAll(CSaleBasket::GetBasketUserID());
// --- создание пустого заказа
$orderId = makeOrder($name,$phone);
// --- добавление товара к заказу
addProdToOrder($item['PRODUCT_ID'],$orderId, $item['QUANTITY']);
// --- оформление заказа всей корзины (с одним товаром)
$orderId = makeOrder();
if($orderId)
echo json_encode(array('success'=>'ok', 'order_id'=>$orderId));
else
echo json_encode(array('error'=>'Y'));
}
elseif(!empty($_REQUEST['bascetOrder']))
{
// заказ в один клик всей корзины
// --- оформление заказа всей корзины (с одним товаром)
$orderId = makeOrder($name,$phone);
// --- достать товары текущей корзины
$basecetItems = getBasketProducts();
// --- добавить их в заказ
foreach ($basecetItems as $key => $item)
{
addProdToOrder($item['PRODUCT_ID'],$orderId, $item['QUANTITY']);
}
// --- обновляем параметры заказа цена/скидка
$strOrderList = '';
updateOrderParams($orderId,$strOrderList);
sendNotification($name,$phone, $strOrderList, $orderId);
if($orderId)
{
echo json_encode(array('success'=>'ok', 'order_id'=>$orderId));
// --- очистка корзины
CSaleBasket::DeleteAll(CSaleBasket::GetBasketUserID());
}
else
echo json_encode(array('error'=>'Y'));
}
else
{
echo json_encode(array('error'=>'Y'));
}
}
else
echo json_encode(array('error'=>'Не все поля заполнены'));
// FUNCTIONS
/**
* Создает пустой заказ
*/
function makeOrder($name,$phone)
{
global $USER;
$arFields = array(
"LID" => "s1",
"PERSON_TYPE_ID" => 1,
"PAYED" => "N",
"CANCELED" => "N",
"STATUS_ID" => "N",
"PRICE" => 0,
"CURRENCY" => "RUB",
"USER_ID" => 1,
"PAY_SYSTEM_ID" => 1,
"PRICE_DELIVERY" => 0,
"DELIVERY_ID" => 2,
"DISCOUNT_VALUE" => 0,
"TAX_VALUE" => 0,
"USER_DESCRIPTION" => "Заказ в Один клик"
);
// add Guest ID
if (CModule::IncludeModule("statistic"))
$arFields["STAT_GID"] = CStatistic::GetEventParam();
$ord = new CSaleOrder();
$ORDER_ID = $ord->Add($arFields);
if($ORDER_ID)
{
$arFields = array("ORDER_ID" => $ORDER_ID, "ORDER_PROPS_ID" => 1, "NAME" => "ФИО", "CODE" => "NAME", "VALUE" => $name );
CSaleOrderPropsValue::Add($arFields);
$arFields = array("ORDER_ID" => $ORDER_ID, "ORDER_PROPS_ID" => 3, "NAME" => "ФИО", "CODE" => "NAME", "VALUE" => $phone );
CSaleOrderPropsValue::Add($arFields);
return $ORDER_ID;
}
else
echo json_encode(array('error'=>$ord->LAST_ERROR));
}
function getBasketProducts()
{
$arID = array();
$arBasketItems = array();
$dbBasketItems = CSaleBasket::GetList(
array("NAME" => "ASC", "ID" => "ASC"),
array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"),
false,
false,
array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "PRODUCT_PROVIDER_CLASS")
);
while ($arItems = $dbBasketItems->Fetch())
{
if ('' != $arItems['PRODUCT_PROVIDER_CLASS'] || '' != $arItems["CALLBACK_FUNC"])
{
CSaleBasket::UpdatePrice(
$arItems["ID"],
$arItems["CALLBACK_FUNC"],
$arItems["MODULE"],
$arItems["PRODUCT_ID"],
$arItems["QUANTITY"],
"N",
$arItems["PRODUCT_PROVIDER_CLASS"]
);
$arID[] = $arItems["ID"];
}
}
if(!empty($arID))
{
$dbBasketItems = CSaleBasket::GetList(
array("NAME" => "ASC", "ID" => "ASC"),
array("ID" => $arID, "ORDER_ID" => "NULL"),
false,
false,
array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "PRODUCT_PROVIDER_CLASS", "NAME")
);
while ($arItems = $dbBasketItems->Fetch())
{
$arBasketItems[] = $arItems;
}
}
return $arBasketItems;
}
function addProdToOrder($productID,$orderID, $quantity=1,$weight='не задан')
{
$basket_props = array( array("NAME" => "Вес", "CODE" => "MASSA", "VALUE" => $weight));
if (!Add2BasketByProductID($productID, $quantity, array('ORDER_ID' => $orderID, ), $basket_props))
{
$return['msg'] = 'Ошибка добавления товара в заказ';
$fail = true;
}
}
function updateOrderParams($orderId, &$strOrderList)
{
$dbBasketItems = CSaleBasket::GetList(
array("NAME" => "ASC", "ID" => "ASC"),
array("LID" => SITE_ID, "ORDER_ID" => $orderId),
false, false,
array("ID", "NAME", "QUANTITY", "CURRENCY", "CAN_BUY", "PRICE", "WEIGHT", "DISCOUNT_PRICE")
);
$summ = $weight = 0;
$strOrderList = "";
$arBasket = array();
while ($arBasketItems = $dbBasketItems->GetNext())
{
$strOrderList .= $arBasketItems["NAME"] . " - " . $arBasketItems["QUANTITY"] . " шт на " . SaleFormatCurrency($arBasketItems["PRICE"] * $arBasketItems["QUANTITY"], $arBasketItems["CURRENCY"]);
$strOrderList .= "\n";
$summ += roundEx($arBasketItems["PRICE"], SALE_VALUE_PRECISION) * DoubleVal($arBasketItems["QUANTITY"]);
$weight += doubleval($arBasketItems['WEIGHT']);
$arBasket[] = $arBasketItems;
}
$arOrderForDiscount = array(
'SITE_ID' => SITE_ID,
'USER_ID' => $user_id,
'ORDER_PRICE' => $summ,
'ORDER_WEIGHT' => $weight,
'BASKET_ITEMS' => $arBasket,
);
$arDiscountOptions = array();
$arDiscountErrors = array();
CSaleDiscount::DoProcessOrder($arOrderForDiscount, $arDiscountOptions, $arDiscountErrors);
$arOrderForDiscount['PRICE_BEFORE'] = $summ;
$arOrderForDiscount['PRICE'] = $arOrderForDiscount['ORDER_PRICE'];
$arOrderForDiscount['WEIGHT'] = $arOrderForDiscount['ORDER_WEIGHT'];
if (!CSaleOrder::Update($ORDER_ID, $arOrderForDiscount))
{
$return['msg'] = 'Ошибка расчета цены заказа.';
$fail = true;
}
}
function sendNotification($name,$phone, $orderList, $ordrId)
{
$arEventFields = Array(
"AUTHOR_NAME" => $name,
"AUTHOR_PHONE" => $phone,
"ELEMENTS" => $orderList,
"ORDERID" => $ordrId,
"SUMM" => ''
);
CEvent::SendImmediate("NEW_ONE_CLICK_ORDER", "s1", $arEventFields);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment