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

LXF92:SugarCRM

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Новая: : '''Рафинированный SugarCRM''' Ставим и настраиваем открытую CRM-систему ==SugarCRM: Как добавить модули== : ЧАСТЬ...)
 
(Разбираемся со ссылками)
 
(не показаны 8 промежуточных версий 1 участника)
Строка 1: Строка 1:
 +
[[Категория:Учебники]]
 +
{{Цикл/SugarCRM}}
 
: '''Рафинированный SugarCRM''' Ставим и настраиваем открытую CRM-систему
 
: '''Рафинированный SugarCRM''' Ставим и настраиваем открытую CRM-систему
  
Строка 23: Строка 25:
 
с типами используемых контактов:
 
с типами используемых контактов:
  
<code>
+
<source lang=php>
 
  $app_list_strings[‘cmb_communication’] = array (
 
  $app_list_strings[‘cmb_communication’] = array (
 
  ‘TEL’ => ‘Telephone’,
 
  ‘TEL’ => ‘Telephone’,
 
  ‘MSN’ => ‘MSN’,
 
  ‘MSN’ => ‘MSN’,
 
  );
 
  );
</code>
+
</source>
  
 
Нетрудно видеть, что это массив, состоящий из:
 
Нетрудно видеть, что это массив, состоящий из:
Строка 169: Строка 171:
 
делать этот модуль. Этим сейчас и займемся.
 
делать этот модуль. Этим сейчас и займемся.
  
===Задать модулю работу===
+
=== Задать модулю работу ===
  
 
Вы наверняка уже догадались, что дальше мы будем работать с
 
Вы наверняка уже догадались, что дальше мы будем работать с
Строка 175: Строка 177:
 
простенького:
 
простенького:
  
<code>
+
<source lang=php>
 
  <?php
 
  <?php
 
  function test_print () {
 
  function test_print () {
Строка 182: Строка 184:
 
  test_print();
 
  test_print();
 
  ?>
 
  ?>
</code>
+
</source>
  
 
Не особо оригинально, но по крайней мере, обновив страничку в
 
Не особо оригинально, но по крайней мере, обновив страничку в
Строка 188: Строка 190:
 
информацию на вкладке.
 
информацию на вкладке.
  
Сделаем ее поинтереснее. Так как наш интерес настройка
+
Сделаем ее поинтереснее. Так как наш интерес настройка
 
''SugarCRM'', хорошо бы модуль просмотрел базу данных приложения.
 
''SugarCRM'', хорошо бы модуль просмотрел базу данных приложения.
 
Начнем с функции, которая выводит список таблиц базы данных:
 
Начнем с функции, которая выводит список таблиц базы данных:
  
<code>
+
<source lang=php>
 
  function show_tables () {
 
  function show_tables () {
 
  global $sugar_config;
 
  global $sugar_config;
</code>
+
</source>
  
 
Выражение '''global''' обеспечивает доступ к глобальной переменной
 
Выражение '''global''' обеспечивает доступ к глобальной переменной
Строка 229: Строка 231:
 
|Ширина=200px}}
 
|Ширина=200px}}
  
<code>
+
<source lang=php>
 
   echo “<table width=100% cellspacing=0 cellpadding=0>”;
 
   echo “<table width=100% cellspacing=0 cellpadding=0>”;
 
   $r=0;
 
   $r=0;
Строка 238: Строка 240:
 
   }
 
   }
 
   echo “</table>”;
 
   echo “</table>”;
</code>
+
</source>
  
 
Наконец, хорошим тоном будет закрыть соединение с базой данных:
 
Наконец, хорошим тоном будет закрыть соединение с базой данных:
Строка 247: Строка 249:
 
</code>
 
</code>
  
Функция создана можно ее вызывать:
+
Функция создана можно ее вызывать:
  
 
<code>
 
<code>
Строка 256: Строка 258:
 
таблиц. Занятно, но хотелось бы по щелчку на ссылке получать и описание конкретной таблицы. Для этого изменим определение функции на следующее:
 
