Вставка и настройка плагинов

В этой статье:

Подключение плагина в настольном приложении

Подключение плагина в веб-приложении

Структура js-скрипта плагина

Плагины - это модули, подключаемые к аналитической панели и используемые для расширения её возможностей. В настольном приложении плагины создаются в качестве модулей, написанных на языке программирования Fore. В веб-приложении для создания плагинов используется JavaScript.

Для вставки плагина:

  1. Подключите плагин к аналитической панели в настольном и/или в веб-приложении.

  2. Выполните одно из действий в аналитической панели:

После выполнения действий плагин будет вставлен в аналитическую панель отдельным объектом. Для плагинов доступны все операции с объектами, приведенные в разделе «Построение аналитической панели». Если плагин поддерживает работу с источниками данных, то для него также доступен выбор источника данных.

Выбор источника данных

В веб-приложении доступно подключение следующего плагина:

Подключение плагина в настольном приложении

Для подключения плагина к аналитической панели в настольном приложении:

  1. Создайте форму-визуализатор. Данная форма содержит компоненты, образующие внешний вид плагина, и код, описывающий логику работы компонентов в плагине. Форма-визуализатор должна наследоваться от класса AdhocUserViewForm. Особенности кода формы-визуализатора:

  2. Создайте форму-мастер. Данная форма содержит компоненты, образующие вкладки боковой панели для настройки плагина, и код, описывающий логику применения настроек к плагину. Форма-мастер должна наследоваться от класса AdhocUserMasterForm.

  1. Зарегистрируйте плагин в сервисах. Регистрация плагина осуществляется в среде разработки на языке программирования Fore или Fore.NET с помощью свойства ISharedPluginsContainer.Plugins.

Добавьте ссылки на системные сборки Metabase, Fore (KeFore для Fore.NET) и выполните модуль:

Sub UserProc;
Var
    mb: IMetabase;
    plugins: ISharedPlugins;
    cont: ISharedPluginsContainer;
    adhoc_plugs: ISharedAdhocPlugins;
    plugin: ISharedAdhocPlugin;

Begin
    
// Получим объект для работы с текущим репозиторием
    mb := MetabaseClass.Active;
    
// Получим объект для работы с контейнером плагинов
    cont := mb.SpecialObject(MetabaseSpecialObject.SharedParams).Edit As ISharedPluginsContainer;
    
// Получим объект для работы с плагинами
    plugins := cont.Plugins;
    
// Получим коллекцию плагинов инструмента "Аналитические панели"
    adhoc_plugs := plugins.AdhocPlugins;
    
// Создадим новый плагин
    plugin := plugins.AdhocPlugins.Add;
    
// Зададим идентификатор и наименование плагина
    plugin.Id := 
"ID"// Вместо "ID" укажите уникальный идентификатор плагина в верхнем регистре, совпадающий с идентификатором в структуре js-скрипта плагина
    plugin.Name := "name"// Вместо "name" укажите имя плагина, которое будет отображаться в аналитической панели
    // Зададим форму-визуализатор и форму-мастер
    plugin.ViewForm := mb.ItemById("ViewForm_Id"); // Вместо "ViewForm_Id" укажите идентификатор формы-визуализатора
    plugin.MasterForm := mb.ItemById("MasterForm_Id"); // Вместо "MasterForm_Id" укажите идентификатор формы-мастера
    // Сохраним созданный плагин
    (cont As IMetabaseObject).Save;
End Sub UserProc;

Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.KeFore;

Public Shared Sub Main(Params: StartParams);
Var
    mb: IMetabase;
    plugins: ISharedPlugins;
    cont: ISharedPluginsContainer;
    adhoc_plugs: ISharedAdhocPlugins;
    plugin: ISharedAdhocPlugin;

Begin
    
// Получим объект для работы с текущим репозиторием
    mb := Params.Metabase;
    
// Получим объект для работы с контейнером плагинов
    cont := mb.SpecialObject[MetabaseSpecialObject.msoSharedParams].Edit() As ISharedPluginsContainer;
    
// Получим объект для работы с плагинами
    plugins := cont.Plugins;
    
// Получим коллекцию плагинов инструмента "Аналитические панели"
    adhoc_plugs := plugins.AdhocPlugins;
    
