Какой-то героический эпос.
Я делаю так - Сначала создается пустой заказ
Код |
---|
if (!$ORDER_ID = CSaleOrder::Add(array(
"LID" => SITE_ID,
"PERSON_TYPE_ID" => 1,
"PAYED" => "N",
"CANCELED" => "N",
"STATUS_ID" => "N",
"PRICE" => 0,
"CURRENCY" => CSaleLang::GetLangCurrency(SITE_ID),
"USER_ID" => $user_id,
"PAY_SYSTEM_ID" => 1,
"PRICE_DELIVERY" => 0,
"DELIVERY_ID" => 1,
"DISCOUNT_VALUE" => 0,
"TAX_VALUE" => 0.0,
"USER_DESCRIPTION" => $post['INFO']
))) {
$return['msg'] = 'Ошибка создания заказа';
$fail = true;
}
|
Потом к нему привязываются товары
Код |
---|
if (!Add2BasketByProductID($PRODUCT['ID'], $quantity, array(
'ORDER_ID' => $ORDER_ID,
), $basket_props)) {
$return['msg'] = 'Ошибка добавления товара в заказ';
$fail = true;
}
|
Потом надо пересчитать параметры товара
Код |
---|
if (!$fail) {//обновляем параметры заказа на актуальные
$dbBasketItems = CSaleBasket::GetList(
array("NAME" => "ASC", "ID" => "ASC"), array(
"LID" => SITE_ID,
"ORDER_ID" => $ORDER_ID
), 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;
}
}
|
Ну и по желанию отправить письма
Код |
---|
if (!$fail && $post['EMAIL']) {//и отправляем письмо
$arFields = Array(
"ORDER_ID" => $ORDER_ID,
"ORDER_DATE" => Date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT", SITE_ID))),
"ORDER_USER" => $post['NAME'],
"PRICE" => SaleFormatCurrency($arOrderForDiscount['ORDER_PRICE'], "RUB"),
"EMAIL" => $post['EMAIL'],
"ORDER_LIST" => $strOrderList,
"SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "order@" . $_SERVER['SERVER_NAME']),
);
$eventName = "SALE_NEW_ORDER";
$bSend = true;
foreach (GetModuleEvents("sale", "OnOrderNewSendEmail", true) as $arEvent)
if (ExecuteModuleEventEx($arEvent, Array($ORDER_ID, &$eventName, &$arFields)) === false)
$bSend = false;
if ($bSend) {
$event = new CEvent;
$event->Send($eventName, SITE_ID, $arFields, "N");
}
} |