SPMeta2 samples

Собрал базовый комплект  примеров использования SPMeta2

Создание: полей, типов контента, списков, представлений, таймеров. Так же их взаимосвязь. думаю этот пример отлично поможет тем кто только начинает изучать SPMeta2.

Рекомендации из личного опыта при работе с большими проектам
Проект с артифактами должен быть отделен от основного проекта с логикой. То есть, если у вас есть проект: myproject, то для артифактов создайте отдельный проект myproject.artifacts который будет использовать SPMeta2 и при активации создаст на сайте все нужны списки, поля и тд.
Иерархию я выстроил именно так:

MyProject.Artifacts

---SharePoint

--- --- Fields

--- --- --- MyList.cs

--- --- ContentTypes

--- --- --- MyList.cs

--- --- Lists

--- --- --- MyList.cs

--- --- Views

--- --- --- MyList.cs

Удобно в итоге работать с установкой:

var modelSiteFields = SPMeta2Model.NewSiteModel(siteDefenition =>
{
    siteDefenition.AddField(SharePoint.Fields.MyList.ProcessId)
});
ssomProvisionService.DeploySiteModel(spSite, modelSiteFields);
//.....
var modelSiteContentTypes = SPMeta2Model.NewSiteModel(siteDefenition =>
{
  siteDefenition.AddContentType(SharePoint.ContentTypes.MyList.CommercialActItemContentType,contentType =>
  {
    contentType
        .AddContentTypeFieldLink(SharePoint.Fields.MyList.SeqNumber)
        .AddContentTypeFieldLink(SharePoint.Fields.MyList.ItemType);
    }
});

Объявление полей
    class MessageQueue
    {
        public static FieldDefinition MessageThemeTitle
        {
            get
            {
                //standart field
                FieldDefinition t = (FieldDefinition)BuiltInFieldDefinitions.Title.Clone();
                t.Title = "Тема";
                return t;
            }
        }


        public static NoteFieldDefinition MessageText = new NoteFieldDefinition
        {
            Id = new Guid("B1D38023-CC6E-4EDC-9280-24B3FA27A58F"),
            Title = "Сообщение",
            InternalName = "MessageText",
            Group = "Bpm.Artifacts",
            Required = true,
            RichText = true,
            RichTextMode = BuiltInRichTextMode.FullHtml,

        };

        public static NoteFieldDefinition MessageReceivers = new NoteFieldDefinition
        {
            Title = "Получатели",
            InternalName = "MessageReceivers",
            Group = "Bpm.Artifacts",
            Required = true,
            Id = new Guid("568B59D8-DD5B-42E8-8A9A-EF1DAB0520E3"),
            RichText = false,
        };

        public static DateTimeFieldDefinition MessageSendDate = new DateTimeFieldDefinition
        {
            Id = new Guid("1A295AAC-E4B7-4A31-80F2-00ECA595F27A"),
            Title = "Дата отправки",
            InternalName = "MessageSendDate",
            Group = "Bpm.Artifacts",
            Required = false,
        };
    }
Объявление типов контента
 public static ContentTypeDefinition MessageQueueContentType = new ContentTypeDefinition
        {
            Name = "Элемент очереди сообщения",
            Id = new Guid("A149B3E3-9A4B-40C2-AB8E-3179692B7107"),
            ParentContentTypeId = BuiltInContentTypeId.Item,
            Group = "Bpm.Artifacts",
        };
Объявление списка
 public static ListDefinition ListMessageQueue = new ListDefinition
        {

            Title = "Очередь сообщений",
            Description = "Список с очередью сообщений по бизнес процессам для узла",
            TemplateType = BuiltInListTemplateTypeId.GenericList,
            CustomUrl = "ListMessageQueue",
            ContentTypesEnabled = true,

        };
Объявление представления
 public static ListViewDefinition DefaultView = new ListViewDefinition
        {
            Title = "Очередь сообщений",
            RowLimit = 30,
            IsDefault = true,
            Query = " ",
            Fields = new Collection
            {
                Fields.MessageQueue.MessageThemeTitle.InternalName,
                Fields.MessageQueue.MessageText.InternalName,
                Fields.MessageQueue.MessageReceivers.InternalName,
                Fields.MessageQueue.MessageSendDate.InternalName
            }
        };
Добавление на сайт контента с полями
                siteDefenition.AddContentType(ContentTypes.MessageQueue.MessageQueueContentType, contentType =>
                {
                    contentType
                         .AddContentTypeFieldLink(Fields.MessageQueue.MessageThemeTitle)
                         .AddContentTypeFieldLink(Fields.MessageQueue.MessageText)
                         .AddContentTypeFieldLink(Fields.MessageQueue.MessageReceivers)
                         .AddContentTypeFieldLink(Fields.MessageQueue.MessageSendDate);

                    contentType.AddUniqueContentTypeFieldsOrder(new UniqueContentTypeFieldsOrderDefinition
                    {
                        Fields = new List
                                {
                                    new FieldLinkValue{ Id = Fields.MessageQueue.MessageThemeTitle.Id },
                                    new FieldLinkValue{ Id = Fields.MessageQueue.MessageText.Id },
                                    new FieldLinkValue{ Id = Fields.MessageQueue.MessageReceivers.Id },
                                    new FieldLinkValue{ Id = Fields.MessageQueue.MessageSendDate.Id },
                           
                                }
                    });

                });
Добавление на сайт списка
                web.AddList(Lists.MessageQueue.ListMessageQueue, listDefinition =>
                {

                    listDefinition.AddContentTypeLink(ContentTypes.MessageQueue.MessageQueueContentType);

                    listDefinition.AddHideContentTypeLinks(new HideContentTypeLinksDefinition
                    {
                        ContentTypes = new List
                        {
                            new ContentTypeLinkValue{ ContentTypeId=BuiltInContentTypeId.Item },
                         
                        }
                    });

                    listDefinition.AddListView(Views.MessageQueue.DefaultView);
                });
Работа с LookupField
public static LookupFieldDefinition CommercialActId = new LookupFieldDefinition
{
            Id = new Guid("AB46B41A-B635-4319-B6F7-5D5B5BA9C9A0"),
            Title = "Коммерческий акт",
            InternalName = "tsk_CommercialActId",
            Group = "Bpm.Project.CommercialAct",
            ShowInNewForm = false,
            ShowInEditForm = false,
            Required = true
            // ВАЖНО! связывание со списком делается позже, а не при орбъявлении
            // LookupListTitle  = SharePoint.Lists.CommercialAct.ListCommercialAct.Title 
};
В таком виде поле добавляется на сайт Site Scope
siteDefenition.AddContentType(SharePoint.ContentTypes.CommentsHistory.CommentsHistoryContentType,contentType =>
{
   contentType.AddContentTypeFieldLink(SharePoint.Fields.CommentsHistory.CommercialActId)                             
});
Далее контент попадает в список, список на наш узел. Web Scope
 web.AddList(SharePoint.Lists.CommentsHistory.ListCommentsHistory, listDefinition =>
 {
    listDefinition
             .AddContentTypeLink(SharePoint.ContentTypes.CommentsHistory.CommentsHistoryContentType);
  
});

/*deploy*/
var ssomProvisionService = new SSOMProvisionService();
ssomProvisionService.DeployWebModel(spWeb, modelWeb);
Вот тут идет обновление связей lookupField
var lookupFieldModel = SPMeta2Model.NewSiteModel(site =>
{
    site.AddField(SharePoint.Fields.CommentsHistory.CommercialActId);             
});
SharePoint.Fields.CommentsHistory.CommercialActId.LookupListTitle = SharePoint.Lists.CommercialAct.ListCommercialAct.Title;
        
/*deploy*/
ssomProvisionService.DeploySiteModel(spWeb.Site, lookupFieldModel);

Добавление custom field
При объявлении поля нужно указать FieldType вашего кастомного поля
public static FieldDefinition ИсторияКомментарий = new FieldDefinition
{
    Id = new Guid("D136D4F9-5AEF-4BBD-950D-0B5AD2339470"),
    Title = "��стория комментарий",
    InternalName = "tsk_commentsHistory",
    Group = "Bpm.Project.CommercialAct",
    FieldType = "ParentChildListWithDialog"
};
Далее, после установки, можно установить занчения в свойства кастомного поля (если требуется). Делаем через SetCustomProperty
    SPField tsk_commentsHistory = (listCommercialActTask.Fields["История комментарий"] as SPField);
    tsk_commentsHistory.SetCustomProperty("ChildListName", Enums.Lists.ListCommentsHistory.GetName());
    tsk_commentsHistory.SetCustomProperty("ParentListName", Enums.Lists.ListCommercialAct.GetName());
    tsk_commentsHistory.SetCustomProperty("ParentFieldName", "tsk_CommercialActId");
    tsk_commentsHistory.Update(true);
 
Добавление представления с группировкой
Используется InternalName поля:
 
 public static ListViewDefinition DefaultView = new ListViewDefinition
{
    Title = "Все задачи процесса",
    RowLimit = 30,
    IsDefault = false,            
    Query = "<where></where><GroupBy Collapse=\"TRUE\" GroupLimit=\"30\"><FieldRef Name=\"" + Fields.CommercialActTask.ProcessId.InternalName + "\" /></GroupBy><orderby> <fieldref name=\"ID\" ascending=\"FALSE\"></fieldref></orderby>",
    Fields = new Collection
    {
        Fields.CommercialActTask.ProcessId.InternalName,
        BuiltInFieldDefinitions.LinkTitle.InternalName, 
        BuiltInFieldDefinitions.Created.InternalName,
        BuiltInFieldDefinitions.DateCompleted.InternalName
    }
};

 
Скрытие контента из списка
Делается через AddHideContentTypeLinks. Будьте внимательны: ContentTypeName связан с языковыми настройками сайта
 web.AddList(SharePoint.Lists.Offenders.ListOffenders, listDefinition =>
                {
                    listDefinition
                       .AddContentTypeLink(SharePoint.ContentTypes.Offenders.OffendersContentType)
                       .AddHideContentTypeLinks(new HideContentTypeLinksDefinition
                       {
                           ContentTypes = new List
                            {
                                new ContentTypeLinkValue {ContentTypeName = "Элемент"},
                            }
                       });
                });
 
Сортировка полей
Делается через AddUniqueContentTypeFieldsOrder.
var modelSiteContentTypes = SPMeta2Model.NewSiteModel(siteDefenition =>
    {
        siteDefenition.AddContentType(SharePoint.ContentTypes.CommercialAct.CommercialActContentType, contentType =>
        {
                        contentType
                        .AddContentTypeFieldLink(SharePoint.Fields.CommercialAct.ProcessId)
                        .AddContentTypeFieldLink(SharePoint.Fields.CommercialAct.WorkflowState);

                        contentType.AddUniqueContentTypeFieldsOrder(new UniqueContentTypeFieldsOrderDefinition
                        {
                            Fields = new List
                                        {
                                              new FieldLinkValue {Id = SPBuiltInFieldId.Title},
                                              new FieldLinkValue {Id =SharePoint.Fields.CommercialAct.ProcessId.Id},
                                              new FieldLinkValue {Id =SharePoint.Fields.CommercialAct.WorkflowState.Id},
                                              }
                        });
        });

    });
 

Добавить комментарий

Loading