Использование sandbox для обмена сообщениями в BPMOnline 7.2
Версия BPMOnline 7.2
Простая задача: в зависимости от чекбокса на основной карточке разрешить или запретить добавление элементов в деталь.
1. В коде основной карточки:
добавим чекбокс на страницу
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'IsProductChoose',
columnPath: 'IsProductChoose',
dataValueType: Terrasoft.DataValueType.BOOLEAN,
visible: true,
customConfig: {
click: {
bindTo: "IsProductChooseClicked"
}
}
}
обработчик изменения чекбокса
var args = {
param: this.get("IsProductChoose")
};
sandbox.publish(
"IsProductChooseChanged",
args,
[sandbox.id]
);
};
2. В коде детали:
изменим конфиг выпадающего меню
var utilsMenuItems = utilsButton.menu.items;
utilsMenuItems[1].caption = "Выбрать продукты";
utilsMenuItems[1].enabled = {bindTo: "isProductChooseForSelection"};
return utilsButton;
};
обработчик "включить/выключить пункт меню"
this.sandbox.subscribe("IsProductChooseChanged", function(arg) {
console.log(arg);
}, this, [this.getSenderSandboxId()]);
};
this.methods.getSenderSandboxId = function() {
return this.sandbox.id.replace('_detail_SynchronizedProduct', '');
};
Однако при открытии карточки получаю ошибку в консоли браузера:
Uncaught Terrasoft.UnsupportedTypeException: Message IsProductChooseChanged is not defined in undefined module
К сожалению в документации не описано как работать с событиями через sandbox.
Буду благодарен за консультацию.
Нравится
как раз недавно обсуждались сообщения: http://www.community.terrasoft.ru/forum/topic/15210
по версиям, насколько я знаю, отличий нет
К сожалению, отличия есть. В 7.2 как минимум нет такого объекта Terrasoft.MessageMode.PTP
Для BPM'Online 7.2 Вы можете воспользоваться уже существующими месседжами, к примеру "UpdateDetail".
Вот пример кода для общения страницы "Контакт" с деталью "Средства связи". Код для страницы контакта в методе "init":
var moduleId = sandbox.id + '_detail_communications'; this.on("change:Name", function(){ if(this.get("Name") === "Some name"){ sandbox.publish('UpdateDetail', null, [moduleId]); } });
Код в методе "init" детали:
var moduleId = sandbox.id; sandbox.subscribe("UpdateDetail", function() { alert("GOAL!") }, [moduleId]);
Данный код тестировался для версий 720 и 722. Основное условие работоспособности - идентичность содержания переменной moduleId как для модуля так и для страницы редактирования.
Спасибо большое, все получилось. А не подскажете - для того, чтобы использовать свои месседжи - необходимо писать свой модуль?
Да, в версии 7.2 создавать месседжи можно только в модулях.