Вопрос

BPMOnline 7. Добавление свой пункт в меню "Действия" карточки задачи

Добрый день!

Необходимо добавить свой пункт в меню "Действия" карточки задачи и написать обработчик события нажатия. Как это можно сделать?

P.S.: информацию по добавлению действия в раздел кое какую нашел, а вот в карточку - нет.

У меня такой же вопрос

17 комментариев

Александр, здравствуйте.

В приложении инструкция по созданию действия для стандартного раздела.

Елена, ну я же специально уточнил и скриншот приложил: мне нужно добавить действие НЕ В РАЗДЕЛ, А В КАРТОЧКУ.

Александр,

Принцип добавления действия в карточку раздела аналогичен принципу добавления действия в раздел. Разница только в схемах, в которые добавляется код обработчика. Для добавления действия в раздел обработчик добавляется в схему [Название_объекта_раздела]Section. Если необходимо добавить действие в карточку раздела - изменяется схема [Название_объекта_раздела]Page.
В вашем случае необходимо создать замещающий модуль для страницы ActivityPage и добавить в него код обработчика.

В приложении инструкция по добавлению действия, в которой добавлено описание кейса по добавлению действия в карточку раздела.

Елена,

с добавлением действия справился. Теперь встал вопрос: как из кода обработчика нажатия на кнопку в разделе "Действия" получить доступ к данным на деталях, например к списку файлов?

P.S.: данные с самой карточки получаются легко согласно статье, а вот для деталей аналогичного не нашел.

Александр,

через объект получить доступ к деталям не получится. Можно использовать select и получить данные из базы данных. Например так:

var selectFilevar = 
        new Select(UserConnection)
        .Column("Name")
        .From("ActivityFilel")
        .Where("ActivityId").IsEqual(activity.Id)

Андрей,

все бы хорошо, но вот незадача: ActivityPage - это js-страница. Поэтому, чтобы ее переопределить, приходится писать на js. Код:

this.methods.showAvtivityInfo = function() {
   var activityTitle = this.get("Id");
   var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
    rootSchemaName: 'ActivityFile'
   });
   esq.addColumn('Id');
   esq.addColumn('Name');
   esq.addColumn('ActivityId');
   /*var filters = esq.filters;
   var filterNameActivityId = 'ActivityId';
   var filterActivityId = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
    'ActivityId', activityTitle);
   filters.add(filterNameActivityId, filterActivityId);*/
   esq.getEntityCollection(function(result) {
    var collection = result.collection;
    if (collection && collection.collection.length > 0) {
     var item = collection.collection.items[0].values;
     this.showInformationDialog(activityTitle);
    }
   }, this);
  };

Exception выходит на строке

esq.addColumn('ActivityId');

Текст exception: [17:51:16.813] uncaught exception: -;5<5=B :>;;5:F88 A 8<5=5< ActivityId =5 =0945=

P.S.: Поля 'ID' и 'Name' отрабатывают корректно.

Александр, у Вас опечатка:

this.methods.showAvtivityInfo = function() {

Должно быть showActivityInfo.

Попробуйте использовать Select(UserConnection), как я описывал выше.

Андрей,

опечатка не существенна, потому что я вызывал функцию ниже именно по этому имени. Сейчас поменял - не помогло.
Вы описали Select(UserConnection), это применимо для C# кода, в JS коде получаем ожидаемую ошибку.
1. При сохранении (во вложении)
2. В консоли браузера:
[14:42:41.377] ReferenceError: Select is not defined @ http://stnd-bpm-02:88/0//configuration/30e6e6890bd6a8c10768d330b68949d4…

Александр,

прошу прощения, сразу не подумал.
В таком случае, не могли бы Вы скинуть полный код замещающей страницы?

Андрей,

файл во вложении.

Методом тыка и медитированя нашел решение:

esq.addColumn('Activity.Id');

Теперь вопрос в том, как вызвать свой серверный метод?
Видимо нужно использовать DLL либо .NET Managed Assemblies отсюда, но примеров нет:(

Александр, если я правильно понял, то нужно просто дописать

click: {
         bindTo: 'showActivityInfo'
        }

Андрей,
Уверен, Вы меня не правильно поняли. Я получил idшники файлов, круто. Теперь мне нужно вызвать метод, написанный на C#. На сколько я понимаю, мне для этого нужно:
1. Создать проект со сбокой dll в VisualStudio
2. Подключить сборку к dll. Как?
3. Вызвать из js-кода метод из сборки. Как?

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

То есть варианты DLL сборки и .Net Managed сборки не подходят?
Можно тогда инструкцию/пример по написанию сервиса и вызову его из js-кода в Террасофт?

Александр, веб-сервис пишется на любом языке программирования и регистрируется в IIS.
Потом через API сервиса вызывать его методы. Пример запроса к Google с помощью jQuery:

1) Подключить jQuery в зависимые модули нашей страницы редактирования (в примере ProductPage) модуль jQuery.
2) В коде страницы добавить define('ProductPage', ['ext-base', 'terrasoft', 'sandbox', 'jQuery' …..
function(Ext, Terrasoft, sandbox, jQuery ……
3) В обработчик нажатия кнопки добавить следующий код:
var geocodingAPI = "http://maps.googleapis.com/maps/api/geocode/json?address=Россия+Москва&sensor=true";
window.jQuery.getJSON(geocodingAPI, function (json) {
console.log('json : ', JSON.stringify(json));
});

Войдите или зарегистрируйтесь, чтобы комментировать