Создание кастомного элемента кампании

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

 

Нравится

2 комментария

Здравствуйте!

Значение поля может не сохранятся если:

1. Неправильно реализованы методы ApplyMetaDataValue или WriteMetaData 

2. Обязательно наличие атрибута для поля

3. Неправильно указан тип поля

На сколько я понимаю, вы добавляете справочное поле - DeliveryId. В базовой схеме MarketingEmailElement можно посмотреть реализацию для справочного поля MarketingEmailId и сравнить со своей реализацией.

Demchenko Olha пишет:

Добрый день, а уникальный идентификатор в атрибуте его генерировать случайным образом или его надо брать какой-то конкретный? 

Показать все комментарии