Добрый день. Действовал по инструкции с академии по добавлению пользовательского элемента кампании и столкнулся со следующей проблемой: в метаданных кампании в описании моего элемента не отображаются поля, которые я объявил в элементе из-за чего при обновлении страницы пропадают все заполненные поля в моем элементе. То есть я создал файл BSDeliveryElementSchema
define("BSDeliveryElementSchema", ["BSDeliveryElementSchemaResources", "CampaignBaseCommunicationSchema"], function(resources) { Ext.define("Terrasoft.manager.BSDeliveryElementSchema", { // Родительская схема. extend: "Terrasoft.CampaignBaseCommunicationSchema", alternateClassName: "Terrasoft.BSDeliveryElementSchema", // Идентификатор менеджера. Должен быть уникальным. managerItemUId: "a1226f93-f3e3-4baa-89a6-11f2a9ab2d71", // Подключаемые миксины. mixins: { campaignElementMixin: "Terrasoft.CampaignElementMixin" }, // Название элемента. name: "BSDelivery", // Привязка ресурсов. caption: resources.localizableStrings.Caption, titleImage: resources.localizableImages.TitleImage, largeImage: resources.localizableImages.LargeImage, smallImage: resources.localizableImages.SmallImage, // Имя схемы карточки редактирования. editPageSchemaName: "BSDeliveryElementPropertiesPage", // Тип элемента. elementType: "BSDelivery", // Полное имя класса, соответствующего данной схеме. typeName: "Terrasoft.Configuration.BSDeliveryElement, Terrasoft.Configuration", // Переопределение свойств стилей для отображения. color: "rgba(55, 119, 188, 1)", width: 69, height: 55, // Настройка специфических свойств элемента. deliveryId: null, // Определение типов связей, исходящих из элемента. getConnectionUserHandles: function() { return ["CampaignSequenceFlow", "CampaignConditionalSequenceFlow"]; }, // Расширение свойств для сериализации. getSerializableProperties: function() { var baseSerializableProperties = this.callParent(arguments); return Ext.Array.push(baseSerializableProperties, ["DeliveryId"]); }, // Настройка отображения иконок на диаграмме кампании. getSmallImage: function() { return this.mixins.campaignElementMixin.getImage(this.smallImage); }, getLargeImage: function() { return this.mixins.campaignElementMixin.getImage(this.largeImage); }, getTitleImage: function() { return this.mixins.campaignElementMixin.getImage(this.titleImage); } }); return Terrasoft.BSDeliveryElementSchema; });
Потом файл BSDeliveryElementPropertiesPage
define("BSDeliveryElementPropertiesPage", ["LookupUtilities"], function(LookupUtilities) { return { attributes: { "DeliveryId":{ "dataValueType": this.Terrasoft.DataValueType.LOOKUP, "type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN, "referenceSchemaName": "BeesenderDelivery", "isRequired": true, "isLookup": true }, "DeliveryCollection": { "dataValueType": this.Terrasoft.DataValueType.COLLECTION, "type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN }, }, methods: { init: function() { this.callParent(arguments); this.initAcademyUrl(this.onAcademyUrlInitialized, this); }, getContextHelpCode: function() { return "CampaignBSDeliveryElement"; }, initParameters: function(element) { this.callParent(arguments); this.set("DeliveryId", element.deliveryId); }, saveValues: function() { this.callParent(arguments); var element = this.get("ProcessElement"); element.deliveryId = this.getDelivery(); }, getDelivery: function(){ var delivery = this.get("DeliveryId"); return delivery ? delivery : ""; }, loadDeliverySchemaLookup: function() { var self = this; var config = this.getDeliveryLookupConfig(); LookupUtilities.Open(this.sandbox, config, function(args) { var collection = args.selectedRows; if (collection.getCount() > 0) { var selectedItem = collection.getItems()[0]; self.set("DeliveryId", selectedItem); } }, this, null, false, false); }, /** * Gets email lookup config * @protected * @return {object} */ getDeliveryLookupConfig: function() { var config = { entitySchemaName: "BeesenderDelivery", multiSelect: false, hideActions: true }; return config; }, prepareDeliveryList: function(filterParameter, list) { if (list && list instanceof Terrasoft.Collection) { list.clear(); } var filters = null; this.prepareLookupList(filters, filterParameter, "BeesenderDelivery", "DeliveryCollection", this); }, }, diff: [ { "operation": "insert", "name": "ContentContainer", "propertyName": "items", "parentName": "EditorsContainer", "className": "Terrasoft.GridLayoutEdit", "values": { "itemType": Terrasoft.ViewItemType.GRID_LAYOUT, "items": [] } }, { "operation": "insert", "name": "BSDeliveryLabel", "parentName": "ContentContainer", "propertyName": "items", "values": { "layout": { "column": 0, "row": 0, "colSpan": 24 }, "itemType": this.Terrasoft.ViewItemType.LABEL, "caption": { "bindTo": "Resources.Strings.BSDeliveryText" }, "classes": { "labelClass": ["t-title-label-proc"] } } }, { "operation": "insert", "name": "DeliveryLabel", "parentName": "ContentContainer", "propertyName": "items", "values": { "layout": { "column": 0, "row": 3, "colSpan": 24 }, "classes": { "labelClass": ["t-title-label-proc"] }, "itemType": this.Terrasoft.ViewItemType.LABEL, "caption": { "bindTo": "Resources.Strings.DeliveryCaption" } } }, { "operation": "insert", "name": "DeliveryId", "parentName": "ContentContainer", "propertyName": "items", "values": { "bindTo": "DeliveryId", "labelConfig": { "visible": false }, "layout": { "column": 0, "row": 4, "colSpan": 24 }, "itemType": this.Terrasoft.ViewItemType.LOOKUP, "classes": { "labelClass": ["feature-item-label"] }, "controlConfig": { "tag": "DeliveryId", "loadVocabulary": { "bindTo": "loadDeliverySchemaLookup" }, "prepareList": { "bindTo": "prepareDeliveryList" }, "list": { "bindTo": "DeliveryCollection" }, } } } ] }; } );
Файл BSDeliveryElement. Код файла BSDeliveryCampaignProcessElement приводить не стал, так как я понимаю, что он не относится к формированию метаданных.
namespace Terrasoft.Configuration { using System; using Terrasoft.Common; using Terrasoft.Core; using Terrasoft.Core.Campaign; using Terrasoft.Core.Process; [DesignModeProperty(Name = "DeliveryId", UsageType = DesignModeUsageType.NotVisible, MetaPropertyName = DeliveryPropertyName)] public class BSDeliveryElement : CampaignSchemaElement { private const string DeliveryPropertyName = "DeliveryId"; public BSDeliveryElement() { ElementType = CampaignSchemaElementType.AsyncTask; } public BSDeliveryElement(BSDeliveryElement source) : base(source) { ElementType = CampaignSchemaElementType.AsyncTask; DeliveryId = source.DeliveryId; } // Идентификатор действия элемента. protected override Guid Action { get { return CampaignConsts.CampaignLogTypeMailing; } } //откуда это взять? [MetaTypeProperty("{D12151EF-672A-4F5F-BE2B-76F2501444D0}")] public Guid DeliveryId{ get; set; } protected override void ApplyMetaDataValue(DataReader reader) { base.ApplyMetaDataValue(reader); switch (reader.CurrentName) { case DeliveryPropertyName: DeliveryId = reader.GetGuidValue(); break; default: break; } } public override void WriteMetaData(DataWriter writer) { base.WriteMetaData(writer); writer.WriteValue(DeliveryPropertyName, DeliveryId, Guid.Empty); } public override object Clone() { return new BSDeliveryElement(this); } public override ProcessFlowElement CreateProcessFlowElement(UserConnection userConnection) { var executableElement = new BSDeliveryCampaignProcessElement { UserConnection = userConnection, DeliveryId = DeliveryId }; InitializeCampaignProcessFlowElement(executableElement); return executableElement; } } }
После сохранения/публикации схем мой элемент успешно появился в списке элементов кампании и без проблем добавляется/сохраняется в кампании. Но после обновления страницы я вижу, что поле Delivery остается не заполненным и его надо заново заполнять. Решил проверить метаданные этой кампании. Заметил, что в сравнении с элементом кампании Email-рассылка в метаданных моего элемента отсутствует DeliveryId, хотя все сделано по инструкции и по аналогии с Email-рассылкой. Также интересно, откуда в примере берется заполнение MetaTypeProperty для SmsText и PhoneNumber?
{ "MetaData": { "Schema": { "ManagerName": "CampaignSchemaManager", "UId": "68e7407a-2b0c-4d74-a64d-d9538cfdac09", "Name": "Campaign1", "CreatedInPackageId": "ecf839d6-c220-43d4-8eaf-f342565ddec6", "Methods": [], "LocalizableStrings": [], "Usings": [], "PackageUId": "b9e0a92c-eb1e-4b05-ae29-0d4845242e29", "CreatedInVersion": "7.13.0.284", "Parameters": [], "IsLogging": false, "ParentSchemaUId": "371c5d61-06ed-4bda-a905-c00ea6d19551", "EntitySchemaUId": "1f9bb71a-eb9c-4220-a40e-9b623eacfec8", "Mappings": [], "NotificationCaption": { "TypeName": "Terrasoft.Core.Process.ProcessSchemaParameter", "UId": "cdd58be7-2dba-4a5e-869b-1ad5d6d7513a", "Name": "NotificationCaption", "CreatedInSchemaUId": "68e7407a-2b0c-4d74-a64d-d9538cfdac09", "ModifiedInSchemaUId": "68e7407a-2b0c-4d74-a64d-d9538cfdac09", "DataValueType": "8b3f29bb-ea14-4ce5-a5c5-293a929b6ba2", "SourceValue": { "Source": 3, "Value": "[#[PropertyValue:Caption]#]" } }, "FlowElements": [ { "TypeName": "Terrasoft.Configuration.MarketingEmailElement, Terrasoft.Configuration", "UId": "2fc1fc81-629d-4c83-9932-0fa0609d7754", "Name": "MarketingEmail1", "CreatedInSchemaUId": "68e7407a-2b0c-4d74-a64d-d9538cfdac09", "ModifiedInSchemaUId": "68e7407a-2b0c-4d74-a64d-d9538cfdac09", "CreatedInPackageId": "b9e0a92c-eb1e-4b05-ae29-0d4845242e29", "ContainerUId": "bd0ac34a-1036-48d7-b196-79707e0ad01a", "Position": "240;225", "Size": "69;55", "MarketingEmailId": "2371319a-ceb4-420a-82a1-a1a64fa8f342" }, { "TypeName": "Terrasoft.Configuration.BSDeliveryElement, Terrasoft.Configuration", "UId": "c3cc6526-de41-474f-a6fc-bc89ec4159a6", "Name": "BSDelivery1", "CreatedInSchemaUId": "68e7407a-2b0c-4d74-a64d-d9538cfdac09", "ModifiedInSchemaUId": "68e7407a-2b0c-4d74-a64d-d9538cfdac09", "CreatedInPackageId": "b9e0a92c-eb1e-4b05-ae29-0d4845242e29", "ContainerUId": "bd0ac34a-1036-48d7-b196-79707e0ad01a", "Position": "462;241", "Size": "69;55" } ], "EntityId": "65e2191f-6ad3-412b-96d6-e89202afaca7" } } }
Нравится
Здравствуйте!
Значение поля может не сохранятся если:
1. Неправильно реализованы методы ApplyMetaDataValue или WriteMetaData
2. Обязательно наличие атрибута для поля
3. Неправильно указан тип поля
На сколько я понимаю, вы добавляете справочное поле - DeliveryId. В базовой схеме MarketingEmailElement можно посмотреть реализацию для справочного поля MarketingEmailId и сравнить со своей реализацией.
Demchenko Olha пишет:
Добрый день, а уникальный идентификатор в атрибуте его генерировать случайным образом или его надо брать какой-то конкретный?