UPD: в скрипте используются старые методы работы с заказом, для тех у кого Битрикс новых редакций рекомендую в работе с заказами использовать D7!
Пост не удаляю, чтобы вновь открыв его, ужаснуться какие раньше велосипеды изобретал :)
Данной темы косвенно касался уже несколько раз, напишу более простой и обновленный вариант оформления заказа с помощью API методов Битрикса. Если кому-то понадобится буду рад=)
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");
$APPLICATION->SetTitle("Перенос заказов");
@set_time_limit(0);
if(!CModule::IncludeModule("sale") && !CModule::IncludeModule("catalog"))
die();
if(
!empty($_POST["FIO"])&&
!empty($_POST["EMAIL"])&&
!empty($_POST["PHONE"])
)
{
// Шаг 0. Lexa.pro: параметры
$arIBLOCKS = array(10, 11); // инфоблоки с товарами
// в моем случае одинаковое для двух инфоблоков
$typePrice = 1; // Тип цены
$PERSON_TYPE_ID = 1;
$PAY_SYSTEM_ID = 1;
$DELIVERY_ID = 2;
// Шаг 1. Lexa.pro: найти/создать пользователя
global $USER;
$emailUser = CUser::GetList($by="", $order="", array('=EMAIL' => $_POST["EMAIL"]));
while($arUser = $emailUser->Fetch())
$USER_ID = $arUser["ID"];
if(empty($USER_ID)){ // Если не нашлось email-а в БД, созданим нового юзвера
$NEW_LOGIN = $_POST["EMAIL"];
$NEW_EMAIL = $_POST["EMAIL"];
$NEW_NAME = "";
$NEW_LAST_NAME = "";
if(strlen($_POST["FIO"]) > 0)
{
$arNames = explode(" ", $_POST["FIO"]);
$NEW_NAME = $arNames[1];
$NEW_LAST_NAME = $arNames[0];
}
$pos = strpos($NEW_LOGIN, "@");
if ($pos !== false)
$NEW_LOGIN = substr($NEW_LOGIN, 0, $pos);
if (strlen($NEW_LOGIN) > 47)
$NEW_LOGIN = substr($NEW_LOGIN, 0, 47);
if (strlen($NEW_LOGIN) < 3)
$NEW_LOGIN .= "___";
$dbUserLogin = CUser::GetByLogin($NEW_LOGIN);
if ($arUserLogin = $dbUserLogin->Fetch())
{
$newLoginTmp = $NEW_LOGIN;
$uind = 0;
do
{
$uind++;
if ($uind == 10)
{
$NEW_LOGIN = $arUserResult["USER_EMAIL"];
$newLoginTmp = $NEW_LOGIN;
}
elseif ($uind > 10)
{
$NEW_LOGIN = "buyer".time().GetRandomCode(2);
$newLoginTmp = $NEW_LOGIN;
break;
}
else
{
$newLoginTmp = $NEW_LOGIN.$uind;
}
$dbUserLogin = CUser::GetByLogin($newLoginTmp);
}
while ($arUserLogin = $dbUserLogin->Fetch());
$NEW_LOGIN = $newLoginTmp;
}
$GROUP_ID = array(2);
$def_group = COption::GetOptionString("main", "new_user_registration_def_group", "");
if($def_group!="")
{
$GROUP_ID = explode(",", $def_group);
$arPolicy = $USER->GetGroupPolicy($GROUP_ID);
}
else
{
$arPolicy = $USER->GetGroupPolicy(array());
}
$password_min_length = intval($arPolicy["PASSWORD_LENGTH"]);
if($password_min_length <= 0)
$password_min_length = 6;
$password_chars = array(
"abcdefghijklnmopqrstuvwxyz",
"ABCDEFGHIJKLNMOPQRSTUVWXYZ",
"0123456789",
);
if($arPolicy["PASSWORD_PUNCTUATION"] === "Y")
$password_chars[] = ",.<>/?;:'\"[]{}\|`~!@#\$%^&*()-_+=";
$NEW_PASSWORD = $NEW_PASSWORD_CONFIRM = randString($password_min_length+2, $password_chars);
$user = new CUser;
$arAuthResult = $user->Add(Array(
"LOGIN" => $NEW_LOGIN,
"NAME" => $NEW_NAME,
"LAST_NAME" => $NEW_LAST_NAME,
"PASSWORD" => $NEW_PASSWORD,
"CONFIRM_PASSWORD" => $NEW_PASSWORD_CONFIRM,
"EMAIL" => $NEW_EMAIL,
"GROUP_ID" => $GROUP_ID,
"ACTIVE" => "Y",
"LID" => SITE_ID,
)
);
if (IntVal($arAuthResult) <= 0)
{
$arResult["ERROR"][] = GetMessage("STOF_ERROR_REG").((strlen($user->LAST_ERROR) > 0) ? ": ".$user->LAST_ERROR : "" );
}
else
{
$USER->Authorize($arAuthResult);
}
} else {
$USER->Authorize($USER_ID); // авторизуем, если новый
}
// Шаг 2. Lexa.pro: оформляем заказ
// в моем случае не важно какие тип платильщика, способы доставки и оплаты были указаны
// 2.1 Получаем корзину
$basket = array(); // корзина
$summ = 0;
$dbBasketItems = CSaleBasket::GetList(
array(),
array("FUSER_ID" => CSaleBasket::GetBasketUserID(),"LID" => SITE_ID, "ORDER_ID" => "NULL"),
false,
false,
array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "PRODUCT_PROVIDER_CLASS", "PRICE")
);
while ($arItems = $dbBasketItems->GetNext())
{
$basket[] = $arItems;
$summ += $basket["QUANTITY"]*$basket["PRICE"];
}
// 2.2Добавляем заказ
$arOrderDat = CSaleOrder::DoCalculateOrder(
SITE_ID,
$USER->GetID(),
$basket,
$PERSON_TYPE_ID, // тип плательщика
array(),
$DELIVERY_ID, // доставка
$PAY_SYSTEM_ID, // оплата
array(),
$arErrors,
$arWarnings
);
$arFields = array(
"LID" => SITE_ID,
"PERSON_TYPE_ID" => $PERSON_TYPE_ID,
"PAYED" => "N",
"CANCELED" => "N",
"STATUS_ID" => "N",
"PRICE" => $summ,
"CURRENCY" => "RUB",
"USER_ID" => (int)$USER->GetID(),
"PAY_SYSTEM_ID" => $PAY_SYSTEM_ID,
//"PRICE_DELIVERY" => $arResult["DELIVERY_PRICE"],
"DELIVERY_ID" => $DELIVERY_ID,
//"DISCOUNT_VALUE" => $arResult["DISCOUNT_PRICE"],
//"TAX_VALUE" => $arResult["bUsingVat"] == "Y" ? $arResult["VAT_SUM"] : $arResult["TAX_PRICE"],
"USER_DESCRIPTION" => $_POST["SITE"],
"ORDER_PROP" => array(
3 => $_POST["PHONE"],
1 => $_POST["FIO"],
7 => $_POST["ADDRESS"],
2=> $_POST["EMAIL"],
),
);
//не получилось прикрепить корзину к заказу
$orderID = (int)CSaleOrder::DoSaveOrder($arOrderDat, $arFields, 0, $arErrors);
CSaleBasket::OrderBasket($orderID, $_SESSION["SALE_USER_ID"], SITE_ID); // привязывает товары из корзины к заказу.
}