Есть раздел 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; },
А если такого рода информацию нужно выводить неоднократно на разных страницах, можно сделать свой компонент в отдельной схеме и подключать его на странице, как это сделано для мультивалютного поля, выводящего и использующего информацию о валютах и курсах.