В данном материале речь пойдет о широко известной 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, компании «Инфосистемы Джет»

