<?
use Bitrix\Main\Diag\Debug;
/**
* Класс предназначен для подготовки данных и отправки их в Б24 (создание лидов и проч.)
*/
class SendDataToB24
{
/**
* @var $fieldsMap - массив, описывающий связывание полей для различных источников на сайте с полями Битрикс24
*/
protected static $fieldsMap = array(
'form' => array(
'form-1' => array(
'name' => 'NAME',
'tell' => 'PHONE_WORK',
),
'form-2' => array(
'name' => 'NAME',
'tell' => 'PHONE_WORK',
'message' => 'COMMENTS',
),
'form-3' => array(
'name' => 'NAME',
'phone' => 'PHONE_WORK',
'message' => 'COMMENTS',
),
'form-4' => array(
'name' => 'NAME',
'phone' => 'PHONE_WORK',
),
'form-5' => array(
'name' => 'NAME',
'tell' => 'PHONE_WORK',
'titles' => 'UF_CRM_1530099864860',
'links' => 'UF_CRM_1530099961043',
'summ' => 'UF_CRM_1530102501986',
),
),
'ticket' => array()
);
/**
* @var $additionalValues - постоянные значения доп. полей, которые нужно передавать
*/
protected static $additionalValues = array(
'form' => array(
'form-1' => array(
'TITLE' => "Обратный звонок",
'SOURCE_ID' => '1',
'ASSIGNED_BY_ID' => '14',
'STATUS_ID' => 'NEW',
'OPENED' => 'Y'
),
'form-2' => array(
'TITLE' => "Не нашли нужную информацию?",
'SOURCE_ID' => '4',
'ASSIGNED_BY_ID' => '14',
'STATUS_ID' => 'NEW',
'OPENED' => 'Y'
),
'form-3' => array(
'TITLE' => "Напишите нам",
'SOURCE_ID' => '3',
'ASSIGNED_BY_ID' => '14',
'STATUS_ID' => 'NEW',
'OPENED' => 'Y'
),
'form-4' => array(
'TITLE' => "Сложности с выбором? Мы поможем!",
'SOURCE_ID' => '2',
'ASSIGNED_BY_ID' => '14',
'STATUS_ID' => 'NEW',
'OPENED' => 'Y'
),
'form-5' => array(
'TITLE' => "Быстрый заказ",
'SOURCE_ID' => '5',
'ASSIGNED_BY_ID' => '14',
'STATUS_ID' => 'NEW',
'OPENED' => 'Y'
),
)
);
/**
* @var $connection - данные подключения для отправки данных
*/
protected static $connection = array(
'leads' => array(
//'url' => 'https://crm.rf01.ru/crm/configs/import/lead.php',
'url' => 'https://crm.rf01.ru/rest/#dser_id#/#rest_key#/crm.lead.add.json',
//'auth' => array(
// 'login' => '*****',
// 'password' => '*****'
//)
),
'test' => array(
'url' => '',
)
);
protected $data, $portalId;
function __construct($portalId, $data)
{
$this->portalId = $portalId;
$this->data = $data;
}
public function send()
{
$portal = self::$connection[$this->portalId];
$o = new \Bitrix\Main\Web\HttpClient();
//$this->data['LOGIN'] = $portal['auth']['login'];
//$this->data['PASSWORD'] = $portal['auth']['password'];
//AddMessage2Log($this->data, '$this->data - SendDataToB24');
//smv($this->data);
// обертвываем $this->data для отправки запроса с rest api
$this->data = http_build_query(
array(
'fields' => $this->data
)
);
$response = $o->post($portal['url'], $this->data);
/**
* Вообще подразумевается, что ответ должен быть в формате json, однако после осмотра компонента bitrix:crm.lead.rest
* стало понятно, что некорректный json формат (на первый взгляд) - не что иное, как js-объект, напечатанный на страницу (бред, конечно).
* Поэтому расшифровывать его придется функцией, обратной той, которой строка была сформирована.
* Но теплится надежда, что когда-нибудь там будет отдаваться json, поэтому сначала пробуем расшифровать его.
*/
try
{
$result = \Bitrix\Main\Web\Json::decode($response);
}
catch (Exception $e)
{
$result = \CUtil::JsObjectToPhp($response);
}
AddMessage2Log($result, 'SendDataToB24');
/** Еще один прикол от разработчиков: в ответе ожидаются ключи code и error_message, однако вместо код приходит error */
return $result;
}
/**
* Метод возвращает массив, подготовленный для отправки в Б24
*
* @param string $type - тип данных form|ticket, используется для обработки массива $data
* @param array $map - массив полей соответствия
* @param array $data - массив полей со значениями
* @param array $additional - массив доп. значений
* @return array
*/
public function getResultArray($type, $map, $data, $additional)
{
$fields = array();
/** Формируем массив значений для передачи используя массив соответствия */
foreach($map as $sourceField => $destField)
{
$fields[$destField] = self::getFieldValue($sourceField, $data, $type);
}
/** Добавляем к массиву доп. поля */
if(is_array($additional))
$fields = self::extendData($fields, $additional);
//smv($fields);
//die();
return $fields;
}
/**
* Метод в зависимости от типа данных $type получает значение поля $sourceField из массива $data
*
* @param string $sourceField - ключ поля, значение которого нужно получить
* @param array $data - массив данных
* @param string $type - тип массива данных, например form (если это результат веб-формы) или ticket (если это массив тикета)
* @return mixed
*/
public function getFieldValue($sourceField, $data, $type = 'form')
{
$value = '';
switch ($type)
{
case 'form':
$value = $data[$sourceField];
break;
}
return $value;
}
public function extendData($data, $additional)
{
return array_merge($data, $additional);
}
/**
* Обработчик события модуля веб-формы после успешного добавления результата
*
* @param int $formId - идентификатор веб-формы
* @param int $resultId - идентификатор результата
* @return
*/
public static function onAfterResultAdd($formId, $result)
{
try
{
if (!array_key_exists($formId, self::$fieldsMap['form']))
return;
$fields = self::getResultArray('form', self::$fieldsMap['form'][$formId], $result, self::$additionalValues['form'][$formId]);
/** Отправляем сформированный массив в Б24 */
$o = new self('leads', $fields);
$res = $o->send();
//smv($res);
}
catch (Exception $e) { }
}
}