+7 495 008 8452 пн.-пт. 10:00 – 17:00
Загрузка...
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Хотите облегчить жизнь постоянным покупателям? Дайте им возможность делать заказ и оплату в интернет-магазине в один шаг и без регистрации. Вот как это сделать:

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);



Готово!

Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...