Вывести на страницу редактирования раздела, поле другого справочного поля объекта
Добрый день!
Есть объект "Заявка", в нём поле "Анкета", мне нужно на страницу редактирования раздела заявки (вроде так называется, наследуется от BaseModulePageV2 ( NUI )) вывести поля анкеты.
Что я сделал: добавил в код страницы редактирования заявки и раздела заявки кусок:
dataModels: /**SCHEMA_DATA_MODELS*/{
"AppQ": {
"entitySchemaName": "ApplicationQuestionnaire",
"primaryColumnValue": {
"bindTo": "ApplicationQuestionnaire"
}
}
}/**SCHEMA_DATA_MODELS*/,
В diff'е страницы редактирования заявки прописал несколько полей по типу:
{
"operation": "insert",
"name": "TscAppFilingMethod",
"values": {
"bindTo": "AppQ.AppFilingMethod",
"layout": {
"column": 0,
"row": 0,
"colSpan": 12,
"rowSpan": 1
},
"enabled": false
},
"parentName": "AppQInfoGroupGridLayout",
"propertyName": "items"
}
Дальше происходит следующее:
- Если на страницу редактирования заходить напрямую по url, поля отображаются.
- Если заходить на страницу из раздела, то поля не отображаются пока не обновишь страницу. После обновления страницы поля есть, и даже если закрыть страницу редактирования и заново в неё войти из раздела, поля остаются, до момента пока не очистишь кэш браузера.
Когда поля не отображаются в консоль выводится следующее сообщение:
Заголовок для подписи "AppFilingMethod" не был найден.
Невозможно найти колонку по конфигурации: "{"bindTo":"AppQ.AppFilingMethod","layout":{"colSpan":12,"rowSpan":1,"column":0,"row":0},"enabled":false,"name":"AppFilingMethod"}" .
Отображаются эти ошибки как на странице раздела, так и на странице редактирования.
Нужно как-то проинициализировать AppQ на странице раздела или я не прав? Подскажите, пожалуйста.
Использовать запросы и выводить виртуальные поля очень не хочется.
Нравится
eduard-t,
Добрый день.
Похоже, что никак. У нас в системе нет понимания как в таком кейсе будет работать сохранение и редактирование таких полей, соответственно могут возникнуть проблемы. В Ext мы официально и не поддерживаем несколько датасорсов, кроме как на преднастроенных страницах.
Вы можете попробовать реализовать свой модуль на примере базового AccountProfileSchema в карточке контакта. Думаю это решит Вашу бизнес задачу.
Или же придется использовать запросы. Например, можно решить так:
1. Добавляем виртуальный атрибут нужного типа в секцию атрибутов:
attributes: {
"AlternativeMobilePhone": {
dataValueType: this.Terrasoft.DataValueType.TEXT,
type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
caption: "Alternative mobile phone",
value: null
},
2. Выводим его на странице в секции дифов:
{
"operation": "insert",
"name": "AlternativeMobilePhone",
"values": {
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 0,
"row": 2,
"layoutName": "ContactTab"
},
"bindTo": "AlternativeMobilePhone"
},
"parentName": "ContactTab",
"propertyName": "items",
"index": 4
},
3. Пишем функцию получения нужных данных и установки в вируальные атрибуты\атрибут:
getContactInfo: function() {
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Contact"
});
esq.addColumn("Phone");
esq.filters.add("ContactFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Id", this.get("Contact").value));
esq.getEntityCollection(function(result) {
if (result.success) {
var collection = result.collection;
if (collection && collection.collection.items.length > 0) {
var item = collection.collection.items[0];
this.set("AlternativeMobilePhone", item.get("Phone"));
}
}
}.bind(this));
},
4. При инициализации карточки вызываем этот метод:
onEntityInitialized: function() {
this.callParent(arguments);
this.getContactInfo();
},
5. Для случаев изменения контакта в рантайме, делаем подписку на его изменение и вызов этого же метода получения нужной информации, делается это в блоке атрибутов:
"AnyName": {
"value": false,
"dataValueType": Terrasoft.DataValueType.BOOLEAN,
"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
"dependencies": [
{
"columns": ["Contact"],
"methodName": "getContactInfo"
}
]
},
Добрый день.
Попробуйте добавить в values свойство caption и указать конкретное название:
"layout": {
"column": 0,
"row": 0,
"colSpan": 12,
"rowSpan": 1,
"caption":"MyCaption"
}
После этого ошибка должна уйти. Или же проверьте есть ли заголовок данной колонки в объекте.
Mykhailo Storozhuk,
Добрый день. Проблема не в этом, caption нормально подтягивается (из заголовка колонки анкеты), если колонка загружена, но колонка не загружается если заходить через раздел.
Если указать, как вы написали, то получаю просто надпись заголовка без значения:
Обновляю страницу, и всё подтягивается:
Как сделать, чтобы подтягивалось без обновления страницы?
eduard-t,
Добрый день.
Похоже, что никак. У нас в системе нет понимания как в таком кейсе будет работать сохранение и редактирование таких полей, соответственно могут возникнуть проблемы. В Ext мы официально и не поддерживаем несколько датасорсов, кроме как на преднастроенных страницах.
Вы можете попробовать реализовать свой модуль на примере базового AccountProfileSchema в карточке контакта. Думаю это решит Вашу бизнес задачу.
Или же придется использовать запросы. Например, можно решить так:
1. Добавляем виртуальный атрибут нужного типа в секцию атрибутов:
attributes: {
"AlternativeMobilePhone": {
dataValueType: this.Terrasoft.DataValueType.TEXT,
type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
caption: "Alternative mobile phone",
value: null
},
2. Выводим его на странице в секции дифов:
{
"operation": "insert",
"name": "AlternativeMobilePhone",
"values": {
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 0,
"row": 2,
"layoutName": "ContactTab"
},
"bindTo": "AlternativeMobilePhone"
},
"parentName": "ContactTab",
"propertyName": "items",
"index": 4
},
3. Пишем функцию получения нужных данных и установки в вируальные атрибуты\атрибут:
getContactInfo: function() {
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Contact"
});
esq.addColumn("Phone");
esq.filters.add("ContactFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Id", this.get("Contact").value));
esq.getEntityCollection(function(result) {
if (result.success) {
var collection = result.collection;
if (collection && collection.collection.items.length > 0) {
var item = collection.collection.items[0];
this.set("AlternativeMobilePhone", item.get("Phone"));
}
}
}.bind(this));
},
4. При инициализации карточки вызываем этот метод:
onEntityInitialized: function() {
this.callParent(arguments);
this.getContactInfo();
},
5. Для случаев изменения контакта в рантайме, делаем подписку на его изменение и вызов этого же метода получения нужной информации, делается это в блоке атрибутов:
"AnyName": {
"value": false,
"dataValueType": Terrasoft.DataValueType.BOOLEAN,
"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
"dependencies": [
{
"columns": ["Contact"],
"methodName": "getContactInfo"
}
]
},