Журнал LinuxFormat - перейти на главную

LXF92:SugarCRM

Материал из Linuxformat
Версия от 11:08, 24 ноября 2008; Crazy Rebel (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск


SugarCRM
Рафинированный SugarCRM Ставим и настраиваем открытую CRM-систему

Содержание

SugarCRM: Как добавить модули

ЧАСТЬ 3: В последней статье о SugarCRM Марк Бэйн расскажет, как добавить в это приложение собственные функции и освоить его по-настоящему.

Если вы устанавливали и настраивали SugarCRM вместе с нами или делали это самостоятельно, у вас уже должна быть работающая версия программы с подходящей темой и терминологией, принятой у вас в организации, вместо стандартных «продаж и поддержки». Но удовлетворяет ли ее работа всем потребностям пользователей?

Вероятно, нет. В конце концов, SugarCRMпредлагает универсальную базовую конфигурацию для всех типов организаций, и самое время подумать о том, как приспособить его для использования в вашей. Я покажу вам, как глубже проникнуть в таинство настройки и добавить в программу новые функции, необходимые для работы с клиентами. Мы добавим новый модуль для генерации отчетов и выпадающий список для хранения информации, не предусмотренной в SugarCRM по умолчанию.

Настройка выпадающего списка

Уж не знаю, как вы используете функцию Calls (Звонки), но обычно на вкладке Calendar (Календарь) нужно нажать на ссылку Schedule Call (Расписание телефонных звонков) и ввести данные о запланированных звонках.

Но что если часть этих контактов осуществляется не по телефону, а через программу обмена сообщениями (например, Kopete)? Как обозначить тип контакта в списке вызовов? Конечно, можно сделать соответствующую отметку в поле Описание (Description), но гораздо удобнее создать выпадающий список и задавать в нем тип контакта. Чтобы двигаться дальше, нам потребуются глубокие знания PHP? Отнюдь. Что тут думать: возьмем да просто сделаем это. В прошлый раз для переименования вкладок мы редактировали файл custom/include/language/en_us.lang.php. Добавим в этот же файл и новый выпадающий список с типами используемых контактов:

 $app_list_strings[‘cmb_communication’] = array (
 ‘TEL’ => ‘Telephone’,
 ‘MSN’ => ‘MSN’,
 );

Нетрудно видеть, что это массив, состоящий из:

  • Поля данных, определяющего хранимое в базе данных значение для каждого элемента.
  • Текста, который будет отображаться на экране для этого элемента.

Выпадающий список готов.

Теперь определим его местоположение на странице: поработаем в SugarCRM Studio. Это компонент панели управления администратора, где можно заняться настройкой. Зайдите в SugarCRM как администра- тор (admin) и перейдите на экран Admin. Там расположена ссылка на SugarCRM Studio. Щелкнув на нее, выберите пункт меню Редактировать модуль (Edit A Module) (каждая вкладка, естественно, является отдельным модулем). Появится список модулей, которые можно редактировать; среди них есть и Calls. На странице этого модуля нажимаем кнопку Редактировать раскладку (Edit Layout), и перед вами предстанут раскладки на выбор: Detail View, Edit View, List View и Search Form. Выбираем Edit View.

Теперь преобразуем вкладку Edit View функции Calls. Справа располагается текущее содержимое вкладки, слева – элементы интерфейса, которые можно добавить на вкладку. Выпадающего списка, который мы добавили ранее, там пока нет. Чтобы он появился в левой части окна, нужно отвести ему поле в базе данных. Для этого достаточно нажать кнопку Add Custom Field (Добавить поле).

Расписание звонков

SugarCRM позволяет составить расписание звонков, но хватит ли на вкладке полей для всех необходимых данных?


В появившемся окошке выберем тип нового поля. Первым делом надо указать тип данных – выберем 'Dropdown, поскольку нам нужен выпадающий список с перечнем типов контакта. Тут появится выпадающий список Drop Down List, содержимое которого мы определили ранее в файле custom/include/language/en_us.lang.php. Задайте полю базы данных понятное имя, например, db_communication. Также необходимо определить метку поля. Будьте внимательны: это не текст, который будет отображаться рядом с выпадающим списком, а имя метки так что укажите что-нибудь вроде lbl_communication (текстом мы займемся чуть позже). Поставим галочку Mass Update' – это позволит нам вносить изменения не по одному, а все сразу.

Сразу после нажатия кнопки Сохранить (Save) в списке доступны компонентов в левой части экрана появится новое поле. Добавим в форму несколько пустых строк с помощью кнопки Добавить строки (Add Rows) и перетащим кнопку со списком в любое удобное место на форме. Затем еще раз нажмем кнопку Сохранить (Save) и получим возможность изменить текст таблицы (область для редактирования помечена «карандашиком»). Наконец, нажимаем кнопку Сохранить и опубликовать (Save And Publish). Готово. Теперь можно зайти на вкладку Календарь (Calendar tab), открыть список контактов и убедиться в том, что тип контакта теперь можно выбирать из списка. Полегчало.

Конечно, добавление новых элементов управления на вкладки – дело хорошее, но у вас могут оставаться задачи, совершенно не учтенные в SugarCRM. Пора задуматься о добавлении новых модулей Как вы помните, каждый модуль SugarCRM предназначен для решения конкретной задачи – Управление счетами (Accounts), Перспективы (Opportunities), Проекты (Projects) и т.д. Соответственно, для решения конкретной задачи в нашей организации потребуется собственный модуль.

Прелести именования

Модуль – это всего лишь каталог на вашем web-сервере, содержащий PHP-скрипты. Поэтому первым делом нужно создать новый каталог. Но как же его назвать? Для начала посмотрим, какие модули уже установлены:

Скорая помощь

Прежде чем писать собственный модуль, проверьте может быть, такой уже есть на сайте http://www.sugarforge.org

bainm@acamas:/www/SugarOS-Full-4.5.1$ ls modules
Accounts
ACL
ACLActions
ACLRoles
Activities
Administration
Audit
BeanDictionary.php
Bugs
Calendar
Calls
CampaignLog
Campaigns
...

Я привел лишь начало списка, но нетрудно заметить, что названия модулей SugarCRM либо используют терминологию из области продаж и сервиса (что вполне понятно), либо как-то связаны с выполняемой функцией (тоже понятно). Так бы и нам надо сделать, хотя и не совсем Имя и вправду должно быть разумным, но не мешает заранее исклю чить накладки при обновлениях программы.

Например, в более ранней версии SugarCRM 3.5.1 список модулей выглядел бы по-другому:

bainm@acamas:/www/SugarSuite-3.5.1$ ls modules
Accounts
Activities
Administration
Audit
BeanDictionary.php
Bugs
Calendar
Calls
Campaigns
Cases
...

И если бы мы добавили модуль ‘CampaignLog’ в этой версии программы, а потом обновили бы ее до 4.5.1, то напоролись бы на его тезку. Следовательно, нужно выбрать название каталога таким образом, чтобы вероятность конфликта была минимальной. Вряд ли когданибудь появится отдельный модуль для журнала, даже такого известного, как Linux Format – вот вам и имя :

 mkdir modules/LXF

Мы потратили кучу времени на такую простую задачу, как создание каталога. Однако правильный подход к этому делу избавит нас от неприятностей в будущем.

Наконец, мы разобрались с именем каталога и создали его. оповестим SugarCRM, что в его полку модулей прибыло. Для этого добавим в конец файла include/modules.php следующую строку:

$moduleList[] = ‘LXF’;

Строку можно вставить в любое место файла, но я рекомендовал бы именно добавить ее в конец: потом проще будет ее найти.

Тип контакта

Добавление нового поля («Тип контакта» в левом верхнем углу) займет всего пару минут, причем без всякого программирования.


Теперь мы должны сообщить SugarCRM еще кое-какую информацию о нашем модуле. Во-первых, нужен заголовок для соответствующей модулю вкладки. В прошлый раз мы уже занимались переименованием существующих вкладок, редактируя файл custom/include/language/en_us.lang.php – достаточно добавить в него новую строку для нашего модуля:

 $app_list_strings[‘moduleList’][‘LXF’] = ‘LXF’;

Наконец, нужно создать три файла. Их содержание сейчас безразлично – пусть будут хоть пустыми, лишь бы были (иначе вы не оберетесь ошибок). Чтобы модуль ожил и заработал, выполним команды

 touch modules/LXF/Forms.php
 touch modules/LXF/language/en_us.lang.php
 touch modules/LXF/index.php

Попробуем открыть созданный модуль SugarCRM в web-браузере; если приложение уже открыто, просто обновите страничку. Должна появиться вкладка LXF. Выбрав ее, вы увидите… да ничего не увидите. Вкладка пуста. Оно и понятно: ведь мы еще не определили, что будет делать этот модуль. Этим сейчас и займемся.

Задать модулю работу

Вы наверняка уже догадались, что дальше мы будем работать с файлом modules/LXF/index.php. Начнем с добавки в него чего-нибудь простенького:

 <?php
 function test_print () {
 echo ‘Hello Mum’;
 }
 test_print();
 ?>

Не особо оригинально, но по крайней мере, обновив страничку в браузере, мы увидим, что запросто смогли отобразить необходимую информацию на вкладке.

Сделаем ее поинтереснее. Так как наш интерес — настройка SugarCRM, хорошо бы модуль просмотрел базу данных приложения. Начнем с функции, которая выводит список таблиц базы данных:

 function show_tables () {
 global $sugar_config;

Выражение global обеспечивает доступ к глобальной переменной $sugar_config внутри функции. А что такое $sugar_config? Это массив, содержащий все настройки SugarCRM, которые определены в файле config.php в каталоге программы. Нам нужны настройки для соединения с базой данных, их можно, получить, например, таким образом:

$username=$sugar_config[‘dbconfig’][‘db_user_name’];
$password=$sugar_config[‘dbconfig’][‘db_password’];
$database=$sugar_config[‘dbconfig’][‘db_name’];

Затем мы можем установить соединение с базой данных:

$db = mysql_connect(localhost,$username,$password);
mysql_select_db($database) or die( “Unable to select database”);

После установки соединения можно выполнить запрос к базе данных, в данном случае, получение списка таблиц:

$query=”show tables”;
$result=mysql_query($query);

Добавим цикл для вывода на экран названий таблиц:

Скорая помощь

По умолчанию выход пользователя из приложения SugarCRM происходит через 1 440 секунд (24 минуты) простоя. Если вам это неудобно, измените переменную session.gc_maxlifetime в файле /etc/php4/apache2/php.ini. Не забудьте перезапустить Apache.

 
  echo<table width=100% cellspacing=0 cellpadding=0>;
  $r=0;
  while ($r < mysql_numrows($result)) {
    $tablename = mysql_result($result,$r);
    echo<tr><td>$tablename</td></tr>;
    $r++;
  }
  echo</table>;

Наконец, хорошим тоном будет закрыть соединение с базой данных:

mysql_close($db);
}

Функция создана — можно ее вызывать:

show_tables();

Результатом ее работы станет появление на экране списка из 92 таблиц. Занятно, но хотелось бы по щелчку на ссылке получать и описание конкретной таблицы. Для этого изменим определение функции на следующее:

  function show_tables ($table, $table_action) {

Теперь можно передать в функцию параметр $table, определяющий вид запроса. Заменим строку запроса

 $query=”show tables”;

на следующие:

  if ($table && $table_action==desc) {
  $query=desc $table”;
  } else {
  $query=show tables;
  }

То, что выводится на экран, должно зависеть от значения $table. Поэтому код

  while ($r < mysql_numrows($result)) {
    $table=mysql_result($result,$r);
    echo<tr><td>$tablename</td></tr>;
    $r++;
  }

превратится в

  while ($r < mysql_numrows($result)) {
      if ($table && $table_action==”desc”) {
          $field = mysql_result($result,$r,0);
          $type = mysql_result($result,$r,1);
          $null = mysql_result($result,$r,2);
          $key = mysql_result($result,$r,3);
          $default = mysql_result($result,$r,4);
          $extra = mysql_result($result,$r,5);
          echo<tr><td>$field</td><td>$type</td><td>$null</td><td>$key</td><td>$default</td><td>$extra</td>;
          echo</tr>;
  } else {
         $tablename = mysql_result($result,$r);
         echo<td><a href=index.php?module=LXF&action=index&table=$table_name&table_action=desc>
         View data definition for $tablename</a></td>;
          echo</tr>;
      }
      $r++;
  }

Легко видеть, что вывод может быть разным. Если переменная $table не определена, на экране отображается полный список таблиц базы данных. В противном случае, отображается описание конкретной таблицы.

Новый модуль

Новый модуль ‘LXF’ в ожидании дальнейших действий.

Приведенный код также дает представление о том, как модулям SugarCRM передается информация. Файл index.php, находящийся в каталоге SugarCRM, формирует интерфейс пользователя SugarCRM. Этот файл принимает два главных параметра:

  • module Имя модуля.
  • action Имя PHP-файла, вызываемого из каталога модуля.

Вы можете передать ему и другую информацию. Для получения списка таблиц я использовал следующий URL (‘acamas’ — название моего веб-сервера)

http://acamas/SugarOS-Full-4.5.1/index.php?module=LXF&action=index

а для получения описания таблицы, например, cases, следующий URL:

http://acamas/SugarOS-Full-4.5.1/index.php?module=LXF&action=index&table=cases&table_action=desc

Наконец, подправим наш код, чтобы он был в курсе параметров, переданных модулю:

 show_tables($_REQUEST[‘table’], $_REQUEST[‘table_action’]);

Войдя во вкус, вы захотите увидеть еще и содержимое таблиц; зна- чит, код опять придется немного изменить. Во-первых, добавим ссылку, которая передаст необходимую информацию модулю. Вот она:

  echo<td><a href=index.php?module=LXF&action=index&table=$table
  name&table_action=contents>Table contents</a></td>;

Затем добавим немного кода SQL для получения содержимого таблиц:

 if ($table && $table_action==”desc”) {
    $query=”desc $table;
 } elseif ($table && $table_action==”contents”) {
    $query=”select * from $table;
 } else {
    $query=”show tables”;
 }

и обработаем полученную информацию:

 while ($r < mysql_numrows($result)) {
    Здесь менять нечего, а вот дальше уже интереснее.
 } elseif ($table && $table_action==”contents”) {
    echo<tr>;
    $c=0;
    while ($c < mysql_num_fields($result)) {
       $field=mysql_result($result,$r,$c);
       echo<td>$field</td>;
       $c++;
    }
    echo<tr>;
 } else {

Вы заметили, что получение данных таблицы происходит не совсем так, как ее описания. Здесь только 6 полей (они пронумерованы от 0 до 5), а SQL-запрос возвращает произвольное их количество, и это нужно учесть.

Вы недоумеваете, зачем нужно было создавать вкладку для отображения содержимого таблиц? (Вообще-то пользователям лучше даже не подозревать о базе данных). Дело в том, что она поможет вам создавать отчеты для ваших пользователей.

Генератор отчетов

Чтобы пояснить то, что я имею в виду, давайте создадим отчет, который будет содержать информацию по всем открытым сделкам (cases). Достаточно будет изменить текст SQL-запроса примерно таким образом:

 } elseif ($report==”case_user_report”) {
    $query=”select c.case_number, c.name, a.name, concat(u.first_
 name, concat(‘ ‘,u.last_name))
 from cases c, users u, accounts a
 where u.id = c.assigned_user_id
 and a.id = c.account_id
 and c.status <> ‘Closed’”;

Теперь мы должны обработать результат. У нас уже есть подходящий код для обработки запроса выборки, остается только задействовать его и для отчетов:

  } elseif ($report || ($table && $table_action==”contents”)) {

Доделайте работу сами (хотя весь код этого примера есть на диске). А когда закончите, сможете просмотреть отчет, используя следующий URL (не забудьте передать в функцию параметр ‘report’, а внутри функции прочитать его, используя $_REQUEST[‘report’]): http://acamas/SugarOS-Full-4.5.1/index.php?module=LXF&action=index&report=case_user_report

Все работает, хотя URL довольно неуклюжий. Гораздо удобнее использовать специальную ссылку.

Разбираемся со ссылками

С левой стороны вкладки нашего модуля расположена панель ссылок. Пока на ней ничего нет, кроме заголовка Shortcuts (Ссылки). Постараемся, чтобы от нее была польза.

Для этого создадим файл Menu.php в каталоге модуля (то есть modules/LXF/Menu.php). Этот массив массивов. Каждый его подмассив содержит собственно ссылку и текст, который будет отображаться на экране. Например:

  <?php
  $module_menu = Array(Array(“index.php?module=LXF&action=index&report=case_ user_report”,Case Report’),);
  ?>

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

Итак, мы полностью настроили SugarCRM в соответствии с потребностями пользователей. Или не полностью? Но все равно, у нас есть все необходимое для дальнейшего расширения пользовательской функциональности. Счастливых настроек! LXF

Собственный модуль

Цель нашего урока: собственный полностью функциональный модуль

Персональные инструменты
купить
подписаться
Яндекс.Метрика