Один из наших сервисов занимается построением ежедневных отчетов анализируя данные из Highrise.
Данные из 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();
ссылка на оригинал статьи http://habrahabr.ru/post/179665/
Добавить комментарий