В данном материале речь пойдет о широко известной CRM-системе c открытым исходным кодом – SuiteCRM. Открытость системы дает безграничные возможности для кастомизации, и, как пример, будет рассмотрен процесс создания динамически подгружаемых справочников из БД с использованием jQuery библиотеки select2.
Select2 может работать как со статическими наборами вариантов выбора, так и получать данные от внешних источников, имеет широко настраиваемые форматы отображения с использованием картинок и т.д. Формат данных представлен в виде JSON, поэтому наша задача разработать такой EntryPoint, чтобы на выходе получилась нужная структура JSON.
В основе SuiteCRM заложена модель MVC, и все действия предполагают обращение к action контроллера. Бывает, что необходимо отступить от стандартного подхода MVC, так как использование обычного MVC-подхода может быть затруднено или просто не нужно.
Создания собственных EntryPoints проходит в два этапа. Первый – регистрация такого EntryPoint через встроенный MVC-фреймворк. Листинг 1 показывает пример регистрации EntryPoint в системе.
Листинг 1.
./custom/Extension/application/Ext/EntryPointRegistry/custom_entry_point_registry.php
Второй этап – создание файла, описывающего непосредственно логику данного EntryPoint (листинг 2).
Листинг 2.
./custom//customEntryPoint.php
После создания этих файлов необходимо выполнить «Quick Repair and Rebuild», после чего перейти по адресу:…index.php?entryPoint=CustomEntryPoint.
Для формирования JSON-объектов можно использовать разный подход, например, json_encode(), но в данном примере рассмотрим простую конкатенацию строк, так как требуется сформировать только часть JSON-объекта.
Листинг 3.
./custom//customEntryPoint.php
Результат работы представлен в листинге 4.
Листинг 4.
index.php?entryPoint=CustomEntryPoint
Теперь необходимо получить эти данные в select2. Пример инициализации представлен в листинг 5
Листинг 5.
На этом все. Теперь на странице должен появится удобный выпадающий список. Не смотря на то, что в данном примере рассмотрена реализация с 5 выпадающими вариантами стадий продаж, такой подход может быть очень удобен при реализации справочников с большими объемами данных, например, КЛАДР и другие.
» Ссылка на библиотеку select2: https://select2.github.io/examples.html
Статья подготовлена Сергеем Ширниным, консультантом Siebel, компании «Инфосистемы Джет»
Select2 может работать как со статическими наборами вариантов выбора, так и получать данные от внешних источников, имеет широко настраиваемые форматы отображения с использованием картинок и т.д. Формат данных представлен в виде JSON, поэтому наша задача разработать такой EntryPoint, чтобы на выходе получилась нужная структура JSON.
В основе SuiteCRM заложена модель MVC, и все действия предполагают обращение к action контроллера. Бывает, что необходимо отступить от стандартного подхода MVC, так как использование обычного MVC-подхода может быть затруднено или просто не нужно.
Создания собственных EntryPoints проходит в два этапа. Первый – регистрация такого EntryPoint через встроенный MVC-фреймворк. Листинг 1 показывает пример регистрации EntryPoint в системе.
Листинг 1.
./custom/Extension/application/Ext/EntryPointRegistry/custom_entry_point_registry.php
<?php
$entry_point_registry['CustomEntryPoint'] = array(
'file' => 'custom/modules/<Module>/customEntryPoint.php',
'auth' => true
);
Второй этап – создание файла, описывающего непосредственно логику данного EntryPoint (листинг 2).
Листинг 2.
./custom//customEntryPoint.php
<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
echo 'Hello World!';
После создания этих файлов необходимо выполнить «Quick Repair and Rebuild», после чего перейти по адресу:
Для формирования JSON-объектов можно использовать разный подход, например, json_encode(), но в данном примере рассмотрим простую конкатенацию строк, так как требуется сформировать только часть JSON-объекта.
Листинг 3.
./custom//customEntryPoint.php
<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
$response = '{"more": "false", "results":[';
$sql = "SELECT stage, name FROM opportunity_stages order by name";
$res = $GLOBALS['db']->query($sql);
if (!$res) {
die('Bad query');
}
while($row = $GLOBALS['db']->fetchByAssoc($res)){
$response .= '{"text":"' . $row["stage"] . '", ' . $row["name"] . '],';
}
$response = rtrim($response, ",");
$response .= ']}';
header('Content-Type: application/json');
echo $response;
Результат работы представлен в листинге 4.
Листинг 4.
index.php?entryPoint=CustomEntryPoint
{
"more": "false",
"results":
[
{"text":"Лид", "id":"1"},
{"text":"Клиент заинтересован", "id":"2"},
{"text":"Подготовка предложения", "id":"3"},
{"text":"Отправка предложения", "id":"4"},
{"text":"Клиент заинтересован", "id":"5"}
]
}
Теперь необходимо получить эти данные в select2. Пример инициализации представлен в листинг 5
Листинг 5.
$('#select').select2({
placeholder: "Выберите стадию продажи",
minimumInputLength: 3,
ajax: {
url: "index.php?entryPoint=CustomEntryPoint",
dataType: 'json',
quietMillis: 250,
data: function (term, page) {
return {
q: term,
};
},
results: function (data, page) {
return { results: data.results };
},
cache: true
},
initSelection: function (element, callback){
var elementValue = $(element).val();
callback({"text":elementValue,"id":$('#select').val()});
},
id: function(object){
return object.text;
},
formatSelection: customFormatSelection,
});
function customFormatSelection(state){
return state.text;
};
На этом все. Теперь на странице должен появится удобный выпадающий список. Не смотря на то, что в данном примере рассмотрена реализация с 5 выпадающими вариантами стадий продаж, такой подход может быть очень удобен при реализации справочников с большими объемами данных, например, КЛАДР и другие.
» Ссылка на библиотеку select2: https://select2.github.io/examples.html
Статья подготовлена Сергеем Ширниным, консультантом Siebel, компании «Инфосистемы Джет»
Поделиться с друзьями
oxidmod
шёл 2016 год… $GLOBALS['db'] и конкатенация строки json…
babylon
Уверен, что всё остальное у них Jet. Главное правильно себя назвать. Бенни отдыхает.
kamilsk
Вы просто не понимаете «the award-winning, enterprise-class»-подхода
https://github.com/salesagility/SuiteCRM/blob/master/pdf.php
https://github.com/salesagility/SuiteCRM/blob/master/download.php
…