Быстрый заказ товара

14 января 2019, 07:00

Создание быстрого заказа товар

Почти в каждом интернет-магазине сейчас есть кнопка заказа в один клик. Для клиента все устроено по одному принципу. Большинство необходимых полей заполняется автоматически, клиенту лишь нужно указать свои контактные данные.

Что касается программной реализации, мне приходилось встречать два варианта.

  1. Простая классическая форма заявки - отправялет письмо менеджеру. Дальше все вручную. Здесь вообще не обязательно иметь интернет-магазин.
  2. Форма заявки работающая с API miniShop2, и создающая нормальный заказ с предустановленными данными.

Создаем заказ через API miniShop2

На самом деле в данном случае никаких особых настроек RetailCRM не требуется, так как все будет работать через плагин, который идет в компоненте. Я лишь покажу как из простой формы создать заказ.

Итак размещаем где угодно на странице простейшую форму. К примеру вот такую

{'!ajaxForm' | snippet : [
    'form' => '@INLINE
        <form>
        <div class="form-group">
            <label>Имя</label>
            <input class="form-control" type="text" name="name" value="Коля" placehoder="Имя">
        </div>
        <div class="form-group">
            <label>Телефон</label>
            <input class="form-control" type="text" name="phone" value="98779788987" placehoder="Телефон">
        </div>
        <div class="form-group">
            <label>Email</label>
            <input class="form-control" type="text" name="email" value="biz87@mail.ru" placehoder="Email">
        </div>
        <input type="hidden" name="productId" value="137">    

            <button type="submit" class="btn btn-primary">Купить</button>
        </form>
    ',
    'hooks' => 'msQuickOrder'
]}

Форма как форма, ничего особенного. Лишь контактные данные и id товара, который нужно оформить. Его можно подставить вручную, можно взять id страницы - если это страница товара. Форма запускается через ajaxForm, который в свою очередь запускает formIt - тоже классическая связка компонентов.

Далее создаем сниппет msQuickOrder, подключаем его как хук - который собственно и будет отвечать за оформление заказа. Содерджимое примерно вот такое. Я все прокомментировал. Ну а плагин который сработает при оформлении заказа уже подхватит данные и передаст их в RetailCRM

<?php
//Получаем данные из формы
$phone = $hook->getValue('phone');
$email = $hook->getValue('email');
$name = $hook->getValue('name');
$productId = $hook->getValue('productId');

//Готовим минишоп к запуску
$scriptProperties = array(
    'json_response' => true, // возвращать ответы в JSON
    'max_count' => 1 // максимальное число товаров для добавления за один раз
);

$miniShop2 = $modx->getService('miniShop2');
// Инициализируем класс в текущий контекст
$miniShop2->initialize($modx->context->key, $scriptProperties);
$miniShop2->cart->clean(); //Очищаем корзину
$miniShop2->cart->add($productId); //Добавляем в корзину товар
$miniShop2->order->add('receiver',$name); // Указываем имя получателя
$miniShop2->order->add('phone',$phone);
$miniShop2->order->add('email',$email);
$miniShop2->order->add('payment', 1); //Указываем способ оплаты
$miniShop2->order->add('delivery', 1); //Указываем способ доставки
$miniShop2->order->submit(); //Отправляем заказ

Создаем заказ вручную через хук

Исходные данные те же. Форма не меняется. Но заказ не будет добавляться в miniShop - сразу отправяем в RetailCRM. Этот способ годится - если miniShop2 вообще не используется. Создаем сниппет quickOrderToRetailCRM, указываем его, как хук-обработчик для формы

<?php
//Получаем данные из формы
$phone = $hook->getValue('phone');
$email = $hook->getValue('email');
$name = $hook->getValue('name');
$productId = $hook->getValue('productId');
//По хорошему не мешало бы проверить данные на пустоту и обезопасить, хотя бы простенькой санитизацией

//Инициируем modRetailCRM
if (!$modx->getService('modretailcrm','modRetailCrm', MODX_CORE_PATH.'components/modretailcrm/model/modretailcrm/')) {
    $modx->log(1, '[ModRetailCrm] - Not found class RetailCrm');
    return;
}

$pdo = $modx->getService('pdoFetch');

$site = $modx->getOption('modretailcrm_siteCode');
$apiKey = $modx->getOption('modretailcrm_apiKey');
$crmUrl = $modx->getOption('modretailcrm_url');

if(!empty($site)  && !empty($apiKey) && !empty($crmUrl)){
    $modRetailCrm = new modRetailCrm($modx, $apiKey, $crmUrl, $site);
}else{
    return;
}

$orderData = array();
$orderData['externalId'] = md5(time() . $productId . $email . $phone); //Генерируем уникальный хэш-номер заказа

//Информация о клиенте
$orderData['customer']['externalId'] = md5($phone . $email);  //Генерируем уникальный хэш-номер клиента
//Проверяю наличие пользователя в базе retailCRM
$user_response = $modRetailCrm->request->customersGet($orderData['customer']['externalId'], 'externalId', $site);

if(!$user_response->isSuccessful()){
    $customer_profile = $pdo->getArray('modUserProfile', array('internalKey' => $order['user_id']));
    $customer = array();
    $customer['externalId'] =  $orderData['customer']['externalId'];
    $customer['firstName'] = $name;
    $customer['email'] = $email;
    $customer['phones'][0]['number'] = $phone;
    $response = $modRetailCrm->request->customersCreate($customer, $site);
    if(!$response->isSuccessful()){
        $modx->log(MODX_LOG_LEVEL_ERROR, '[ModRetailCrm] - Создаем клиента в базе RetailCRM '.print_r($response, 1));
    }
}

$orderData['firstName'] = $name;
$orderData['phone'] = $phone;
$orderData['email'] = $email;

//Предположим, что id товара - это страница сайта
$page = $modx->getObject('modResource', array('id' => $productId));
//Информация о товаре
$orderData['items'][0]['initialPrice'] = 1000; //Стоимость товара
$orderData['items'][0]['productName'] = $page->pagetitle; //Наименование товара
$orderData['items'][0]['quantity'] = 1; //Количество товара

$response = $modRetailCrm->request->ordersCreate($orderData, $site);
if(!$response->isSuccessful()){
    $modx->log(MODX_LOG_LEVEL_ERROR, '[ModRetailCrm] - Результат отправки заказа '.print_r($response, 1));
}


Предыдущий документ
Создать новый контакт
Следующий документ
Поиск заказа в RetailCRM