8 (800) 302-62-68
+7 (499) 348-29-58
sale@rbs-crm.ru

Документация разработчика

Разработка плагинов

Плагином является модуль расширения функциональность Системы. Доступные пользователю плагины размещены в меню «Настройки» — «Интеграции» — «Загруженные».

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

Для добавления своего плагина в Маркет-плейс или в облачную версию Системы необходимо связаться с технической поддержкой по электронной почте: support@rbs-crm.ru.

В коробочной поставке разработчик самостоятельно добавляет плагин в систему (папка projects/xrm/plugins/).

Плагины бывают нескольких типов:

Класс PluginBase

PluginBase — класс, от которого должны наследоваться все «index.php» в плагинах. Все классы, унаследованные от него, имеют возможность вызывать action%Method% через браузер напрямую, кроме зарезервированных.

Например, по ссылке /plugins/%PluginName%/test будет вызываться метод actionTest() в action.php.

В плагинах используется параметр APIKEY. Это уникальный ключ для доступа к плагинам извне, которые передается в заголовке HTTP-запроса в виде GET-параметра. APIKEY задается в меню «Настройки» — «Безопасность».

Свойства класса:

  • $actions = [] — Reference Action объектов плагина
  • $settings = []— Все настройки плагина. В том числе с BD
  • $plugin_id = 0 — ID плагина после установки
  • $this->DB — экземпляр класса Database (после инициализации)