таблиц. Занятно, но хотелось бы по щелчку на ссылке получать и описание конкретной таблицы. Для этого изменим определение функции на следующее:
  
<code>
+
<source lang=php>
 
   function show_tables ($table, $table_action) {
 
   function show_tables ($table, $table_action) {
</code>
+
</source>
  
 
Теперь можно передать в функцию параметр '''$table''', определяющий вид запроса. Заменим строку запроса
 
Теперь можно передать в функцию параметр '''$table''', определяющий вид запроса. Заменим строку запроса
Строка 268: Строка 270:
 
на следующие:
 
на следующие:
  
<code>
+
<source lang=mysql>
 
   if ($table && $table_action==”desc”) {
 
   if ($table && $table_action==”desc”) {
 
   $query=”desc $table”;
 
   $query=”desc $table”;
Строка 274: Строка 276:
 
   $query=”show tables”;
 
   $query=”show tables”;
 
   }
 
   }
</code>
+
</source>
  
 
То, что выводится на экран, должно зависеть от значения '''$table'''.
 
То, что выводится на экран, должно зависеть от значения '''$table'''.
 
Поэтому код
 
Поэтому код
  
<code>
+
<source lang=php>
 
   while ($r < mysql_numrows($result)) {
 
   while ($r < mysql_numrows($result)) {
 
     $table=mysql_result($result,$r);
 
     $table=mysql_result($result,$r);
Строка 285: Строка 287:
 
     $r++;
 
     $r++;
 
   }
 
   }
</code>
+
</source>
  
 
превратится в
 
превратится в
  
<code>
+
<source lang=php>
 
   while ($r < mysql_numrows($result)) {
 
   while ($r < mysql_numrows($result)) {
 
       if ($table && $table_action==”desc”) {
 
       if ($table && $table_action==”desc”) {
Строка 308: Строка 310:
 
       $r++;
 
       $r++;
 
   }
 
   }
</code>
+
</source>
  
 
Легко видеть, что вывод может быть разным. Если переменная
 
Легко видеть, что вывод может быть разным. Если переменная
Строка 327: Строка 329:
  
 
Вы можете передать ему и другую информацию. Для получения
 
Вы можете передать ему и другую информацию. Для получения
списка таблиц я использовал следующий URL ('''‘acamas’''' название
+
списка таблиц я использовал следующий URL ('''‘acamas’''' название
 
моего веб-сервера)
 
моего веб-сервера)
  
Строка 346: Строка 348:
 
чит, код опять придется немного изменить. Во-первых, добавим ссылку, которая передаст необходимую информацию модулю. Вот она:
 
чит, код опять придется немного изменить. Во-первых, добавим ссылку, которая передаст необходимую информацию модулю. Вот она:
  
<code>
+
<source lang=php>
 
   echo “<td><a href=index.php?module=LXF&action=index&table=$table
 
   echo “<td><a href=index.php?module=LXF&action=index&table=$table
 
   name&table_action=contents>Table contents</a></td>”;
 
   name&table_action=contents>Table contents</a></td>”;
</code>
+
</source>
  
 
Затем добавим немного кода SQL для получения содержимого таблиц:
 
Затем добавим немного кода SQL для получения содержимого таблиц:
  
<code>
+
<source lang=php>
 
  if ($table && $table_action==”desc”) {
 
  if ($table && $table_action==”desc”) {
 
     $query=”desc $table”;
 
     $query=”desc $table”;
Строка 361: Строка 363:
 
     $query=”show tables”;
 
     $query=”show tables”;
 
  }
 
  }
</code>
+
</source>
  
 
и обработаем полученную информацию:
 
и обработаем полученную информацию:
  
<code>
+
<source lang=php>
 
  while ($r < mysql_numrows($result)) {
 
  while ($r < mysql_numrows($result)) {
 
     Здесь менять нечего, а вот дальше уже интереснее.
 
     Здесь менять нечего, а вот дальше уже интереснее.
Строка 378: Строка 380:
 
     echo “<tr>”;
 
     echo “<tr>”;
 
  } else {
 
  } else {
</code>
+
</source>
  
 
Вы заметили, что получение данных таблицы происходит не совсем
 
Вы заметили, что получение данных таблицы происходит не совсем
Строка 395: Строка 397:
 
образом:
 
образом:
  
<code>
+
<source lang=php>
 
  } elseif ($report==”case_user_report”) {
 
  } elseif ($report==”case_user_report”) {
 
     $query=”select c.case_number, c.name, a.name, concat(u.first_
 
     $query=”select c.case_number, c.name, a.name, concat(u.first_
Строка 403: Строка 405:
 
  and a.id = c.account_id
 
  and a.id = c.account_id
 
  and c.status <> ‘Closed’”;
 
  and c.status <> ‘Closed’”;
</code>
+
</source>
  
 
Теперь мы должны обработать результат. У нас уже есть подходящий код для обработки запроса выборки, остается только задействовать его и для отчетов:
 
Теперь мы должны обработать результат. У нас уже есть подходящий код для обработки запроса выборки, остается только задействовать его и для отчетов:
  
<code>
+
<source lang=php>
 
   } elseif ($report || ($table && $table_action==”contents”)) {
 
   } elseif ($report || ($table && $table_action==”contents”)) {
>/code>
+
</source>
  
 
Доделайте работу сами (хотя весь код этого примера есть на диске).
 
Доделайте работу сами (хотя весь код этого примера есть на диске).
 
А когда закончите, сможете просмотреть отчет, используя следующий
 
А когда закончите, сможете просмотреть отчет, используя следующий
 
URL (не забудьте передать в функцию параметр '''‘report’''', а внутри функции прочитать его, используя '''$_REQUEST[‘report’]'''):
 
URL (не забудьте передать в функцию параметр '''‘report’''', а внутри функции прочитать его, используя '''$_REQUEST[‘report’]'''):
http://acamas/SugarOS-Full-4.5.1/index.php?module=LXF&action =index&report=case_user_report
+
http://acamas/SugarOS-Full-4.5.1/index.php?module=LXF&action=index&report=case_user_report
  
 
Все работает, хотя URL довольно неуклюжий. Гораздо удобнее использовать специальную ссылку.
 
Все работает, хотя URL довольно неуклюжий. Гораздо удобнее использовать специальную ссылку.
Строка 420: Строка 422:
 
===Разбираемся со ссылками===
 
===Разбираемся со ссылками===
  
С левой стороны вкладки нашего модуля расположена панель
+
С левой стороны вкладки нашего модуля расположена панель
 
ссылок. Пока на ней ничего нет, кроме заголовка '''Shortcuts''' ('''Ссылки''').
 
ссылок. Пока на ней ничего нет, кроме заголовка '''Shortcuts''' ('''Ссылки''').
 
Постараемся, чтобы от нее была польза.
 
Постараемся, чтобы от нее была польза.
Строка 429: Строка 431:
 
экране. Например:
 
экране. Например:
  
<code>
+
<source lang=php>
 
   <?php
 
   <?php
 
   $module_menu = Array(Array(“index.php?module=LXF&action=index&report=case_ user_report”, ‘Case Report’),);
 
   $module_menu = Array(Array(“index.php?module=LXF&action=index&report=case_ user_report”, ‘Case Report’),);
 
   ?>
 
   ?>
</code>
+
</source>
  
 
Сохраните этот файл и обновите страничку в браузере. Теперь можно обращаться к генератору отчетов по ссылке.
 
Сохраните этот файл и обновите страничку в браузере. Теперь можно обращаться к генератору отчетов по ссылке.

Текущая версия на 11:08, 24 ноября 2008


Рафинированный 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-скрипты. Поэтому первым делом нужно создать новый каталог. Но как же его назвать? Для начала посмотрим, какие модули уже установлены:


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);

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


 
  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

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

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

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