Как программно добавить страницу статьи на сайт sharepoint? - PullRequest
2 голосов
/ 18 февраля 2010

Мне было поручено выполнить миграцию контента из другой системы CMS в SharePoint 2010.

Данные в старой системе довольно легко собирать, а иерархия страниц проста, поэтому меня это не беспокоит.

Однако я полностью сбит с толку о том, как даже создать страницу в коде. Я использую пространство имен Microsoft.SharePoint.Client, так как в моей системе не установлена ​​sharepoint, и я хочу закодировать это как консольное приложение, поэтому я использую ClientContext. (С другой стороны, я готов перейти к другим решениям, если это необходимо).

Моя конечная игра : чтобы загрузить страницу в некоторую иерархию папок, которая использует главную страницу, имеет заголовок страницы в веб-части заголовка и большую веб-часть, редактируемую содержимым, в тело, чтобы любой пользователь мог прийти и отредактировать контент.

То, что я до сих пор пробовал :

  • Использование FileCollection.Add () для добавления файла aspx в папку «Страницы сайта». Это отображает HTML в браузере, но не позволяет пользователю редактировать страницу
  • Использование ListItemCollection.Add () для добавления страницы на сайт, но я не знал, какие поля мне нужны. Также я помню, что возникла ошибка во время выполнения, в которой говорилось, что я должен использовать FileCollection.Add ()
  • Загрузка на «Страницы сайта» вместо «Страницы»
  • Так много других ... моя голова: (

Единственная правдоподобная вещь, которую я вижу в сети, - это использование типа PublishingPage вместе с PublishingWeb. Однако PublishingWeb может быть создан только из объекта SPWeb, который требует от меня фактического размещения приложения sharepoint на моей рабочей станции.

Если кто-нибудь может протянуть руку, которая была бы очень признательна :) 1033 *

Ответы [ 3 ]

2 голосов
/ 19 февраля 2010

Вот метод, который я использую для создания страниц. Кажется, это более поддерживаемый способ создания страниц, чем у г-на Акино. Хотя это и для MOSS 2007, я уверен, что аналог существует в 2010 году. Кроме того, я бы рекомендовал создавать консольные приложения, используя полную объектную модель. Вам придется запустить его на самом сервере, но это не кажется большой проблемой для миграции? Таким образом, вы никоим образом не будете ограничены.

public static void CreatePage(string url, string pageName, string title, string layoutName, Dictionary<string, string> fieldDataCollection)
    {
        var relUrl = new Uri(url);

        using (SPSite site = new SPSite(url))
        using (SPWeb web = site.AllWebs[relUrl.AbsolutePath])
        {
            if (!PublishingWeb.IsPublishingWeb(web))
                throw new ArgumentException("The specified web is not a publishing web.");
            PublishingWeb pubweb = PublishingWeb.GetPublishingWeb(web);
            PageLayout layout = null;
            string availableLayouts = string.Empty;
            foreach (PageLayout lo in pubweb.GetAvailablePageLayouts())
            {
                availableLayouts += "\t" + lo.Name + "\r\n";
                if (lo.Name.ToLowerInvariant() == layoutName.ToLowerInvariant())
                { layout = lo; break; }
            }
            if (layout == null)
                throw new ArgumentException("The layout specified could not be found.  Available layouts are:\r\n" + availableLayouts);

            if (!pageName.ToLowerInvariant().EndsWith(".aspx")) pageName += ".aspx";
            PublishingPage page = pubweb.GetPublishingPages().Add(pageName, layout);
            page.Title = title;
            SPListItem item = page.ListItem;

            foreach (string fieldName in fieldDataCollection.Keys)
            {
                string fieldData = fieldDataCollection[fieldName];
                try
                {
                    SPField field = item.Fields.GetFieldByInternalName(fieldName);

                    if (field.ReadOnlyField)
                    {
                        Console.WriteLine("Field '{0}' is read only and will not be updated.", field.InternalName);
                        continue;

                    }
                    if (field.Type == SPFieldType.Computed)
                    {
                        Console.WriteLine("Field '{0}' is a computed column and will not be updated.", field.InternalName);
                        continue;
                    }
                    if (field.Type == SPFieldType.URL)
                    {
                        item[field.Id] = new SPFieldUrlValue(fieldData);
                    }
                    else if (field.Type == SPFieldType.User)
                    {
                       // AddListItem.SetUserField(web, item, field, fieldData);
                    }
                    else
                    {
                        item[field.Id] = fieldData;
                    }
                }
                catch (ArgumentException)
                {
                    Console.WriteLine("WARNING: Could not set field {0} for item {1}.", fieldName, item.ID);
                }
            } 
            page.Update();
        }
    }
1 голос
/ 18 февраля 2010

Загрузка файла подкачки должна работать, при условии, что вы получите настройки как для самого элемента, так и для самого документа. После загрузки файла вы можете установить тип содержимого и свойства соответствующим образом. Если вы сначала создадите страницу вручную, вы сможете получить объект со всеми необходимыми настройками.

Однако я настоятельно рекомендую настроить консольное приложение, которое будет работать на сервере sharepoint, а не полагаться на веб-службы. API-интерфейсы на стороне сервера (включая PublishingPage), как правило, работать с ними намного проще.

1 голос
/ 18 февраля 2010

Я не вижу способа создания страницы публикации без реальных методов публикации.

Когда вы создаете новую страницу статьи, она создает только несколько параметров xml внутри страницы, сам макет находится в файле /_catalogs/masterpage/article-XXXX.aspx.

Вы можете попробовать загрузить собственный файл, созданный в библиотеке документов Pages, понять его структуру, заполнить XML данными и затем загрузить его обратно в библиотеку документов Pages с помощью FileCollection - это мое единственное предположение.

Редактировать: образец страницы товара

<%@ Page Inherits="Microsoft.SharePoint.Publishing.TemplateRedirectionPage,Microsoft.SharePoint.Publishing,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" %>
<%@ Reference VirtualPath="~TemplatePageUrl" %> 
<%@ Reference VirtualPath="~masterurl/custom.master" %>
<html xmlns:mso="urn:schemas-microsoft-com:office:office" xmlns:msdt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"><head>
&nbsp;<!--[if gte mso 9]><xml>
<mso:CustomDocumentProperties>
<mso:PublishingContact msdt:dt="string">1073741823</mso:PublishingContact>
<mso:display_urn_x003a_schemas-microsoft-com_x003a_office_x003a_office_x0023_PublishingContact msdt:dt="string">System Account</mso:display_urn_x003a_schemas-microsoft-com_x003a_office_x003a_office_x0023_PublishingContact>
<mso:PublishingContactPicture msdt:dt="string"></mso:PublishingContactPicture>
<mso:PublishingContactName msdt:dt="string"></mso:PublishingContactName>
<mso:ContentTypeId msdt:dt="string">0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390078FB5FE740F6714B9595501175ECD8F000727044016EAB3B45B9E104498E366C85</mso:ContentTypeId>
<mso:Comments msdt:dt="string"></mso:Comments>
<mso:PublishingContactEmail msdt:dt="string"></mso:PublishingContactEmail>
<mso:PublishingPageLayout msdt:dt="string">http://dmserver008/_catalogs/masterpage/ArticlePage.aspx, EstudoAndre</mso:PublishingPageLayout>
</mso:CustomDocumentProperties>
</xml><![endif]--><title>New Article</title></head>

Чтобы получить его, нажмите библиотеку страниц => Меню содержимого => Отправить => Скачать копию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...