Один из наших сервисов занимается построением ежедневных отчетов анализируя данные из Highrise.
Данные из Highrise можно получать несколькими способами:
- Использовать экспорт в CSV
- Использовать API
CSV нами даже не рассматривался и мы попытались найти удобный метод для ежедневного обновления нашей базы через API.
Придумали следующее:
- Получаем XML фид и парсим его.
- Все непосредственные дочерние поля мы считаем полями в таблице.
- Все вложенные элементы мы считаем связанными таблицами
Пример XML ответа (https://xxx.highrisehq.com/deals.xml):
Стрелками обозначены элементы, которые мы считаем вложенными и соответственно выносим данные в связанные таблицы.
Как мы делали из XML MySQL таблицы.
- Если в данных имеется поле id — мы считаем его первичным целым ключом
- Для всех остальных полей XML типом мы считаем аттрибут type (исключая тип array)
- Для вложенных элементов мы проверяем имеют ли они аттрибут id и если имеют (у нас связанная таблица), то добавялем к нашей таблице поле <имя вложенной таблицы>-id и создаем вложенную таблицу
- Все поля в таблице делим на 3 типа: integer, datetime и varchar/text. TEXT у нас только в том случае, если имя поля имеет одно из конкретных значений: 'value', 'description', 'text', 'body', 'message', 'data', 'blob', 'background'
Пример того что у нас получается на выходе:
Теперь с этими данными можно делать что угодно, рисовать графики, считать суммы, выдергивать другую интересную информацию.
Самое главное, что получившийся код работает со всеми сервисами 37signals и может делать синхронизацию любого их сервиса.
Пример синхронизации Basecamp
<?php
require 'SyncService.class.php';
$sync = new SyncService( array(
'db' => array(
'host' => 'localhost',
'user' => 'root',
'password' => '123',
'schema' => 'basecamp'
),
'service' => array(
'name' => 'basecamp',
'url' => 'https://xxx.basecamphq.com',
'token' => 'abcdef1234567890abcdef1234567890',
'streams' => array(
'/todo_lists.xml' => 500,
'/people.xml' => 500,
'/projects.xml' => 500,
'/account.xml' => 0,
)
),
) );
$sync->doSyncing();
Весь код библиотеки вместе с примером на гитхабе.
Автор: xytop