Partager via


create publishing pages in portal sites programmatically and add it into a specific folders inside the Pages library

Well, we all know how we can create publishing pages in portal sites from UI. In portal sites, whenever we create a publishing page we need provide the name, title, description and a layout page. Once if we created the publishing page then we can check in, approve and publish it. All those steps we can do programmatically. Below I am giving the code snippet for creating publishing pages programmatically (add it into a specific folder) and after that redirect the user to that page with edit mode.

<codeSnippet>

using

System;

using

System.Collections.Generic;

using

System.Text;

using

Microsoft.SharePoint;

using

Microsoft.SharePoint.Publishing;

namespace

ConsoleApplication3

{

class Program

{

static void Main(string[] args)

{

string newPageUrl = "";

SPSecurity.RunWithElevatedPrivileges(delegate()// executing this code with elevated privileges will help whenever we create the publishing pages from a sharepoint portal site for an another portal site.If we create the publishing page within a site collection then this code will execute fine without elevated privileges.

{

using (SPSite site = new SPSite("https://sigr8-1b:45907/sites/sas")) // provide your portal site URL

{

using (SPWeb web = site.OpenWeb())

{

web.AllowUnsafeUpdates =

true;

SPList list = web.Lists["Pages"];

String url = list.RootFolder.ServerRelativeUrl.ToString();

// create a new folder

string strFolderName = "Folder7" ;

SPListItem newFolder = list.Items.Add(url, SPFileSystemObjectType.Folder, strFolderName);

newFolder.Update();

// if you want to add the new page in a existing folder you can take it by it's ID like below

//SPListItem newFolder = list.Folders.GetItemById(3);

// creating a publishing web

PublishingWeb publishingWeb = PublishingWeb.GetPublishingWeb(web);

PageLayout[] layouts = publishingWeb.GetAvailablePageLayouts();

PageLayout layout = layouts[0];

string pageName = "MyPublishingPage5.aspx";

PublishingPage newPage = publishingWeb.GetPublishingPages().Add(newFolder.Folder.ServerRelativeUrl + "/"+ pageName, layout);

// if you want to add the new page direclty inside the pages library then you can use the below line of code

//PublishingPage newPage = publishingWeb.GetPublishingPages().Add(pageName, layout);

// setting the URL value to the newPageUrl for redirecting the user after creating it

newPageUrl = web.Url +

"/" + newPage.Url;

newPage.Description =

"This my sample publishing page";

newPage.Title =

"My Publishing Page";

newPage.Update();

//Now we can checkin the newly created page to the “pages” library

SPFile pageFile = newPage.ListItem.File;

if (pageFile.CheckOutStatus != SPFile.SPCheckOutStatus.None)

{

pageFile.CheckIn(

"CheckedIn");

pageFile.Publish(

"publihsed");

}

// If you are executing this code in a web app then if you want to redirect the user to the newly created page with edit mode. Remember, we need to checkout the page before redireting the user to that page in edit mode, other wise you will get an Authoring error with message “You have not checked out this page. Click ‘Edit Page’ to edit the page.”

pageFile.CheckOut();

Response.Redirect(newPageUrl +

"?ControlMode=Edit&DisplayMode=Design");

}

}

});

}

}

}

</codeSnippet> 

Happy coding !

Comments

  • Anonymous
    March 15, 2008
    PingBack from http://msdnrss.thecoderblogs.com/2008/03/15/create-publishing-pages-in-portal-sites-programmatically/

  • Anonymous
    January 06, 2009
    I think subfolders inside Pages Library are not supported .. correct me If I am wrong ...

  • Anonymous
    February 07, 2009
    Subfolders are not supported by Microsoft: http://support.microsoft.com/default.aspx?scid=kb;EN-US;948614 Be very cautious while using subfolders.

  • Anonymous
    March 04, 2009
    Thanks sowmyancs I used this to create pages in other Library than Pages.

  • Anonymous
    May 07, 2009
    Publishing the pages (as listed in the code above) leaves the pages in a "pending" approval status.  Is there any way to programatically approve the pages as well?  I've looked but so far can find no way to do this.  I want to generate lots of publishing pages programatically and so it'd be great if I didn't have to click on each one and approve them through the UI.  I've looked into the WorkflowManager object but it only seems to have methods to start or cancel a workflow.  Thanks much!

  • Anonymous
    May 07, 2009
    Found it - just use the Publish and Approve methods of the SPFile class: publishingPage.CheckIn(checkInComment); SPFile pageFile = publishingPage.ListItem.File;            pageFile.Publish(checkInComment);            pageFile.Approve(checkInComment); Listed here: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.publishingpage.description.aspx

  • Anonymous
    June 24, 2009
    Is there any way to do similar code on client application (I'd like implement some functionality into TFS UI Control under Visual Studio Addin) Cheers, Peter

  • Anonymous
    June 24, 2009
    Is there any way to do similar code on client application (I'd like implement some functionality into TFS UI Control under Visual Studio Addin)? Cheers, Peter

  • Anonymous
    November 12, 2009
    Hi i am following this approach . But pages created by this way have error . after creating page if i browse it shows me error page not found , but it is there in subfolder

  • Anonymous
    February 06, 2014
    I am getting this error "The site is not valid. The ‘Pages’ document library is missing" please help