Передача значения со страницы детали в страницу проекта. BpmOnline 7.5.
Здравствуйте, коллеги.
1) Нужно передать значение (Id выбранной записи) со страницы детали в страницу проекта, задействованной в бизнес процессе. Я так понял нужно использовать sandbox и messages. Подскажите подробнее как их использовать?
2) Добавил на деталь свою кнопку. Как по нажатию этой кнопки осуществить дальнейшее прохождение страницы проекта по бизнес процессу. Банальный this.acceptProcessElement(); не помогает.
Скриншот во вложении.
Нравится
Добрый день!
Посмотрите похожие темы на 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]
Здравствуйте, Олег.
Спасибо. Получилось то, что нужно. Скрин во вложении.