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