sandbox
Деталь
Передача параметра из детали
Технические вопросы
7.x

Передача значения со страницы детали в страницу проекта. BpmOnline 7.5.

Здравствуйте, коллеги.

1) Нужно передать значение (Id выбранной записи) со страницы детали в страницу проекта, задействованной в бизнес процессе. Я так понял нужно использовать sandbox и messages. Подскажите подробнее как их использовать?

2) Добавил на деталь свою кнопку. Как по нажатию этой кнопки осуществить дальнейшее прохождение страницы проекта по бизнес процессу. Банальный this.acceptProcessElement(); не помогает.

Скриншот во вложении.

Нравится

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

Добрый день!

Посмотрите похожие темы на community. Подобные задачи уже решались.
http://www.community.terrasoft.ru/forum/topic/11626
http://www.community.terrasoft.ru/forum/topic/13314
http://www.community.terrasoft.ru/blogs/12691
http://www.community.terrasoft.ru/forum/topic/10554

Здравствуйте. С первым вопросом разобрался. Удалось передать сообщение по нажатию кнопки. Но это не удобно. Скажите, а можно передать сообщение по событию выделения записи в детали(событие типа onClick)? Функцию получения выделенной строки - this.getActiveRow() нашел. А где прописать событие не разобрался.

И еще вопрос по messages. Как отловить на основной странице, что сообщение из детали пришло? Т.е есть ли такое событие прихода сообщения?

Решил реализовать следующим образом: добавить кнопку в активную строку и по нажатию послать сообщение основной форме. В основной форме отловит сообщение и отправиться дальше по процессу. Что удалось найти:

Нашел на форуме, что можно добавить кнопку в активную строку.
[javascript]
{
"operation": "insert",
"name": "DataGridActiveRowTestAction",
"parentName": "DataGrid",
"propertyName": "activeRowActions",
"values": {
"className": "Terrasoft.Button",
"style": Terrasoft.controls.ButtonEnums.style.BLUE,
"caption": {"bindTo": "Resources.Strings.TestRowButtonCaption"},
"visible": true,
"tag": "call"
}
}
[/javascript]
И потом переопределить метод onActiveRowAction:
[javascript]
onActiveRowAction: function(buttonTag, primaryColumnValue) {
switch (buttonTag) {
// замещение базового метода посылаем сообщение основной странице
case "call":
this.sandbox.publish("GetContactDetailActiveRecordId", this.get("TestParameter"), [this.sandbox.id]);
break;
default:
this.callParent(arguments);
break;
}
},
[/javascript]
Который объявлен в BaseSectionV2 (Базовая схема раздела).

Проблема:
1) при объявлении кнопки выходит сообщение, что DataGrid не является контейнером для других объектов. Подскажите, что делаю не так?

2) Как отловить в основной форме, что пришло сообщение из детали?
За ранее спасибо.

Добрый день!

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

Для начала необходимо в коде карточки и детали добавить адресное сообщение с одним и тем же названием, но в карточке с типом "Подписка", а в детали - с типом "Публикация". Например, для карточки редактирования:

messages: {
"GetContactDetailActiveRecordId": {
mode: Terrasoft.MessageMode.PTP,
direction: Terrasoft.MessageDirectionType.SUBSCRIBE
}
}

Для детали точно так же, только в свойстве direction необходимо указать Terrasoft.MessageDirectionType.PUBLISH.

Далее при инициализации карточки редактирования (метод init) нужно подписаться на это сообщение, а в функции обратного вызова получить значение из детали и сохранить его в атрибут модели карточки:

init: function() {
this.callParent(arguments);
this.sandbox.subscribe("GetContactDetailActiveRecordId", function(recordId) {
this.set("ContactDetailActiveRecordId", recordId);
}, this, [contactDetailSandboxId]);
}

Значение contactDetailSandboxId Вам необходимо определить самостоятельно (оно формируется в зависимости от названия детали). В коде детали оно хранится в свойстве this.sandbox.id.

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

onButtonClick: function() {
this.sandbox.publish("GetContactDetailActiveRecordId", this.get("ActiveRow"), [this.sandbox.id]);
}

Здравствуйте, Олег.
Да, все получилось именно так, спасибо.

"Наконец, в коде детали, при обработке нажатия на кнопку необходимо просто опубликовать сообщение, передав значение текущей записи:"

Подскажите, как передать сообщение не по кнопке, а при выборе записи в DataGrid?

Здравствуйте!

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

"Демьяник Алексей Олегович" написал: В случае выбора записи в DataGrid, сообщение будет генерироваться при выборе любой записи в любом гриде, что замедлит работоспособность системы.

Здравствуйте, Алексей.
Хорошо. Понял. Подскажите а можно кнопку в DataGrid встроить? И как?

Добрый день!

Для удобства вы можете добавить кнопку рядом с базовыми кнопками детали. Пример замещающей схемы детали во вложении.
addbuttontodetail.txt

Здравствуйте, Олег. Я так реализовал уже. Но это не совсем удобно. Подскажите как встроить кнопку в датагрид? В предыдущих версиях можно было. В крайнем случае, если нельзя, как кнопку в детали выделить? Другим цветом например?

Олег, добрый день!

Попробуйте следующий вариант реализации:

в скрипте детали в блок diff добавить дополнительные свойства для DataGrid (название и заголовок кнопки привожу в качестве примера, Вы можете изменить их на свои):

[javascript]
{
"operation": "merge",
"name": "DataGrid",
"values": {
"activeRowAction": {"bindTo": "onActiveRowAction"},
"activeRowActions": [
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.BLUE,
"markerValue": "myButtonAction",
"tag": "myAction",
"caption": "MyButton"
}
]
}
}
[/javascript]

После этого при выделении активной строки в детали должна появиться синяя кнопка с заголовком MyButton.

В массив activeRowActions можно добавить несколько кнопок, они все будут отображаться в выделенной строке так же, как и в реестре раздела.

Далее в методах той же детали необходимо реализовать метод onActiveRowAction. Данный метод в качестве аргументов принимает тэг кнопки и значение ключевой колонки выделенной строки. Насколько я понял из предыдущих сообщений, Вам этой информации достаточно, но если необходимо получить какие-либо другие значения выделенной строки, можно вызвать метод this.getActiveRow(), который возвращает всю модель выделенной строки:

[javascript]
methods: {
onActiveRowAction: function(buttonTag, primaryColumnValue) {
if (buttonTag === "myAction") {
// весь код ниже можно убрать, он демонстрирует, что значения
// primaryColumnValue и activeRowId равны
var activeRow = this.getActiveRow();
var activeRowId = activeRow.get("Id");
console.log(primaryColumnValue);
console.log(activeRowId);
// дальше Ваша реализация
...
}
},
...
}
[/javascript]

Здравствуйте, Олег.
Спасибо. Получилось то, что нужно. Скрин во вложении.

Показать все комментарии