Передача значения со страницы детали в страницу проекта. 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. Как отловить на основной странице, что сообщение из детали пришло? Т.е есть ли такое событие прихода сообщения?
Решил реализовать следующим образом: добавить кнопку в активную строку и по нажатию послать сообщение основной форме. В основной форме отловит сообщение и отправиться дальше по процессу. Что удалось найти:
Нашел на форуме, что можно добавить кнопку в активную строку.
{ "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" } }
И потом переопределить метод onActiveRowAction:
onActiveRowAction: function(buttonTag, primaryColumnValue) { switch (buttonTag) { // замещение базового метода посылаем сообщение основной странице case "call": this.sandbox.publish("GetContactDetailActiveRecordId", this.get("TestParameter"), [this.sandbox.id]); break; default: this.callParent(arguments); break; } },
Который объявлен в 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 (название и заголовок кнопки привожу в качестве примера, Вы можете изменить их на свои):
{ "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" } ] } }
После этого при выделении активной строки в детали должна появиться синяя кнопка с заголовком MyButton.
В массив activeRowActions можно добавить несколько кнопок, они все будут отображаться в выделенной строке так же, как и в реестре раздела.
Далее в методах той же детали необходимо реализовать метод onActiveRowAction. Данный метод в качестве аргументов принимает тэг кнопки и значение ключевой колонки выделенной строки. Насколько я понял из предыдущих сообщений, Вам этой информации достаточно, но если необходимо получить какие-либо другие значения выделенной строки, можно вызвать метод this.getActiveRow(), который возвращает всю модель выделенной строки:
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); // дальше Ваша реализация ... } }, ... }
Здравствуйте, Олег.
Спасибо. Получилось то, что нужно. Скрин во вложении.