Reputation: 1751
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
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.
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();
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
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);
Upvotes: 0