// Создадим новый плагин
    plugin := plugins.AdhocPlugins.Add();
    
// Зададим идентификатор и наименование плагина
    plugin.Id := "ID"// Вместо "ID" укажите уникальный идентификатор плагина в верхнем регистре, совпадающий с идентификатором в структуре js-скрипта плагина
    plugin.Name := "name"// Вместо "name" укажите имя плагина, которое будет отображаться в аналитической панели
    // Зададим форму-визуализатор и форму-мастер
    plugin.ViewForm := mb.ItemById("ViewForm_Id"); // Вместо "ViewForm_Id" укажите идентификатор формы-визуализатора
    plugin.MasterForm := mb.ItemById("MasterForm_Id"); // Вместо "MasterForm_Id" укажите идентификатор формы-мастера
    // Сохраним созданный плагин
    (cont As IMetabaseObject).Save();
End Sub;

После выполнения модуля плагин будет зарегистрирован в сервисах и доступен для вставки в аналитическую панель.

После выполнения действий плагин будет создан в навигаторе объектов в качестве формы-визуализатора и формы-модуля, зарегистрирован в общих ресурсах и доступен для вставки в аналитическую панель в настольном приложении.

Подключение плагина в веб-приложении

Для подключения плагина к аналитической панели в веб-приложении:

  1. Создайте *.js файл плагина с учетом структуры js-скрипта.

  2. Добавьте плагин *.js в корневую папку веб-приложения, например, C:\Program Files (x86)\Foresight\Foresight Analytics Platform 9 Web Application\plugins.

  3. Подключите плагин одним из способов:

Подключение плагина через репозиторий

Подключение плагина через файл PP.xml

После выполнения действий при открытии аналитической панели в веб-приложении будет выполняться автономная регистрация плагина. Плагин будет доступен для вставки в аналитическую панель.

При разработке веб-приложения с помощью DHTML-компонентов для подключения плагина через репозиторий используйте конструктор KapBox или метод Kap.regPluginBlock, используемый в качестве отдельного способа подключения плагина.

Структура js-скрипта плагина

При написании плагина и новых классов придерживайтесь рекомендаций по написанию кода.

Структура js-скрипта плагина:

// Зададим блок регистрации
(function ()
{
  if (window.Kap)
  {
    Kap.regPluginBlock({
      Id: "MyLabel",  //id, по которому происходит связка плагин-блока с его реализацией
      Name: "MyLabelText",  //наименование типа блока
      View: "PP.Ui.Dashboard.MyLabel",  //класс визуализатора или имя класса визуализатора
      Icon: "../build/img/app/MainIcon.png",  //путь к пиктограмме (16*16) для плагина, необязательный параметр
      SourceClass: PP.Mb.MetabaseObjectClass.KE_CLASS_EXPRESSREPORT, // тип или код класса источника данных
      Js: "../plugins/MyLabel.js",  //для динамической загрузки скрипта с реализацией плагина, обязательный параметр
      Master: "PP.Ui.MyMaster",  //класс мастера или имя класса мастера
      Props: {  // дополнительные параметры плагина для установки значений по умолчанию, необязательный параметр
        pluginProps: {}
      }
    });
  }
})();
 
if (!PP.Ui.MyLabel)
{
  PP.Ui.MyLabel = {};
  PP.initNamespace(PP.Ui.MyLabel, "PP.Ui.MyLabel");
}
 
// Создадим прототип своего визуализатора для регистрируемого блока
PP.Ui.MyLabel = function(settings) {
  this._Source = null;
  this._bgFlag = false;
  this.PropertyChanged = new PP.Delegate();
  this.Refreshed = new PP.Delegate();
  PP.Ui.MyLabel.base.constructor.apply(this, arguments);
  this.setContent("MyLabelText");
};
PP.initClass(PP.Ui.MyLabel, PP.Ui.Label, "PP.Ui.MyLabel");
 
PP.Ui.MyLabel.prototype._propertyChangedFire = function () {
  this.PropertyChanged.fire(this);
};
 
PP.Ui.MyLabel.prototype._refreshedFire = function () {
  console.log("My Label Refreshed");
  this.Refreshed.fire(this);
};
 