Методы класса:

  • getName() — Метод, который должен быть в каждом плагине и возвращает: (string) %plugin_name%
  • actionIndex() — Метод, который должен быть в каждом плагине. Используется для вывода Описания. Вызывается, когда пользователь устанавливаем плагин в Маркет-плейсе.
  • getManifest() — Возвращает ассоциативный массив манифеста или []
  • checkActiveForm(string $formName) — Возвращает True/False, если форма есть в ActiveForms
  • eventInstall() — Вызывается после установки плагина и после сохранения параметров, если такие имеются
  • eventChangeSettings() — Вызывается каждый раз, когда сохраняются новые параметры в настройках Плагина пользователем
  • eventUninstall() — Вызывается перед удалением плагина
  • getData($configManifest = []) — Устанавливает $this->settings (Настройки плагина, в том числе по умолчанию) из базы данных. Устанавливает $this->plugin_id. Если $configManifest не задан, то автоматом получает через $this->getManifest()
  • getSettingsValue(string $key) — Получает параметр настройки Плагина по ключу $this->settings[$key] из БД. Если нет, то возвращает пустую строку.
  • setSettingsValue(string $key, string $value) — Устанавливает параметр настройки Плагина по ключу в БД. Все ключи должны быть прописаны в mantifest.settings.
  • deleteSettingsKey($key) — Удаляет  значение параметра настройки Плагина по ключу из БД.
  • installPlugin() — Устанавливает плагин и синхронизирует настройки manifest.settings c БД
  • deletePlugin() — Удаляет все настройка плагина и деинсталирует его
  • isActive() — Проверяет, установлен или нет плагин в Системе
  • getRealName($nameAttr = «name»») — Получить имя с langpack. Если нет — берет $this->getName()
  • getFullPath() — Полный физический путь к плагину
  • getPath() — Относительный путь к плагину
  • getLangPack($defLang = null) — Получает массив LangPack. Если $defLang не задан — то берется язык по умолчанию из Системы
  • existAction(string $actionName) — Проверяет, есть ли action у данного объекта
  • getListByType($type, $checkActive = false)
    Получает Action объекта установленного плагина, где $type — это тип Action:

    • Kernel\Plugins\PluginManager::PLUGIN_TYPE_PHONE — Телефония
    • Kernel\Plugins\PluginManager::PLUGIN_TYPE_SMS — СМС
    • Kernel\Plugins\PluginManager::PLUGIN_TYPE_CONTENT — Другие

    Если checkActive = true — то будет проверятся плагин на isActive()

  • getAction($actionName) — Получить объект PluginAction. $actionName = PluginManager::PLUGIN_TYPE_*
  • beforeDisplay() — Вызывается перед display() или выводом информации. Устанавливает $this->page. Также метод вызывается, если нужно передать в шаблон ряд переменных.
  • display($templateName) — Выводит шаблон $templateName который находится в папке html плагина
  • output($templateName, $isArray = false) — Тоже самое что и display(), только не выводит, а возвращает результат рендера шаблона.
  • getApiKey() — Получить APIKEY (см. меню «Настройки» — «Безопасность»).
  • resultSuccess($array = [], $resultOnlyData = false) — Возвращает Json/Xml ответ. Если $resultOnlyData выставить в «true», то будет результат массив $array, иначе полный заголовок result в системе со status и прочим. Сбивает $this->page на XML/JSON
  • resultError($error = [], $resultOnlyData = false) — Возвращает Json/Xml ошибку resultOnlyData, как и в resultSuccess
  • getCallbackLink(PluginManager::PLUGIN_TYPE_* $type, $action = «», $joinParams = []) — Получить полную внешнюю ссылку на %Type%Action Плагина с учетом API_KEY. Если $action установлен, то ссылку даст на actionMethod $Type%Action плагина. Параметр — $joinParams — это массив ключ=>значение. Добавляет get параметры к URL, при этом не затирая API_KEY. Параметры автоматически экранируются Urlencode. Обычно ссылка из getCallbackLink() используется для взаимодействия с Плагином из стороннего сервиса, например при отправке уведомления о входящем звонки из АТС, или для приема любого Webhook.
    getCallbackLink(Kernel\Plugins\PluginManager::PLUGIN_TYPE_PHONE, string $action = "")
    // http://xrm-dev-sp1/plugins/%pluginName%/%type%/%action%/?APIKEY=%API_KEY%
    
    getCallbackLink(Kernel\Plugins\PluginManager::PLUGIN_TYPE_PHONE, $action = "dopaction", ["a" => "b"])
    // http://xrm-dev-sp1/plugins/%pluginName%/phone/dopaction/?a=b&APIKEY=%API_KEY%
  • printCallbackLink(PluginManager::PLUGIN_TYPE_* $type, $action=»», $link = «», string $BLOCK = «») — Размещение CallbackLink в шаблоне. Если не установлен $link, то выполняется getBackLink(). $BLOCK — в каком блоке разместить ссылку. Если не указать значение в $BLOCK, то блок по умолчанию будет «CALLBACK_LINK». Если задать $BLOCK = «SUB_BLOCK», то фактически блок будет выглядеть так: «SUB_BLOCK.CALLBACK_LINK».
  •  function printUsers($BLOCK = «») — Используется для рендера списка пользователей. Например в телефонии, для привязки сотрудников к коротким номерам службы.

Класс PluginAction

PluginAction — класс, от которого наследуются все Action.

Свойства класса:

После инициализации.

  • $this->DB — экземпляр класса Database
  • $this->User — экземпляр класса User
  • $this->Http — экземпляр класса Http,

