Хотите облегчить жизнь постоянным покупателям? Дайте им возможность делать заказ и оплату в интернет-магазине в один шаг и без регистрации. Вот как это сделать:
1. Настройте компонент sale.order.ajax
Измените настройку проверки E-mail на уникальность на "выключено". Теперь заказ будет создаваться без проверки электронной почты.
2. Встраиваем проверку уникальности
После создания заказа вставьте код проверки уникальности, чтобы в базе не накапливались дубли почтовых адресов
AddEventHandler('main', 'OnBeforeUserRegister', array('CMainhandlers', 'OnBeforeUserRegisterHandler'));
class CMainhandlers
{
public static function OnBeforeUserRegisterHandler(&$arFields)
{
if (CUser::GetList($by='id', $order='desc', array('=EMAIL' => $arFields['EMAIL']))->Fetch())
{
$GLOBALS['APPLICATION']->throwException('Пользователь с таким E-Mail уже зарегистрирован.');
return false;
}
}
}
3. Привязываем созданный заказ к пользователю в базе
Если пользователь уже есть в базе данных, то заказ надо привязать к электронной почте. Для этого добавим в компонент код:
AddEventHandler('sale', 'OnSaleComponentOrderOneStepComplete', array('CSalehandlers', 'OnSaleComponentOrderOneStepCompleteHandler'));
class CSalehandlers
{
public static function OnSaleComponentOrderOneStepCompleteHandler($ID, $arFields)
{
if ($arFields['ID'] > 0)
{
if ($arFields['USER_ID'] > 0)
{
$arExtUser = CUser::GetByID($arFields['USER_ID'])->Fetch();//1
if ($arOldUser = CUser::GetList($by='id', $order='desc', array('=EMAIL' => $arExtUser['EMAIL'], '!ID' => $arExtUser['ID']))->Fetch())//2
{
CSaleOrder::Update($arFields['ID'], array('USER_ID' => $arOldUser['ID']));//3
CUser::Delete($arExtUser['ID']);//4
$GLOBALS['USER']->Logout();//5
if (!isset($_SESSION['CAN_VIEW_ORDERS']))//1
$_SESSION['CAN_VIEW_ORDERS'] = array();
$_SESSION['CAN_VIEW_ORDERS'][] = $arFields['ID'];
global $arResult, $arParams;//2
$arResult = array(
'ORDER_ID' => $arFields['ID'],
'ORDER' => $arFields,
'PAY_SYSTEM' => self::GetPaySystem($arFields),
);
$arParams = array(
'PATH_TO_PERSONAL' => '/personal/orders/',
'PATH_TO_PAYMENT' => '/personal/orders/guest_payment.php',
);
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/.default/components/bitrix/sale.order.ajax/in/confirm.php';//3
exit();//7
}
}
}
}
}
4. Организуем оплату: новый метод обработки
Для работы с массивом ПС добавьте к обработчикам CSaleHandlers новый метод:
private static function GetPaySystem($arOrder)
{
if (IntVal($arOrder['PAY_SYSTEM_ID']) > 0)
{
$dbPaySysAction = CSalePaySystemAction::GetList(
array(),
array(
'PAY_SYSTEM_ID' => $arOrder['PAY_SYSTEM_ID'],
'PERSON_TYPE_ID' => $arOrder['PERSON_TYPE_ID']
),
false,
false,
array('NAME', 'ACTION_FILE', 'NEW_WINDOW', 'PARAMS', 'ENCODING')
);
if ($arPaySysAction = $dbPaySysAction->Fetch())
{
$arPaySysAction['NAME'] = htmlspecialcharsEx($arPaySysAction['NAME']);
if (strlen($arPaySysAction['ACTION_FILE']) > 0)
{
if ($arPaySysAction['NEW_WINDOW'] != 'Y')
{
CSalePaySystemAction::InitParamArrays($arOrder, $ID, $arPaySysAction['PARAMS']);
$pathToAction = $_SERVER['DOCUMENT_ROOT'].$arPaySysAction['ACTION_FILE'];
$pathToAction = str_replace('\\', '/', $pathToAction);
while (substr($pathToAction, strlen($pathToAction) - 1, 1) == '/')
$pathToAction = substr($pathToAction, 0, strlen($pathToAction) - 1);
if (file_exists($pathToAction))
{
if (is_dir($pathToAction) && file_exists($pathToAction.'/payment.php'))
$pathToAction .= '/payment.php';
$arPaySysAction['PATH_TO_ACTION'] = $pathToAction;
}
if(strlen($arPaySysAction['ENCODING']) > 0)
{
define('BX_SALE_ENCODING', $arPaySysAction['ENCODING']);
AddEventHandler('main', 'OnEndBufferContent', 'ChangeEncoding');
function ChangeEncoding($content)
{
header('Content-Type: text/html; charset='.BX_SALE_ENCODING);
$content = $GLOBALS['APPLICATION']->ConvertCharset($content, SITE_CHARSET, BX_SALE_ENCODING);
$content = str_replace('charset='.SITE_CHARSET, 'charset='.BX_SALE_ENCODING, $content);
}
}
}
}
return $arPaySysAction;
}
}
}
5. Подключите lang-файлы
В скрипте confirm.php после строки B_PROLOG_INCLUDED добавьте код:
$langPath = str_replace('\\', '/', __FILE__);
$langPath = substr($langPath, 0, strlen($langPath)-strlen('/confirm.php'));
__IncludeLang($langPath.'/lang/'.LANGUAGE_ID.'/template.php');
6. Измените подключение платежной системы
В компоненте sale.order.payment замените вызов CSaleOrder::GetList на код
$arFilter = array("LID" => SITE_ID, "ID" => $ORDER_ID);
if (!is_array($_SESSION['CAN_VIEW_ORDERS']) || !in_array($ORDER_ID, $_SESSION['CAN_VIEW_ORDERS']))
$arFilter["USER_ID"] = IntVal($GLOBALS["USER"]->GetID());
$dbOrder = CSaleOrder::GetList(array("DATE_UPDATE" => "DESC"), $arFilter);
Готово!
Назад в раздел