Создание собственных чартов/диаграмм в SugarCRM

Итак сегодня мы рассмотрим как же создать свои диаграммы/чарты в SugarCRM.
SugarCRM «из коробки» включает в себя следующие основные диаграммы:

  • Все сделки по источникам предварительных контактов
  • Диаграмма рентабельности инвестиций
  • Диаграмма стадий моих продаж
  • Диаграмма стадий общих продаж
  • Стадии продаж по источникам предварительных контактов
  • Стадии продаж по месяцам

Как видим набор их достаточно ограничен. Но создавать новые диаграммы в SugarCRM не такая и сложная задача. Единственный сложный этап это самостоятельное написание метода извлечения нужных данных (например, с помощью SQL запроса).

Итак представляю вам пошаговую инструкцию создания своего чарта(графика) для SugarCRM. Сразу предупреждаю что статья рассчитана исключительно на программистов.

1. Для удобного составления новых классов существует набор абстрактных классов от Джона Мертика.
Скачиваем их по адресу — https://github.com/jmertic/sugarcrm_chartabstracts. Копируем данный набор абстрактных классов в custom/include/Dashlets/ вашей SugarCRM.

2. Создаем новую директорию для вашего чарта — custom/modules/Charts/Dashlets/YOURCHARTDASHLETNAME/,
где YOURCHARTDASHLETNAME — имя вашего чарта/диаграммы.
Внимание. Далее по тексту все вхождения YOURCHARTDASHLETNAME меняем на данное вами имя и все файлы создаем в данной новой директории.

3. Создаем в этой директории файл с именем YOURCHARTDASHLETNAME.meta.php и следующим содержимым:

<?php
$dashletMeta['YOURCHARTDASHLETNAME'] = array('title'       => 'LBL_TITLE',
                                             'description' => 'LBL_TITLE',
                                             'icon'       => 'icon_Charts_Horizontal_32.gif',
                                             'module'   => 'YOURCHARTDASHLETMODULE',
                                             'category'    => 'Charts'
                                             );

где YOURCHARTDASHLETMODULE меняем на название модуля для которого создаётся диаграмма

4. Создаем языковой файл YOURCHARTDASHLETNAME.lang.LANGUAGE.php со следующим содержимым:

<?php
$dashletStrings['YOURCHARTDASHLETNAME'] = array('LBL_TITLE'       => 'Тут пишем ваш тайтл',
                                                    'LBL_DESCRIPTION' => 'А тут пишем описание',
                                                    'LBL_REFRESH'     => 'Обновить');

где LANGUAGE для русского языка заменяем на ru_ru, если вам нужен английский на en_us, и т.д.
Соответственно внутри языкового файла пишите названия и описания, которые будут отображаться пользователю.

5. Собственно все что было ранее, это подготовительный этап. Мы просто сообщали системе что мы добавляем график для определенного модуля, и создавали языковой файл с описанием данного чарта. Теперь самый ответственный этап — создание класса с логикой для извлечения нужных данных.

Создаем файл YOURCHARTDASHLETNAME.php со следующим содержимым:

<?php
        require_once('custom/include/Dashlets/DashletGenericStackedGroupByChart.php');

        class YOURCHARTDASHLETNAME extends DashletGenericStackedGroupByChart
        {
            protected $_seedName = 'YOURCHARTDASHLETMODULE';

            protected function getDataset()
            {
                $returnArray = array()

                // Здесь вам необходимо самостоятельно реализовать метода для извлечения необходимых данных, и поместить ответ в ассоциативный массив $returnArray
                return $returnArray;
            }
        }

Как вы видите логику для извлечения данных необходимо реализовать самостоятельно. Самый простой и быстрый вариант через SQL запрос, но в принципе в некоторых случаях допустимо и использование встроенных классов и методов, если они удобно и быстро позволяют извлечь нужную информацию. Так же обязательно обратите внимание что наш созданный класс мы наследуем от одного из скачанных раннее. В данном случае это DashletGenericStackedGroupByChart (чарт с группировкой, его мы будем использовать ниже в примере).

Другие возможные варианты — DashletGenericBarChart (гистограмма), DashletGenericFunnelChart (воронка), DashletGenericGaugeChart (простая диаграмма), DashletGenericGroupByChart (вертикальная диаграмма с группировкой), DashletGenericHorizontalGroupByChart (горизонтальная диаграмма с группировкой), DashletGenericPieChart (круговая диаграмма).

Ну и по традиции пример — создание диаграммы для SugarCRM, для лучшего, так сказать, усвоения материала :grin:

Создадим диаграмму отображающую количество новых заведенных контактов в CRM с группировкой их по должностям.

