Программно создать тип контента SharePoint 2010, используя файл определения XML - PullRequest
2 голосов
/ 28 декабря 2011

Есть ли способ программно создать тип контента SharePoint 2010, используя файл определения XML?SPFields можно добавить следующим образом:

SPContext.Current.Web.Fields.AddFieldAsXml("<xml />");

Существует ли аналогичный способ программного добавления типов контента в семейство сайтов / сайт?

Ответы [ 3 ]

6 голосов
/ 29 декабря 2011

Вы можете программно создавать / добавлять типы контента, но не используя определение XML (насколько я знаю). Вы должны создать его, добавить в коллекцию типов контента и вручную добавить ссылки на поля в коллекцию ссылок на поля.

Грубый пример будет:

using (SPSite site = new SPSite("http://localhost"))
{
    using (SPWeb web = site.OpenWeb())
    {
        SPContentType contentType = new SPContentType(web.ContentTypes["Document"], web.ContentTypes, "Financial Document");
        web.ContentTypes.Add(contentType);
        contentType.Group = "Financial Content Types";
        contentType.Description = "Base financial content type";
        contentType.FieldLinks.Add(new SPFieldLink(web.Fields.GetField("OrderDate")));
        contentType.FieldLinks.Add(new SPFieldLink(web.Fields.GetField("Amount")));
        contentType.Update();
    }
}

Вы не можете управлять идентификаторами типов контента таким образом. Я предпочитаю использовать функции в соответствии с ответом Грега Энслоу.

0 голосов
/ 10 августа 2013

Предоставление типа контента на основе указанной схемы (XML) не поддерживается через API-интерфейс SharePoint 2010 SSOM .Но тут на помощь приходит Reflection, возможности типа контента могут быть расширены с помощью поддержки его создания на основе указанной схемы, как показано ниже:

namespace ContentTypesDeployment
{
    /// <summary>
    /// Content Type 
    /// </summary>
    public static class SPContentTypeExtensions
    {
        /// <summary>
        /// Creates a content type based on the specified schema.
        /// </summary>
        /// <returns>
        /// An instance of the new content type.
        /// </returns>
        /// <param name="contentTypes">Content Type collection</param>
        /// <param name="schemaXml">A Collaborative Application Markup Language (CAML) string that contains the schema.</param>
        public static SPContentType AddContentTypeAsXml(this SPContentTypeCollection contentTypes, string schemaXml)
        {
            SPContentType contentType;
            using (var xrdr = new XmlTextReader(new StringReader(schemaXml)))
            {
                xrdr.ProhibitDtd = true;
                contentType = contentTypes.CreateContentType();
                LoadXmlInternal(contentType, xrdr);
                contentTypes.Add(contentType);
            }
            return contentType;
        }



        /// <summary>
        /// Create content type
        /// </summary>
        /// <param name="contentTypes"></param>
        /// <returns></returns>
        private static SPContentType CreateContentType(this SPContentTypeCollection contentTypes)
        {
            var constructor = (typeof(SPContentType)).GetConstructor(
                BindingFlags.NonPublic | BindingFlags.Instance,
                null,
                Type.EmptyTypes,
                null);

            var contentType = (SPContentType)constructor.Invoke(new object[0]);
            contentType.SetWeb(contentTypes.GetWeb());
            return contentType;
        }

        /// <summary>
        /// Load schema for content type 
        /// </summary>
        /// <param name="contentType"></param>
        /// <param name="xmlReader"></param>
        private static void LoadXmlInternal(SPContentType contentType, XmlReader xmlReader)
        {
            var loadMethod = contentType.GetType().GetMethod("Load",
                BindingFlags.NonPublic | BindingFlags.Instance,
                null,
                new[] { typeof(XmlReader) },
                null);
            loadMethod.Invoke(contentType, new object[] { xmlReader });
        }

        private static SPWeb GetWeb(this SPContentTypeCollection contentTypes)
        {
            var webProp = typeof(SPContentTypeCollection).GetProperty("Web", BindingFlags.NonPublic | BindingFlags.Instance);
            return  (SPWeb)webProp.GetValue(contentTypes, null);
        }


        private static void SetWeb(this SPContentType contentType,SPWeb web)
        {
            var webProp = typeof(SPContentType).GetProperty("Web", BindingFlags.NonPublic | BindingFlags.Instance);
            webProp.SetValue(contentType, web, null);
        }
    }
} 

Использование

using (var site = new SPSite("http://intranet.contoso.com"))
            {
                using (var web = site.OpenWeb())
                {
                    var manifestDoc = new XmlDocument();
                    manifestDoc.Load("ContentTypeManifest.xml");
                    var contentTypeElement = manifestDoc.GetElementsByTagName("ContentType")[0];
                    var ctSchema = contentTypeElement.OuterXml;
                    web.ContentTypes.AddContentTypeAsXml(ctSchema); //create a content type based on the specified schema (XML)
                }
            }

Для получения более подробной информации следуйте этой записи.

0 голосов
/ 29 декабря 2011

Самый распространенный способ - использовать определение функции, а затем активировать ее для семейства сайтов. XML для этой функции будет выглядеть примерно так:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
   <!-- Parent ContentType: Document (0x0101) -->
  <ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e"
               Name="Financial Document"
               Group="Financial Content Types"
               Description="Base financial content type"
               Version="0">
    <FieldRefs>
      <FieldRef ID="{1511BF28-A787-4061-B2E1-71F64CC93FD5}" Name="OrderDate" DisplayName="Date" Required="FALSE"/>
      <FieldRef ID="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}" Name="Amount" DisplayName="Amount" Required="FALSE"/>
    </FieldRefs>
  </ContentType>
</Elements>

См. Полный образец на http://msdn.microsoft.com/en-us/library/ms463449.aspx.

Была ли какая-то конкретная причина, по которой вы пытались использовать вместо этого объектную модель?

...