【问题标题】:sharepoint 2013 change existing publishing page page layout in CSOMsharepoint 2013 更改 CSOM 中现有的发布页面页面布局
【发布时间】:2014-12-25 01:12:32
【问题描述】:

我需要使用 CSOM 更改发布网站中现有发布页面的页面布局。我看到有 CSOM 对象 PublishingWeb,但是缺少获取发布页面的方法。

【问题讨论】:

    标签: sharepoint csom


    【解决方案1】:

    尽管在 SharePoint 2013 CSOM 中引入了新的 Microsoft.SharePoint.Client.Publishing namespace,但与 SSOM 对应的 API 相比,它仍然是相对有限的 API。例如,CSOM PublishingPage class 不会像 SSOM PublishingPage does 那样公开 Layout 属性。

    如何使用 SharePoint CSOM 为发布页面设置页面布局

    以下示例允许在 SharePoint 2010/2013 中使用 CSOM 设置页面布局:

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

    示例

    以下示例演示如何为页面设置Blank Web Part 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();
    

    如何设置列表项的内容类型

    为了设置列表项的内容类型,内容类型必须在列表中可用。下面的方法就是为此目的:

    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();
    }
    

    用法

     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);
    

    【讨论】:

    • 我试过了,页面布局改成了我们的自定义布局,但是内容类型还是OOB,我尝试更新“ContentTypeId”字段但是失败了。
    • 这是因为必须将自定义内容类型添加到列表中。答案已更新,请参阅部分:如何为列表项设置内容类型
    【解决方案2】:

    尝试以下方法:

    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());
        }
       );
    
    }
    

    调用以下命令:

    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

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      相关资源
      最近更新 更多