2010-02-18 3 views
2

다른 CMS 시스템에서 SharePoint 2010으로 콘텐츠 마이그레이션 작업을 받았습니다.프로그래밍 방식으로 기사 페이지를 SharePoint 사이트에 추가하려면 어떻게합니까?

이전 시스템의 데이터는 캡처하기가 쉽고 페이지 계층 구조가 간단하므로 걱정하지 않아도됩니다.

그러나 나는 완전히 flummoxed 코드 작성 방법에 대해서도 설명합니다. 내 시스템에 셰어 포인트가 설치되어 있지 않고 콘솔 응용 프로그램으로 코드를 작성하려고하므로 Microsoft.SharePoint.Client 네임 스페이스를 사용하고 있으므로 ClientContext을 사용하고 있습니다. (다른 한편으로, 나는 필요하다면 다른 해결책으로 들어가기를 기꺼이한다).

내 게임 : 마스터 페이지를 사용하는 일부 폴더 계층 구조로 업로드 된 페이지를 가져 오려면 머리글 웹 파트에 페이지 제목이 있고 몸에 내용 편집 가능한 웹 파트가 있으므로 모든 사용자가 컨텐츠를 가져 와서 편집 할 수 있습니다.

것들 지금까지 시도했다 :

  • 폴더 "사이트 페이지"에 영문 파일을 추가 FileCollection.Add()를 사용. 이것은 브라우저에서 html을 렌더링하지만 사용자가 페이지를 편집 할 수있는 기능을 활성화하지 않습니다.
  • ListItemCollection.Add()를 사용하여 사이트에 페이지를 추가했지만 필요한 필드를 알지 못했습니다. 또한 나는 내가 FileCollection.Add() '사이트 페이지'에
  • 업로드를 사용해야합니다 말을 런타임 오류를 내놓았다 기억 대신 '페이지'
  • 이렇게 많은 다른 사람의 ... 내 머리 :(
흐름 내가 인터넷에서 볼 수

유일한 그럴듯한 것은 PublishingWeb와 함께 PublishingPage 유형을 사용하는 것입니다. 그러나, PublishingWeb 만 내 워크 스테이션에서 SharePoint 응용 프로그램을 호스팅하는 사실로 저를 필요로하는 SPWeb 개체로 구성 될 수있다.

누군가가 크게 감사하겠습니다 손을 빌릴 수 있다면 :

+0

은 (는) Sharepoint에 있습니다. ^^ –

답변

1

실제 게시 방법없이 게시 페이지를 만드는 방법은 없습니다.

새 기사 페이지를 만들면 페이지 내에 몇 개의 xml 매개 변수 만 생성되며 레이아웃 자체는 /_catalogs/masterpage/article-XXXX.aspx 파일에 있습니다.

페이지 라이브러리에서 생성 된 기본 파일을 다운로드하고, 구조를 이해하고, 데이터로 XML을 채운 다음 FileCollection을 사용하여 Pages 도큐멘트 라이브러리로 다시 업로드 할 수 있습니다. 이것이 유일한 추측입니다.

편집 : 샘플 기사 페이지

<%@ 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> 

하나를 잡아가, 히트 페이지 라이브러리 => 컨텐츠 메뉴 => = 보내기> 다운로드 작업을해야 페이지 파일을 업로드 사본

+0

클라이언트 컨텍스트를 사용하여 새 페이지를 만드는 데 성공 했으므로이 솔루션을 허용 된 솔루션으로 표시했습니다. 그러나 클라이언트 API가 ExecuteQuery()를 실행할 때마다 가져 오는 데 몇 초가 걸리기 때문에 마지막 푸시에 서버 측 API를 사용하게 될 수도 있습니다. – soniiic

1

, 한 항목에 대한 설정과 문서 자체의 설정을 가져옵니다. 파일을 업로드하면 내용 유형과 속성을 적절하게 설정할 수 있습니다. 수동으로 페이지를 수동으로 만드는 경우 모든 올바른 설정을 가진 개체를 가져올 수 있어야합니다.

그러나 웹 서비스에 의존하지 않고 셰어 포인트 서버에서 실행할 콘솔 응용 프로그램을 개발하도록 설정하는 것이 좋습니다. 서버 측 api (PublishingPage 포함)는 작업하기가 훨씬 쉽습니다.

+0

미안하지만 우연히 투표했습니다. 그것의 균형을 맞추기 위해 투표했습니다. –

2

다음은 페이지를 만드는 데 사용하는 방법입니다. 아 키노 씨보다 페이지를 만드는 방법이 더 지원되는 것 같습니다. 이것은 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(); 
     } 
    } 
+0

고마워, 나는 이것이 내가 결국 사용하려고하는 것이라고 생각한다. 클라이언트 쿼리가 각 페이지를 만들고 업로드하는 데 너무 오래 걸렸으며 새 페이지를 10K 만들려면 앞뒤가 너무 길어질 수 있습니다. 제공 한 코드는 멋지게 보이지만 페이지의 HTML 내용은 어디에 넣을 까? "Content"라는 필드의 fieldDataCollection 내에 있습니까? – soniiic

+0

이것은 HTML을 어디로 가고 싶은지에 달려 있습니다. 이것은 게시 페이지입니다. 그 내용은 실제로 목록 항목 열에 있습니다. 이것이 바로 fieldDataCollection 컬렉션입니다. '설명'키를 추가하면 항목 열 설명 등이 채워집니다. – ArjanP

관련 문제