Created
December 8, 2015 12:44
-
-
Save d1i1m1o1n/39e42f9408cee32962fd to your computer and use it in GitHub Desktop.
Заказ в один клик Bitrix
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