Можно ли изменять заголовок страницы редактирования в bpm'online 7.5 в зависимости от данных на странице (например, вместо "Контрагент" отображать строку, состоящую из типа и названия контрагента)?
Нравится
Владимир, добрый день!
Для реализации необходимо , чтобы на странице присутствовал ChangeHeaderCaption иначе заголовок не будет меняться.
Примерный алгоритм:
Используя замещенную страницу добавьте на onEntityInitialized или на любом другом init новый мэсседж :
messages: { "ChangeHeaderCaption": { mode: Terrasoft.MessageMode.PTP, direction: Terrasoft.MessageDirectionType.PUBLISH }, }
Затем добавить новый метод, в котором будет присутствовать следующая строка:
this.sandbox.publish("ChangeHeaderCaption", { caption: "добавить свое условие" } )
Как наглядный пример, можете ознакомиться с initMainHeaderCaption (BaseSectionV2) как там реализован ChangeHeaderCaption.
Спасибо!
Частично получилось.
Добавил messages:
messages: { "ChangeHeaderCaption": { mode: Terrasoft.MessageMode.PTP, direction: Terrasoft.MessageDirectionType.PUBLISH } }
Переопределил:
onEntityInitialized: function() { this.callParent(arguments); this.updateSectionHeader(); }
Добавил функцию:
updateSectionHeader: function() { var caption = ""; var type = this.get("Type"); var ContactName = this.get("Name"); if (type) { if (ContactName) { caption = ContactName + "( " + type.displayValue+ " )"; } else { caption = "New " + type.displayValue; } } else { caption = this.entitySchema.caption; } this.sandbox.publish("ChangeHeaderCaption", { caption: caption, dataViews: new Terrasoft.Collection(), moduleName: this.name }); }
Что работает:
1. При добавлении записи
2. При открытии записи на редактирование
Что не работает:
1. Если закрывается запись, то заголовок остаётся (надо, чтобы менялся на стандартный для раздела)
2. Если закрыть полосу списка, то при открытой записи заголовок меняется на стандартный для раздела (надо, чтобы оставался)
3. Если запись сохранить, но не закрывать, то заголовок не меняется (нужно менять при сохранении).
Очевидно, что на onEntityInitialized недостаточно вызова функции. Какие еще методы надо переопределить, чтобы отрабатывали три неработающие вещи?
И дополнительный вопрос:
Как отличить, открыта ли карточка (при незакрытом списке) или закрыта (и виден только реестр).
В первом случае нужно показывать заголовок карточки, во втором - заголовок реестра
Владимир, добрый день!
Сначала ответ на последний вопрос. В схеме BaseSectionV2 есть два атрибута: "IsCardVisible" и "IsSectionVisible", которые можно использовать для определения видимости карточки и раздела. Также базовый модуль карточки редактирования (CardModuleV2) содержит флаг isSeparateMode, который указывает на то, что карточка на странице отображается одна. Если значение этого флага равно false - это значит, что на странице кроме CardModuleV2 присутствует и SectionModuleV2 в виде вертикального реестра. Абсолютно такой же флаг есть и у SectionModuleV2.
Что касается публикации сообщения "ChangeHeaderCaption" - она происходит, кроме инициализации, в следующих случаях:
1) при закрытии вертикального реестра (метод onCloseSectionButtonClick схемы BaseSectionV2) - причина изменения заголовка в Вашем п.2;
2) при переходе в представление "Аналитика" и обратно.
Для реализации изменения заголовка (п.1 и п.3) Вам необходимо добавить публикацию данного сообщения (либо метода, который инициирует публикацию) при обработке нажатия кнопок "Сохранить" и "Закрыть" в карточке редактирования.
"Лабьяк Олег Игоревич" написал: В схеме BaseSectionV2 есть два атрибута: "IsCardVisible" и "IsSectionVisible"
1. А как можно в коде страницы получить значения этих атрибутов?
2. В код добавил метод onCloseSectionButtonClick, однако его вызова при закрытии списка не происходит
3. И какой метод вызывается при закрытии карточки редактирования?
Спасибо!
Владимир,
1) в коде страницы необходимо использовать this.get("IsSeparateMode"), по значению которого можно определить, присутствует ли на странице вертикальный реестр (если он скрыт, но его можно отобразить с помощью соответствующего действия, значения атрибута тоже будет false), либо нет (добавлена новая запись). Атрибуты "IsCardVisible" и "IsSectionVisible" доступны только в коде раздела.
2) Вы добавили метод в код карточки? Этот метод определён в BaseSectionV2, соответственно, вызывается из кода раздела.
3) При закрытии карточки редактирования (по кнопке "Закрыть") вызывается метод onCloseClick. Если с точки зрения модуля раздела - метод closeCard.
Вообще, Вашу задачу можно решить примерно так:
1) в карточке редактирования переопределяем метод getHeader, чтобы он возвращал необходимое Вам значение:
getHeader: function() { var caption = ""; var type = this.get("Type"); var contactName = this.get("Name"); if (type) { caption += (contactName && (contactName + " ( " + type.displayValue + " )")) || ("New " + type.displayValue); } else { caption = this.entitySchema.caption; } return caption; }
2) переопределяем метод initHeader, чтобы он выполнял обновление заголовка не только при добавлении новой записи:
initHeader: function() { var entityCaption = this.getHeader(); this.sandbox.publish("InitDataViews", {caption: entityCaption}); if (this.get("IsSeparateMode")) { this.initContextHelp(); } }
3) переопределяем метод onSaved, чтобы заголовок обновлялся при сохранении записи:
onSaved: function() { this.initHeader(); this.callParent(arguments); }
4) переходим в схему раздела и переопределяем в ней метод onCloseSectionButtonClick, чтобы обновление заголовка не выполнялось при скрытии вертикального реестра:
onCloseSectionButtonClick: function() { this.hideSection(); this.removeSectionHistoryState(); this.updateCardHeader(); }
5) наконец, переопределяем метод closeCard, обновляя заголовок после закрытия карточки редактирования:
closeCard: function() { this.callParent(arguments); this.updateSectionHeader(); }