// Если плагин должен поддерживать работу с источником данных, то
// установим источник визуализатору, который открыт в аналитической панели
PP.Ui.MyLabel.prototype.setSource = function(source) {
  this._Source = source;
  this.setContent("Source loaded: " + this._Source.getId());
  this._refreshedFire();
};
 
// Если плагин должен поддерживать хранимые свойства зададим методы setProps и getProps
PP.Ui.MyLabel.prototype.setProps = function(value) {  // метод установки хранимых свойств блока
  if (value) {
    var props = JSON.parse(value);
    this._bgFlag = props.bgFlag ? props.bgFlag : false;
  } else {
    this._bgFlag = false;
  }
  this.refresh();
};
 
PP.Ui.MyLabel.prototype.getProps = function() {  //метод, предоставляющий аналитической панели свойства для сохранения
  var props = {
    bgFlag: this._bgFlag
  };
  return JSON.stringify(props);
};
 
PP.Ui.MyLabel.prototype.refresh = function() {
  this._DomNode.style.backgroundColor = this._bgFlag ? "green" : "transparent";
  this._refreshedFire();
};
 
PP.Ui.MyLabel.prototype.refreshAll = function () {  // метод вызывается при обновлении блока с отчётом
};
 
PP.Ui.MyLabel.prototype.setWidth = function () {
  if (this._Instance)   this._redraw();
};
 
PP.Ui.MyLabel.prototype.setHeight = function () {
  if (this._Instance)   this._redraw();
};
 
// Если плагин должен иметь собственное контекстное меню зададим метод getContextMenu
PP.Ui.MyLabel.prototype.getContextMenu = function() {
  var _DataView = this;
  var menu = new PP.Ui.Menu({
    Items : [ {
      MenuItem : {
        Id : "pluginMenuItem",
        Content : "plugin menu item",
        Checked : _DataView._bgFlag,
        CheckedChanged : function(sender, args) {
          _DataView._bgFlag = sender.getChecked();
          _DataView.refresh();
        }
      }
    }]
  });
  return menu;
};
 
// Создадим прототип мастера для регистрируемого блока
PP.Ui.MyMaster = function(settings) {
  this._DataView;
  PP.Ui.MyMaster.base.constructor.apply(this, arguments);
  var myPanel = new PP.Ui.MasterPanel(
  {
    Id: "MyPluginMaster",
    ViewType: PP.Ui.NavigationItem,
    Content: "Plugin settings...",
    Title: "My plugin master"
  });
  myPanel.getHeaderControl().CheckedChanged.add(this._onPropsChanged, this);
  this.addMasterPanel(myPanel);
};
PP.initClass(PP.Ui.MyMaster, PP.Ui.Master, "PP.Ui.MyMaster");
 
// Если для плагина должны отображаться дополнительные вкладки боковой панели, содержащие его настройки,
// то зададим реализацию метода setDataView(view), где view - это экземпляр визуализатора плагина.
// Дополнительно зададим свойство Master в блоке регистрации
PP.Ui.MyMaster.prototype.setDataView = function(view) {
  this._DataView = view;
  for (var i = 0; i < this.getItems().length; i++) {
    var item = this.getItem(i);
    if (item.getId() === "MyPluginMaster") {
      item.setTitle("My plugin master. Data view type: " + view.getTypeName());
      if (view._bgFlag) {
        item.getHeaderControl().setChecked(view._bgFlag, false);
      }
    }
  }
};
 
PP.Ui.MyMaster.prototype._onPropsChanged = function(sender, args) {
  this._DataView._bgFlag = args.CheckedState;
  this._DataView._propertyChangedFire();
  this._DataView.refresh();
};

Ниже приведены примеры методов и функций, входящих в структуру js-скрипта плагина, которые могут быть использованы для решения следующих задач:

Построение плагина, источником данных которого является отчёт

Получение данных визуализатора в плагине, источником данных которого является отчёт

Получение отметки измерения в плагине, источником данных которого является экспресс-отчёт

Настройка синхронизации измерений источника данных плагина с источниками данных других объектов

Выполнение Fore-функции в плагине и получение результата выполнения в консоли браузера

См. также:

Построение аналитической панели