1. Придумываем для нашей диаграммы название. Я назову ее очень оригинально — MyDashlet. Соотвественно создаем папку — custom/modules/Charts/Dashlets/MyDashlet/

2. Создаем внутри файл файл MyDashlet.meta.php со следующим кодом:

<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');

global $app_strings, $current_language;
$dashletMeta['MyDashlet'] = array('title'       => 'LBL_TITLE',
                                                    'description' => 'LBL_DESCRIPTION',
                                                    'icon'		  => 'icon_Charts_Vertical_32.gif',
                                                    'module'        => 'Contacts',
                                                    'category'    => 'Charts');

3. Создаем внутри нашей директории файл MyDashlet.lang.ru_ru.php

<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
$dashletStrings['MyDashlet'] = array('LBL_TITLE'       => 'MyDashlet',
											 	 'LBL_DESCRIPTION' => 'MyDashlet',
												 'LBL_REFRESH'     => 'Обновить диаграмму');
?>

4. Создаем файл MyDashlet.php с извлечением нужных данных:

<?php
require_once('custom/include/Dashlets/DashletGenericStackedGroupByChart.php');

class MyDashlet extends DashletGenericStackedGroupByChart
{
    protected $_seedName = 'Contacts';

    protected $groupBy = array('m','title'); //группировка по месяцам и должностям

    protected function getDataset()
    {
        $returnArray = array();

	global $db;

	$query = "SELECT count(id) as total, title, ".
            db_convert('contacts.date_entered','date_format',array("'%Y-%m'"),array("'YYYY-MM'"))." as m, count(*) as con_count FROM contacts ";
        $query .= " WHERE contacts.date_entered >= ".db_convert("'".'2011-01-01'."'",'datetime') .
                        " AND contacts.date_entered <= ".db_convert("'".'2013-01-01'."'",'datetime') .
                        " AND contacts.deleted=0";
        $query .= " GROUP BY title,".
                        db_convert('contacts.date_entered','date_format',array("'%Y-%m'"),array("'YYYY-MM'")) .
                    " ORDER BY m";

        $result = $db->query($query);

		$row = $db->fetchByAssoc($result);

		while ($row != null){
			$returnArray[] = $row;
			$row = $db->fetchByAssoc($result);
		}
        return $returnArray;
    }
}

Теперь запускаем быстрое восстановление. Далее переходим на главную страницу — нажимаем кнопку добавить раздел — переходим во вкладку диаграммы и мы должны увидеть нашу диаграмму. Выбираем ее, после чего она появляется на главной странице.
Вот что мы получили в результате:

Собственная диаграмма в SugarCRM

На этом все. Обсуждение по этой теме доступно на нашем форуме SugarCRM.

Есть 3 коммент. к “Создание собственных чартов/диаграмм в SugarCRM”

  1. malahit:

    Воспользовался вашим кодом, но возникла проблема.

    У меня почему-то некорректно формировались drill down ссылки с графиков, т.е. получались кривые параметры get запроса, а именно неверно задавался параметр assigned_user_id[].

    Причина была найдена в коде класса соответствующего дашлета от Джона Мертика:

    if ( empty ($this->urlParams) ) $this->urlParams = $this->groupBy;

    т.е. если не инициализировать параметр

    protected $urlParams = array ();

    в параметры url будут подставляться значения

    protected $groupBy = array ();

    что в общем-то не совсем корректно...

    Например, может получаться запрос с параметром типа ...&assigned_user_id[]=m&... (для описанного выше примера), т.е. выборка будет явно пустой из-за некорректного assigned_user_id[], который SugarCRM настойчиво пытается добавлять в drill down ссылку (не стал разбираться, почему она так делает, т.к. изначально считаю просто некорректным присвоение $urlParams значения $groupBy).

    Поэтому, если дополнительных параметров фильтра вроде

    protected $urlParams = array («name» => «Иванов»);

    не используется,

    лучше указывать

    protected $urlParams = array ('');

    в таком случае хотя бы получим ...&assigned_user_id[]=&... (пустое значение параметра не учитывается и выборка по фильтру проходит нормально).

  2. ilk:

    Сделал все по инструкции. Диаграмма по месяцам и источникам обращения lead_source. Проблема: выводятся не русские значения комбо-бокса lead_source, а названия, т.е. латиницей (internet, oldclient...). Как выправить?

  3. Shamanchik:

    как изменить php код чтоб выводилась группировка по пользователям

    заменил title на created_by и ясное дело высвечивается нечто такого:7fee097a-1e59-9e7f-6dc0-52d3be7a1115, вместо имени создавшего контакт.

    Как привести к нормальному виду имя юзера?

Написать комментарий

Вы должны войти чтобы комментировать.