Есть раздел UsrTenant, в нем есть поле Room, принимающее значения из справочника UsrRoom. В свою очередь, в UsrRoom есть поле-справочник Shop, принимающее значение из справочника UsrShop. В UsrShop есть текстовое поле Name. Задача - показать в карточке UsrTenant значение UsrTenant.Room.Shop.Name (сделать привязку элемента управления на это значение), лучше в режиме "только чтение". Как это сделать?
Теоретически, можно прикрутить к UsrTenant атрибут, привязать к нему элемент управления в diff, в UsrTenant.onEntityInitialized() определять значение Room.Shop.Name через EntitySchemaQuery и присваивать его атрибуту. Но нет ли способа, позволяющего напрямую привязать элемент управления по такой иерархии? Что-то, может, вроде:
// Конечно, прямо в таком виде код не работает, выдается ошибка,
// что невозможно найти колонку по конфигурации Room.Shop.Name
{
"operation": "insert",
"name": "ShopNameView",
"values": {
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 12,
"row": 1,
"layoutName": "Header"
},
"bindTo": "Room.Shop.Name",
"enabled": false,
"contentType": 5
},
"parentName": "Header",
"propertyName": "items",
"index": 3
}
Нравится
Добрый день.
В атрибутах добавляете виртуальное поле, которое будет отображаться в карточке:
"DBMReady": {
"dataValueType": Terrasoft.DataValueType.BOOLEAN,
"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
"value": false
}В атрибутах указываете, какие поля справочного поля нужно ещё получить:
"BTContactPatient": {
"lookupListConfig": {
"columns": ["BTDBMReady"]
}
},Переопределяете метод onEntityInitialized - добавляете вызов метода, в котором будут считываться нужные значения из справочника и устанавливаться в виртуальные поля:
onEntityInitialized: function() {
this.callParent(arguments);
if (!this.isNew) {
this.setPatientFieldsValue();
}
},
setPatientFieldsValue: function() {
var patient = this.get("BTContactPatient");
if (!patient) {
return;
}
this.set("DBMReady", patient.BTDBMReady);
},
Алла Савельева,
Добрый день. Может, я не совсем точно донес свою мысль...
В общем, моя ситуация такова, что BTDBMReady - не скалярное значение, а ссылка на справочник. И атрибуту на странице мне нужно присвоить, например, BTContactPatient.ВTDBMReady.CustomParameter (т.е. простым
ВTDBMReady.displayValue тут не обойтись). Можно ли это сделать без EntitySchemaQuery?
Юрий, а почему не использовать EntitySchemaQuery?
Пример заполнения виртуальных полей таким образом есть в OpportunityMiniPage пакета Opportunity:
/**
* Last activity in opportunity.
* @type {Object}
*/
"LastActivity": {
"dataValueType": Terrasoft.DataValueType.LOOKUP,
"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
"referenceSchemaName": "Activity"
},
/**
* Last activity result caption in opportunity.
* @type {String}
*/
"LastActivityCaption": {
"dataValueType": Terrasoft.DataValueType.TEXT,
"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
"value": ""
},
...
onEntityInitialized: function() {
...
this.getLastActivity();
...
this.callParent(arguments);
},
...
/**
* Gets last activity from opportunity.
* @protected
*/
getLastActivity: function() {
var esq = this.getLastActivitySelect();
esq.getEntityCollection(function(response) {
if (response && response.success) {
var collection = response.collection;
if (collection.getCount() > 0) {
var firstItem = collection.getByIndex(0);
this.setLastActivityAttributes(firstItem);
}
}
}, this);
},
/**
* Sets last activity attributes.
* @protected
* @param {Object} activity Activity object from response.
*/
setLastActivityAttributes: function(activity) {
var date = this.getShortDate(activity.get("DueDate"));
this.set("LastActivityCaption", Ext.String.format(
this.get("Resources.Strings.LastActivityCaption"), date));
this.set("LastActivity", {
value: activity.get("Id"),
displayValue: Ext.String.format("{0} / {1}", activity.get("CategoryName"),
activity.get("StatusName"))
});
},
/**
* Gets last activity select.
* @protected
* @return {Terrasoft.EntitySchemaQuery} Last activity select query.
*/
getLastActivitySelect: function() {
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Activity"
});
esq.rowCount = 1;
esq.addColumn("Status.Name", "StatusName");
esq.addColumn("ActivityCategory.Name", "CategoryName");
var dueDate = esq.addColumn("DueDate");
dueDate.orderPosition = 0;
dueDate.orderDirection = Terrasoft.OrderDirection.DESC;
this.setLastActivityRequestFilters(esq);
return esq;
},
/**
* Sets last activity filters.
* @protected
* @param {Terrasoft.EntitySchemaQuery} esq Activity select query.
* @return {Terrasoft.EntitySchemaQuery} Activity select query with filter.
*/
setLastActivityRequestFilters: function(esq) {
var id = this.get("Id");
if (!Ext.isEmpty(id)) {
esq.filters.add("opportunityFilter", Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "Opportunity", id));
}
return esq;
},А если такого рода информацию нужно выводить неоднократно на разных страницах, можно сделать свой компонент в отдельной схеме и подключать его на странице, как это сделано для мультивалютного поля, выводящего и использующего информацию о валютах и курсах.