Zhongmin
Zhongmin

Reputation: 1751

sharepoint 2013 change existing publishing page page layout in CSOM

I need to use CSOM to change the page layout of an existing publishing page in a publishing web. I saw there is CSOM object PublishingWeb, but it is lacking method for getting the publishing page.

Upvotes: 3

Views: 7562

Answers (2)

Vadim Gremyachev
Vadim Gremyachev

Reputation: 59338

Even though in SharePoint 2013 CSOM new Microsoft.SharePoint.Client.Publishing namespace was introduced, it is still relatively limited API compared to SSOM counterpart. For example, CSOM PublishingPage class does not expose Layout property like SSOM PublishingPage does.

How to set Page Layout for a publishing page using SharePoint CSOM

The following example allows to set page layout using CSOM in SharePoint 2010/2013:

pageItem["PublishingPageLayout"] = new FieldUrlValue() { Url = "<page layout server relative url>", Description = "<page layout name>" };

Example

The following example demonstrates how to set Blank Web Part page page layout for a page:

var pagesList = ctx.Web.Lists.GetByTitle("Pages");
var pageItem = pagesList.GetItemById(listItemId);
pageItem["PublishingPageLayout"] = new FieldUrlValue() { Url = "/_catalogs/masterpage/BlankWebPartPage.aspx", Description = "Blank Web Part page" };
pageItem.Update();
ctx.ExecuteQuery();

How to set Content Type for a List Item

In order to set Content Type for a List Item, the Content Type have to be available in a List. The below method is intended for that purpose:

public static void SetListItemContentType(ListItem item, ContentType contentType)
{
    var ctx = item.Context;
    //1. Ensure Content Type is available in List
    var list = item.ParentList;
    var result = ctx.LoadQuery(list.ContentTypes.Where(ct => ct.Name == contentType.Name));
    ctx.ExecuteQuery();
    var listContentType = result.FirstOrDefault();
    if (listContentType == null)
    {
        list.ContentTypes.AddExistingContentType(contentType);
        list.Update();
        ctx.ExecuteQuery();
    }
    //2. Set Content Type for List Item 
    item["ContentTypeId"] = contentType.Id;
    item.Update();
    ctx.ExecuteQuery();
}

Usage

 var result = ctx.LoadQuery(ctx.Site.RootWeb.AvailableContentTypes.Where(ct => ct.Name == "Contoso Article Page"));
 ctx.ExecuteQuery();
 var pageContentType = result.FirstOrDefault();

 var pagesList = ctx.Web.Lists.GetByTitle("Pages");
 var pageItem = pagesList.GetItemById(7);
 SetListItemContentType(pageItem, pageContentType);

Upvotes: 8

Jinxed
Jinxed

Reputation: 736

Try the following:

function updatePublishingPage(pageUrl,properties) {

var context = SP.ClientContext.get_current();
var site = context.get_site();    
var web = context.get_web();
var pageFile = web.getFileByServerRelativeUrl(pageUrl);
var pageItem = pageFile.get_listItemAllFields();
context.load(site);
context.load(pageItem);

context.executeQueryAsync(
    function () {

        for(var propName in properties) {
           var property = properties[propName]; 
           var itemValue = pageItem.get_item(propName);
           if(property.Type == "Url") {
               var pagelayoutUrl = site.get_url() + property.Value.split(',')[0].trim();
               itemValue.set_url(pagelayoutUrl);
               var pagelayoutDesc = property.Value.split(',')[1].trim();
               itemValue.set_description(pagelayoutDesc);
               pageItem.set_item(propName,itemValue);
           }

        }
        pageItem.update();
        context.load(pageItem);
        context.executeQueryAsync(
            function () {
               console.log(pageItem);
            },
            function (sender, args) {
               console.log('Failed: ' + args.get_message());
            }
        );    
    },
    function (sender, args) {
        console.log('Failed: ' + args.get_message());
    }
   );

}

call the following:

var properties = {'PublishingPageLayout' : {'Type': 'Url','Value': '/_catalogs/masterpage/ArticleLeft.aspx, Image on left'}};  //Image on Left page layout
updatePublishingPage('/news/Pages/Latest-News.aspx',properties);

Reference

Upvotes: 0

Related Questions