В данном материале речь пойдет о широко известной 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

<?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», после чего перейти по адресу: …index.php?entryPoint=CustomEntryPoint.

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

Комментарии (3)


  1. oxidmod
    20.09.2016 14:01
    +1

    шёл 2016 год… $GLOBALS['db'] и конкатенация строки json…


    1. babylon
      20.09.2016 16:22

      Уверен, что всё остальное у них Jet. Главное правильно себя назвать. Бенни отдыхает.


    1. kamilsk
      20.09.2016 16:26

      Вы просто не понимаете «the award-winning, enterprise-class»-подхода

      https://github.com/salesagility/SuiteCRM/blob/master/pdf.php
      https://github.com/salesagility/SuiteCRM/blob/master/download.php