Методы класса:

  • getDescription() — Получить описание Плагина. Проверяет есть ли оно в langPack, если нет то с манифеста берет
  • getPluginName() — Получить имя плагина
  • getLangPack() — Получить lang pack
  • getType() — Получить тип Плагина
  • getVendor() -Получить производителя Плагина(РБС или партнер)
  • getVersion() -Получить версию Плагина
  • getRating() — Получить рейтинг Плагина
  • getPlugin() — Получить свой экземпляр класса PluginBase
  • getFormatPhone($phone, $append=»8″) — Конвертирует телефон например: +7 248 222-22-22 в 82482222222. Восьмерка вставляется с аргумента $append
  • Transfer($url, $postData = [], $ssl = null, $isGET = false) — Отправить запрос по CURL (по протоколу HTTP(S).
    $url — ссылка куда отправляется запрос. $postData — массив, который используется как для GET запроса так и для POST. Ассоциативный массив. $ssl — Определяет включать SSL или нет. Если установить null — то система автоматически определяет. $isGET — true/false GET или POST параметры в запросе.

Класс PluginPhoneBase

PluginPhoneBase — расширение класса PluginAction. От PluginPhoneBase должны наследоваться все PhoneAction

Константы:

  • CALL_IN ( 1 — для Входящих звонков)
  • CALL_OUT (2 — для Исходящих звонков)
  • CALL_MISSED (3 — для Пропущенных звонков)

Свойства:

Все свойства и методы PluginAction.

Собственные методы:

actionCall()

Данный метод должен быть реализован в каждом телефонном плагине. Этот метод вызывается системой для совершения исходящего звонка.

Метод принимает переменные POST:

  • $post = $_POST[‘name’];
  • $to = $this->getFormatPhone($_POST[‘to’]);

Функция должна вернуть JSON-массив:

[
 "name" => "NAME",
 "to" =>"PHONE TO",
 "from" =>"FROM",
 "status" => "Connected", //or Disconnected
 "pluginName" => $this->getPlugin()->getRealName()
]

Где:

  • FROM— внутренний номер сотрудника (добавочный номер в карточке Плагина), от которого совершается звонок: $this->getShortNumber($this->User->getEmployeeId());
actionInbound()

Данный метод должен быть реализован в каждом телефонном плагине для получения информации о входящем звонке. Этот метод вызывается внешней системой для Callback. См. ниже пример.

getShortNumber($user_id)

Получение короткого номера пользователя из настроек текущего плагина.

getAllUsersWithExtensions()

Получение массива из «ID» всех пользователя, у которых есть добавочный номер в плагине. Метод доступен в релизе 23.01 и выше.

getCompanyByPhone($phone)

Находит companies по номеру телефона (при входящем и исходящем звонке).

Возвращает массив:

[
 'companyId' => 0,              // Id контрагента
 'companyName' => '',           // Наименование контрагента
 'companyEmail' => '',          // E-mail контрагента
 'contactId' => 0,              // Id контактного лица
 'contactName' => '',           // Наименование контактного лица
 'contactEmail' => '',          // E-mail контактного лица
 'url' => '',                   // Ссылка на найденного контрагента или контактное лицо
 'urlName' => '',               // Тип ссылки (company || contact)
 'companyResponsibleId' => 0    // Id ответственного за контрагента
]
getContactByPhone($phone)

Находит contacts по номеру телефона (при входящем и исходящем звонке).

Возвращает массив:

[
 'companyId' => 0,              // Id контрагента
 'companyName' => '',           // Наименование контрагента
 'companyEmail' => '',          // E-mail контрагента
 'contactId' => 0,              // Id контактного лица
 'contactName' => '',           // Наименование контактного лица
 'contactEmail' => '',          // E-mail контактного лица
 'url' => '',                   // Ссылка на найденного контрагента или контактное лицо
 'urlName' => '',               // Тип ссылки (company || contact)
 'companyResponsibleId' => 0    // Id ответственного за контрагента
]
sendPopupPhone(integer | array $user_id, string $name, string $to, string $from, string $status, interger $command_id = 0, string $url = «», interger $responsible = 0, string $pluginName = «»)

Отправить всплывающее уведомление о звонке пользователю.

Где:

  • user_id — id сотрудника, кому показать уведомление о звонке
  • name — Имя контрагента (контактного лица)
  • to — Телефон кому (номер телефона)
  • from — От кого (номер телефона)
  • status — «Connected» или «Disconnected»
  • command_id — уникальный id — это некий параметр который уходит во внешнюю систему и приходит
  • url — ссылка на найденного Контрагента
  • responsible — id Ответственного сотрудника за Контрагента
  • pluginName — Имя плагина — если не задать — выставиться автоматически

Метод ничего не возвращает.

addRelationship(string $phone, integer $direction, integer $companyId, integer contactId, string $contactEmail, integer $responsibleId, integer $callId, array $callsParams)

Создание  контактов при звонке.

Где:

  • phone — Телефон
  • direction  — Направление звонка
  • companyId — id Контрагента
  • contactId — id Контактного лица
  • contactEmail — E-mail контактного лица
  • responsibleId — id Ответственного за контрагента
  • callId — id Звонка
  • callsParams — Массив данных о звонке

Возвращает id созданного контакта.

addDeal(string $fromNumber, string $toNumber, integer $callId, array $callsParams, integer $direction)

Добавление информации в последнюю активную сделку контрагента, а также создание нового звонка.

Где:

  • fromNumber — Номер, с которого звонят
  • toNumber — Номер, на который звонят
  • callId — id Звонка
  • callsParams — Массив данных о звонке
  • direction — Направление звонка

Возвращает true | false, в зависимости от результата обновления информации в сделке.

addTask(string $name, integer $companyId, integer $callId, integer $responsibleId)

Добавление новой задачи.

Где:

  • name — Наименование задачи
  • companyId — id Контрагента
  • responsibleId— id Ответственного за задачу

Возвращает id созданной задачи.

addCompany(string $phone, string $name, …array $arrayFields)

Добавление новой контрагента.

Где:

  • phone — Телефон
  • name — Наименование контрагента
  • arrayFields — любое кол-во массивов или же одного массива со структурой [‘Имя поля’ => Значение поля]

Возвращает массив [‘id’ => ‘id Контрагента’, ‘name’ => ‘Наименование контрагента’].

Класс PluginSmsBase

PluginSmsBase — расширение класса PluginAction. От PluginSmsBase должны наследоваться все Sms Action.

Свойства:

Все свойства и методы PluginAction.

Методы:

actionSend()

Метод, который должен реализовать каждый sms плагин. Этот метод вызывается нашей системой для отправки SMS.

На вход идут две переменные:

  • text — сам текст
  • to — номер, куда отправляется сообщение

Для результата необходимо использовать resultSuccess() или resultError()

send($text, $phoneTo)

Метод, который должен реализовать каждый sms плагин. Это метод самой отправки. Именно он должен вызываться из actionSend().

Где:

  • text — сам текст
  • to — номер, куда отправляется сообщение

Отправка сообщений в программном коде системы вызывается следующим образом:

Kernel::getPluginsInstance()->getPlugin($pluginCode)->getAction(\Kernel\Plugins\PluginManager::PLUGIN_TYPE_SMS)->send($text, $phoneTo);

Где:

  • $text — текст сообщения, которое будет отправляться получателю
  • $phoneTo — номер получателя, на который будет отправляться сообщение
  • $pluginCode — название плагина, значение берётся из поля «Plugin code»

Также отправку сообщений можно реализовать посредством отправки Ajax-запроса на следующий адрес:

%crmUrl%/plugins/%pluginCode%/sms/send/

С передачей следующих POST-параметров:

  • text —текст сообщения
  • to — номер, куда отправляется сообщение

Класс PluginContentBase

PluginContentBase — расширение класса PluginAction. От PluginContentBase должны наследоваться все Content Action.

Свойства:

Все свойства и методы PluginAction.

Методы:

content()

Метод должен быть реализовать каждый content плагин. Возвращает html|text который встраивается в контент.

API Plugin

API plugin позволяет JavaScript получать и устанавливать настройки Плагина. Поддерживаемые форматы XML и JSON, в зависимости от ACCEPT заголовка.
API pligin работает по следующим ссылкам:

/plugins/%PluginName%/api/%MethodApi%

Методы:

getSettings — Возвращает все сохраненные настройки плагина.

/plugins/%PluginName%/api/getSettings

setSettings — установить настройки плагина. Имена ключей должны соответствовать ключам настроек манифеста и добавляться для POST запроса префикс object_ — например ключ плагина — key, то в POST должен быть object_key

/plugins/%PluginName%/api/setSettings

deletePlugin — удаление установленного плагина. Никаких параметров не надо. Удаляет со всеми настройками.

/plugins/%PluginName%/api/deletePlugin

installPlugin — установка нового плагина. Имена ключей должны соответствовать ключам настроек манифеста и добавляться для POST запроса префикс object_ — например ключ плагина — key, то в POST должен быть object_key

/plugins/%PluginName%/api/installPlugin

Структура папок плагина

Название папки/плагина — название компании или название выражающая суть плагина. Наименование должно быть уникально в рамках одной системы.

  • %plugin_name%
    • actions — размещаются все %Type%Action
    • css — для стилей
    • html — для html шаблонов
    • img — для всех изображений
      • logo_120.png — изображение в списке плагинов (120 x auto)
      • logo_200.png — изображение в описании плагина (200 x auto)
    • js — для различных скриптов
    • lang — содержатся все lang pack
      • ru.php — Возвращает ассоциативный массив.
    • index.php — Основной файл плагина унаследованный от PluginBase
    • manifest.php — Манифест. Описывает параметры плагина, указывает какие Actions использует, настройки, и права
Манифест — manifest.php

Это первый файл, с которого должны начинать разработку плагина.

<?php

/** Manifest plugin */

return [
    "name" => "%plugin_name%",
    "description" => "Plugin description ",
    "types" => [
        "phone"
        /*"content",*/ /*"sms",*/
    ],
    "vendor" => "vendor name",
    "version" => "1.0",
    "rating" => 0,
    "settings" => [
        "param1" => "",
        "param2",
    ],
    /*Для других плагинов*/
    "ActiveForms" => [
        "edit",
        "list",
    ],
];

Manifes.php возвращает ассоциативный массив:

  • name —- имя плагина
  • description — описание (может быть пустым)
  • types — Массив, в котором указываются, какие типы Action есть в этом плагине
  • vendor — Наименование разработчика
  • version — Версия плагина
  • rating — Рейтинг плагина (задается вручную)
  • settings — Настройки по умолчанию. Они же сохраняются в базу в установке и настройки плагина. Это ассоциативный массив ключ=>значение. Можно указать значения по умолчанию
  • ActiveForms — массив для Других плагинов(content). В массиве передается список типов форм для которых загружается
Класс Index(index.php) extends PluginBase

Это обязательный файл, без которого не может обойтись любой плагин. Всегда имеет имя Index и унаследован от PluginBase.

Свойства:

Все свойства и методы PluginBase.

Методы:

  • function getName() — должен возвращать всегда %PluginName%
  • actionIndex() — используется для вывода Описания. Вызывается, когда кликаешь в plugin manager на описание. Можно так же явно поучить контент по ссылке /plugins/%PluginName%/index

    //print html/description.tpl file
    public function actionIndex() {
         $this->display("description");
    }
  • actionSettings() — используется для вывода Настроек. Вызывается при установки плагина и изменения его настроек.

    Файл index.php метод actionSettings():

    public function actionSettings() {
        //Если нужно установить переменные в шаблон,обязательно нужно вызвать этот метод и установить $this->page
        $this->beforeDisplay();
        //Все настройки mapping page
        $this->page->set($this->settings);
    
        //Установить Label с Langpack
        $this->page->set([
            "title_key" => $this->getRealName("title_key"),
        ]);
        //вывод шаблона settings.tpl
        $this->display("settings");
    }

    Файл html/settings.tpl:

    <!-- Используется, если есть #include или [[css]] или [[js]] -->
    {css static}
    <link href="$app_path/css/#name.css" rel="stylesheet" media="all">
    {/css}
    {js static}
    <script type="text/javascript" src="$app_path/js/#name.js"></script>
    {/js}
    <!-- Подключаем эти файлы если хотим использовать [[field]] [[CONTAINER]] -->
    #include <fields>
    #include <container>
    <!-- Подключает css/style.css -->
    [[css | name: style]]
    
    [[CONTAINER | h: hide]]
        [[field | name: key | type: input | parentClass: w-100 | addLabel: $title_key$ | required:required-mode | value: $key$]]
    [[CONTAINER_END]]
    
    <!-- Подключает js/main.js -->
    [[js | name: main]] 
    </container></fields>

     

Языковой массив (Langpack)

Файлы языковых пакетов. Создаются в папке lang под именем (ru, en…). Например lang/ru.php. Файл должен возвращать массив ключ/значение.

<?php

 return [
    "company" => "Контрагент"
 ];
?>