web-dev-qa-db-ja.com

Sharepoint2013で公開画像フィールドを取得REST Api / CSOM

Sharepoint 2013 REST APIを使用して、Sharepointからすべてのニュースアイテムを取得しています。公開画像フィールドを含むいくつかのプロパティを持つカスタムContentType'Newsitem 'を作成しました。

  var contentTypeId = "0x01100018B03AC7E8312648AEA00851DEDBCAF802";
  var standardUri = "https://examplesite.com/blog/_api/lists/getbytitle('Messages')/items?$top=7&$filter=startswith(ContentTypeId,'" + contentTypeId + "')";
  var selectiveUri = "https://examplesite.com/blog/_api/lists/getbytitle('Messages')/items?$top=7&$filter=startswith(ContentTypeId,'" + contentTypeId + "')&$Select=Title,Teaser,Body,ShowAt,TeaserImg";

REST呼び出しにstandardUriを使用して、すべてのプロパティを取得しますが、TeaserImgは取得しません。TeaserImgを明示的に選択すると、もちろん呼び出しは失敗します。

TeaserImgが見つからないのはなぜですか。Sharepoint2013REST Apiではこれができないので、代わりにCSOMを使用する必要がありますか?

10
Gigi2m02

リストアイテムコレクションエンドポイントを使用してPublishing Imageフィールドを取得することはできないようです。

回避策があります。以下に示すように、SharePoint RESTエンドポイント)を介してListItem.FieldValuesAsHtmlプロパティを使用して公開フィールドを取得できます。

制限:2つのリクエストを実行する必要があります。

SharePoint 2013RESTを使用して発行フィールドを取得する方法

function getJson(endpointUri, success, error) 
{    
    $.ajax({       
       url: endpointUri,   
       type: "GET",   
       processData: false,  
       contentType: "application/json;odata=verbose",
       headers: {   
          "Accept": "application/json;odata=verbose"
       }, 
       success: success,
       error: error
    });
}


function getPublishingPage(webUrl,listName,listItemId,publishingProperties, success, failure) 
{
    var itemUri =  webUrl + "/_api/web/lists/getbytitle('" + listName + "')/items(" + listItemId + ")";  
    getJson(itemUri,
       function(data){
           var pageItem = data.d;

           var selectProperties = [];  
           for(var idx in publishingProperties){
               if(!pageItem.hasOwnProperty(publishingProperties[idx])){
                   selectProperties.Push(publishingProperties[idx]);
               }
           }
           if(selectProperties.length > 0) {
              //construct an additional query 
              var query = '/FieldValuesAsHtml?$select=' + selectProperties.join(',');
              var endpointUri = pageItem['__metadata'].uri + query;
              getJson(endpointUri,
                 function(data){
                    for(var property in data.d){
                       if(property == "__metadata") continue; 
                       pageItem[property] = data.d[property];   
                    }
                    success(pageItem);  
                 },
                 failure);
           } 
           else {
              success(pageItem);
           }   
        },
       failure);
}

使用法

次の例は、PublishingRollupImageなどの公開フィールドを含むページフィールドを取得する方法を示しています。

getPublishingPage(_spPageContextInfo.webAbsoluteUrl,'Pages',3,['PublishingRollupImage','PublishingPageImage'],printPageDetails,logError);

function printPageDetails(pageItem)
{
    console.log('Page Content: ' + pageItem.PublishingPageContent);
    console.log('Page Title: ' + pageItem.Title);
    console.log('Page Rollup Image ' + pageItem.PublishingRollupImage);
}

function logError(error){
    console.log(JSON.stringify(error));
}

おそらくここでの最善の解決策はCSOMを利用することでしょう

function getListItems(listTitle,success,error)
{
   var ctx = SP.ClientContext.get_current();
   var list = ctx.get_web().get_lists().getByTitle(listTitle);
   var items = list.getItems(SP.CamlQuery.createAllItemsQuery());
   ctx.load(items);
   ctx.executeQueryAsync(function() {
       success(items);
   },error);
}



getListItems('Pages',printPageItemsDetails,logError);

function printPageItemsDetails(pageItems)
{
    for(var i = 0; i < pageItems.get_count();i++) {
        var pageItem = pageItems.getItemAtIndex(i);
        console.log(pageItem.get_fieldValues()['PublishingPageContent']);
        console.log(pageItem.get_fieldValues()['PublishingRollupImage']);
    }
}
14

残念ながら、Publishing Imageフィールドは、REST(少なくとも この記事 によると)を介して技術的に返すことはできません。

ただし、( Advanced REST client を使用して)2つのリクエストを行うことで、PublishingImageフィールドのhtmlを実際に取得できることがわかりました。1つはリストアイテムを取得するためのものです。これはパブリッシングイメージを取得しようとしています。もう1つは、返された結果のFieldValuesAsHtmlプロパティを介してパブリッシングイメージhtmlを取得しようとしています。

getPublishingImage(listname, id){
    var publishingImage = '';

    $.ajax({
        url:        _spPageContextInfowebroot.webAbsoluteUrl + '/_api/web/lists/getbytitle(\'' + listname + '\')/items(' + id + ')',
        method:     'GET',
        headers:    {
            Accept:     'application/json; odata=verbose'
        },
        success:    function(data, request){
            // List item retrieved. Fetch the Publishing Image.
            var publishingImageUri = data.d.0.FieldValuesAsHtml.__deferred.uri;

            // Query SharePoint
            $.ajax({
                url:        publishingImageUri,
                method:     'GET',
                headers:    {
                    Accept:     'application/json; odata=verbose'
                },
                success:    function(data, request){
                    publishingImage = data.d.Image;
                }
            });
        }
    });

    // Return the Publishing Image html
    return publishingImage;
};

理想的ではありませんが、少なくともhtmlでは、jQueryまたは別のメソッドを使用して、html要素から画像のURIを抽出できます。または、要素をそのままDOMに挿入することもできます。

お役に立てれば!

6
scullytr
function LoadArticle(item) {
  return GetPublishingPageImage(item, ["DCCAIContentImage"]).then(function(
    pub
  ) {
    for (var property in pub.d) {
      if (property == "__metadata") continue;
      item.DCCAIContentImage(pub.d[property]);
    }
  });
}

function GetPublishingPageImage(curItem, publishingProperties) {
  var query = "/FieldValuesAsHtml?$select=" + publishingProperties;

  //debugger;
  var endpointUri = curItem["__metadata"].uri + query;
  //      var endpointUri = curItem.__metadata().uri + query;

  return $.ajax({
    url: endpointUri,
    type: "GET",
    processData: false,
    contentType: "application/json;odata=verbose",
    headers: {
      Accept: "application/json;odata=verbose"
    }
  }).then(function(response) {
    return response;
  });
}
0
user79594