Created
November 29, 2019 11:31
-
-
Save sukhikh18/3f812309c947ea8ddb0b4fedf6e16b82 to your computer and use it in GitHub Desktop.
Заказ в один клик (не оптимизированно) #Bitrix #Raw
This file contains hidden or 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
<?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