LXF92:SugarCRM
(→Задать модулю работу) |
|||
Строка 170: | Строка 170: | ||
делать этот модуль. Этим сейчас и займемся. | делать этот модуль. Этим сейчас и займемся. | ||
− | ===Задать модулю работу=== | + | === Задать модулю работу === |
Вы наверняка уже догадались, что дальше мы будем работать с | Вы наверняка уже догадались, что дальше мы будем работать с | ||
Строка 189: | Строка 189: | ||
информацию на вкладке. | информацию на вкладке. | ||
− | Сделаем ее поинтереснее. Так как наш интерес | + | Сделаем ее поинтереснее. Так как наш интерес — настройка |
''SugarCRM'', хорошо бы модуль просмотрел базу данных приложения. | ''SugarCRM'', хорошо бы модуль просмотрел базу данных приложения. | ||
Начнем с функции, которая выводит список таблиц базы данных: | Начнем с функции, которая выводит список таблиц базы данных: | ||
Строка 230: | Строка 230: | ||
|Ширина=200px}} | |Ширина=200px}} | ||
− | <code> | + | <code> |
− | + | <nowiki>echo “<table width=100% cellspacing=0 cellpadding=0>”;</nowiki> | |
$r=0; | $r=0; | ||
while ($r < mysql_numrows($result)) { | while ($r < mysql_numrows($result)) { | ||
Строка 248: | Строка 248: | ||
</code> | </code> | ||
− | Функция создана | + | Функция создана — можно ее вызывать: |
<code> | <code> | ||
Строка 328: | Строка 328: | ||
Вы можете передать ему и другую информацию. Для получения | Вы можете передать ему и другую информацию. Для получения | ||
− | списка таблиц я использовал следующий URL ('''‘acamas’''' | + | списка таблиц я использовал следующий URL ('''‘acamas’''' — название |
моего веб-сервера) | моего веб-сервера) | ||
Версия 07:56, 19 ноября 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-скрипты. Поэтому первым делом нужно создать новый каталог. Но как же его назвать? Для начала посмотрим, какие модули уже установлены:
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
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);
Добавим цикл для вывода на экран названий таблиц:
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
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
Цель нашего урока: собственный полностью функциональный модуль