Тонкощі інтеграції Redmine і Бітрікс24

10 Березня 2016

наступна стаття
Сергій Лебедєв

Backend developer

Сергій Лебедєв
Тонкощі інтеграції Redmine і Бітрікс24

Вступ

Зазвичай в компаніях використовується тільки одна CRM, але в разі змін, введення нових технологій або просто для зручності співробітників компанії шукають способи як використовувати кілька CRM, при цьому особливу важливість представляє підтримка актуальності даних в CRM, тобто, якщо якась задача створена в одній CRM, необхідно, щоб ця задача була і в інший.

Для розв'язання даних проблем ми розробили сервіс, який дозволяє робити інтеграцію Бітрікс24 з Redmine і можливістю розширення до інтеграції з будь-якими CRM.

У даній статті я розповім про особливості створення сервісу і з якими проблемами ми зіштовхнулись.

Основи розробки

Основний критерій якості розробки у нас — дотримання принципів KISS, SOLID, тобто ми робимо код простим, зрозумілим, таким, що легко підтримується і легко розширюється. Для того, щоб дотримуватися цих принципів, необхідно на самому початку розробки добре продумати архітектуру програми, і у випадку з завданням інтеграції ми розглянули 2 варіанти:

  1. Надсилання даних безпосередньо з Бітрікс24 в Redmine

  2. Насилання даних з Бітрікс24 в проміжний сервіс, а далі — сервіс відправляє дані в Redmine

Переваги першого варіанту:

  • Швидкість розробки: ми можемо дуже швидко зробити прості приклади коду, які будуть відправляти дані в Redmine

  • Відносна простота рішення: відносна тому, що перші кроки зробити дуже просто, але коли потрібно буде впровадити велику кількість функціоналу, в силу недоліків, ймовірність того що буде допущена помилка — велика

Недоліки першого варіанту::

  • Складність підтримки: Бітрікс24 має низку обмежень, які накладаються на розробку архітектури додатку

  • Відсутність модульності

  • Неможливість легко доповнити код так, щоб впровадити інтеграцію з іншими CRM

Переваги другого варіанту:

  • Модульність: ми можемо розділити код на кілька слабо зв’язаних простих частин, що дозволити уникнути більшості помилок

  • Простота підтримки

  • Можливість розширення: при використанні окремого сервісу на окремому фреймворку ми дуже легко можемо побудувати структуру програми так, щоб для додавання інтеграції більшу частину вже написаного коду ми могли використати повторно, що значно скоротить витрати на впровадження нових можливостей

Недоліки другого варіанту:

  • Швидкість розробки: трохи довше, ніж в першому варіанті, оскільки потрібно налаштувати програмне забезпечення

Недовго думаючи, ми вибрали 2 варіант.

Технічна реалізація

Основи

Для технічної реалізації ми використовували наступний алгоритм:

У Бітрікс24, при зміні якоїсь інформації, відпрацьовує відповідна подія, реагуючи на цю подію ми можемо надіслати дані куди завгодно. У Redmine є механізм REST API, який дозволяє отримувати та оновлювати інформацію, і механізм hooks, аналог подій у Бітрікс24, який відпрацьовує при зміні інформації і дозволяється відправляти відповідні запити.

Приклад синхронізації даних

Далі розберемо простий приклад для синхронізації користувачів Бітрікс24 і Redmine

Надсилання даних з Бітрікс24 в сервіс

Попри всі недоліки Бітрікс24, документація все-таки хороша, тому реалізувати надсилання даних в сервіс не було складно.

Для того, щоб відправити інформацію, нам необхідно: «відловити» відповідну подію Бітрікс24, зробити відповідний запит.

Для реалізації ми створили окремий файл, під’єднали його в init.php, далі для подій прописали наступний код:


1
2
3
AddEventHandler("main", "OnAfterUserAdd", "OnAfterUserAddFunction");
AddEventHandler("main", "OnAfterUserUpdate", "OnAfterUserUpdateFunction");
AddEventHandler("main", "OnUserDelete", "OnUserDeleteFunction");



Ці події викликають відповідні функції надсилання даних:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function OnAfterUserAddFunction($arFields){
    $send = new RestBx24("http://laravel-service.dev/user/create");
    $send->sendPost($arFields);
}
 
function OnAfterUserUpdateFunction($arFields){
    $send = new RestBx24("http://laravel-service.dev/user/update/".$arFields['ID']);
    $send->sendPost($arFields);
}
 
 
function OnUserDeleteFunction($id){
    $send = new RestBx24("http://laravel-service.dev/user/destroy/".$id);
    $send->sendPost();
}



В даному коді використовується клас RestBx24, який відправляє відповідні запити з Бітрікс в сервіс. RestBx24 це своєрідна обгортка для php бібліотеки curl, зроблено для зручності розробки:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class RestBx24 {
        public $chlead;
        public function __construct($url)
        {
            $this->chlead = curl_init();
            curl_setopt($this->chlead, CURLOPT_URL, $url);
            curl_setopt($this->chlead, CURLOPT_RETURNTRANSFER, true);
        }
        function sendPost($arData){
            curl_setopt($this->chlead, CURLOPT_POST, true);
            curl_setopt($this->chlead, CURLOPT_POSTFIELDS, http_build_query($arData));
            $result = curl_exec($this->chlead);
        }
        public function __destruct()
        {
            curl_close($this->chlead);
        }
    }


Цей клас обов'язково підключаємо в init.php

Надсилання даних з Laravel в Redmine

Для реалізації надсилання ми створили: просту Model в якій буде зберігатися відповідність ID Бітрікс і ID редмайн; під’єднали API Redmine, налаштували відповідні Рауса, реалізували контролери, які займаються обробкою вхідних запитів.

Більш детально реалізацію інтеграції ви можете подивитися тут..

Надсилання даних з Redmine в Laravel

Для реалізації синхронізації користувачів Redmine ми під’єднали hook redmine — алгоритм надсилання, аналогічний алгоритму Бітрікс: відстежуємо подію, відправляємо запит в Laravel, Laravel оновлює ID і відправляє запит в Бітрікс24 ..


Схожі статті
Записатись на консультацію

Ми зв'яжемось з Вами протягом 10 хвилин