Создать новый контакт

05 мая 2019, 07:00

Создаем новый контакт из заявки на сайте

Как следует из заголовка, это может быть полезно, когда клиент тем или иным способом оставляет на сайте свой контакт. Здесь возможны два варината.

  1. Клиент заполнил контактную форму и нужно передать контакт в RetailCRM
  2. Клиент тем или иным способом зарегистрировался на сайте. Передаем профиль пользователя в CRM

Контакт получаем из контактной формы

В этом случае на сайте почти наверняка установлен компонент FormIT, для которого я напишу хук, получающий данные клиента и отправляющий их дальше в RetailCRM

Создаю сниппет contactToRetailCRM примерно следующего содержимого:

<?php
//Вызов и первоначальная настройка компонента
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;
}

//Принимаю необходимый массив полей из формы
$contact = array();
$name = trim(filter_var($hook->getValue('firstName'), FILTER_SANITIZE_STRING));
$contact['firstName'] = $name;
$contact['phones'][0]['number'] = trim(filter_var($hook->getValue('phone'), FILTER_SANITIZE_STRING));
$contact['email'] = trim(filter_var($hook->getValue('email'), FILTER_VALIDATE_EMAIL));
//Генерируем externalId клиента
$contact['externalId'] = md5($contact['phones'][0]['number'] . $contact['email']);
//Отправляю данные в RetailCRM

$response = $modRetailCrm->request->customersCreate($contact, $site);
if($response->isSuccessful()){
    return true;
}else{
    $modx->log(1, '[modRetailCRM] contactToRetailCRM '.print_r($response, 1));
    return false;
}

Важный нюанс, который обязательно следует знать и понимать. При создании нового клиента через API - RetailCRM требует наличение параметра ExternalID (идентификатор клиента на сайте). Подразумевается, что такой клиент обязательно у меня зарегистрирован перед отправкой данных. Так как в данном случае я клиента в базе никак не регистрирую, и приходится генерировать ExternalId на лету. Это можно сделать разными способами, первое что пришло в голову это создать md5 хэш клиента и подставить его в нужный параметр

$contact['externalId'] = md5($contact['phones'][0]['number'] . $contact['email']);

Ну и пример вызова формы (я использую ajaxForm, который по умолчанию работает с FormIT)

{'!ajaxForm' | snippet : [
   'form' => '@INLINE
        <form>
            <div class="form-group">
                <label>Имя</label>
                <input class="form-control" type="text" name="firstName" value="" placehoder="Имя">
            </div>
            <div class="form-group">
                <label>Телефон</label>
                <input class="form-control" type="text" name="phone" value="" placehoder="Телефон">
            </div>
            <div class="form-group">
                <label>Email</label>
                <input class="form-control" type="text" name="email" value="" placehoder="Email">
            </div>
            <button type="submit" class="btn btn-primary">Оставить заявку</button>
        </form>
   ',
   'hooks' => 'contactToRetailCRM'
]}

Контакт получен при регистрации пользователя

На самом деле этот случай предусмотрен в плагине, который идет из коробки. Я просто продублирую здесь решение. Значит чтобы отправить контактные данные в RetailCRM в момент создания пользователя на сайте (оформление заказа, регистрация и подобные события) - нужно запустить плагин, срабатывающий на событие onUserSave в режиме MODE_NEW

switch ($modx->event->name) {
    case 'OnUserSave':
        if ($mode == modSystemEvent::MODE_NEW) {
            if ($modx->context->key != 'mgr' ) {
                if ($profile = $modx->getObject('modUserProfile', $user->get('id'))) {
                    $customer = array();
                    $customer['externalId'] =  $user->get('id');
                    $customer['firstName'] = $profile->fullname;
                    $customer['email'] = $profile->email;
                    if(!empty($profile->phone)){
                        $customer['phones'][]['number'] = $profile->phone;
                    }

                    $response = $modRetailCrm->request->customersCreate($customer, $site);
                    if(!$response->isSuccessful()){
                        $modx->log(1, '[modRetailCRM] OnUserSave '.print_r($response, 1));
                    }
                }

            }
        }
        break;
}


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