Для добавления поддержки новой CRM-системы необходимо создать класс провайдера.
Создайте файл в директории files/netcat/modules/crm_integration/classes/provider/:
<?php
class nc_crm_integration_provider_mycrm extends nc_crm_integration_provider {
/** @var array Настройки по умолчанию */
protected $settings = [
'api_key' => null,
'domain' => null,
];
/**
* Получение имени провайдера для отображения
*/
public function get_name() {
return 'My CRM';
}
/**
* Описание полей настроек для формы в админке
*/
public function get_settings_list() {
return [
'api_key' => [
'label' => 'API ключ',
'type' => 'password',
'required' => true,
'hint' => 'Ключ из настроек CRM',
],
'domain' => [
'label' => 'Домен',
'type' => 'text',
'required' => true,
'hint' => 'Например: company.mycrm.ru',
],
];
}
/**
* Список полей CRM для маппинга
*/
public function get_available_fields() {
return [
'name' => 'Имя',
'phone' => 'Телефон',
'email' => 'E-mail',
];
}
/**
* Отправка лида в CRM
*
* @param nc_crm_integration_lead $lead
* @return array ['success' => bool, 'external_id' => string|null, 'error' => string|null]
*/
public function send_lead(nc_crm_integration_lead $lead) {
$this->reset_errors();
if (!$this->validate_settings()) {
return [
'success' => false,
'external_id' => null,
'error' => implode('; ', $this->get_errors()),
];
}
// Подготовка данных
$data = [
'name' => $lead->get_title(),
'phone' => $lead->get('Phone'),
'email' => $lead->get('Email'),
];
// Применение маппинга
$mapped_data = $this->get_mapped_data($lead);
$data = array_merge($data, $mapped_data);
// Отправка запроса
$response = $this->http_request(
'https://' . $this->get_setting('domain') . '/api/leads',
'POST',
$data,
['Authorization: Bearer ' . $this->get_setting('api_key')]
);
if ($response['success'] && isset($response['response']['id'])) {
return [
'success' => true,
'external_id' => (string)$response['response']['id'],
'error' => null,
];
}
return [
'success' => false,
'external_id' => null,
'error' => $response['error'] ?? 'Unknown error',
];
}
/**
* Валидация настроек
*/
public function validate_settings() {
if (empty($this->get_setting('api_key'))) {
$this->add_error('API ключ обязателен');
return false;
}
if (empty($this->get_setting('domain'))) {
$this->add_error('Домен обязателен');
return false;
}
return true;
}
/**
* Проверка подключения
*/
public function test_connection() {
$this->reset_errors();
if (!$this->validate_settings()) {
return false;
}
$response = $this->http_request(
'https://' . $this->get_setting('domain') . '/api/ping',
'GET',
[],
['Authorization: Bearer ' . $this->get_setting('api_key')]
);
if ($response['success']) {
return true;
}
$this->add_error($response['error'] ?? 'Connection failed');
return false;
}
}
После создания класса добавьте запись в таблицу CrmIntegration_Provider:
INSERT INTO `CrmIntegration_Provider`
(`Provider_Name`, `Provider_Class`, `Priority`, `Enabled`)
VALUES
('My CRM', 'nc_crm_integration_provider_mycrm', 100, 1);
| Метод | Описание |
|---|---|
get_name() |
Возвращает название провайдера для отображения |
get_settings_list() |
Описание полей настроек для формы |
get_available_fields() |
Список полей CRM для маппинга |
send_lead($lead) |
Отправка лида в CRM (обязательный) |
validate_settings() |
Проверка корректности настроек |
test_connection() |
Проверка подключения к CRM |
http_request($url, $method, $data, $headers) |
Выполнение HTTP-запроса |
get_mapped_data($lead) |
Получение данных с учётом маппинга |
transform_value($value, $transform) |
Преобразование значения поля |