Solución:
No parece posible recuperar Publishing Image
campos que utilizan el punto final de la colección de elementos de lista.
Existe una solución alternativa, los campos de publicación se pueden recuperar utilizando ListItem.FieldValuesAsHtml
propiedad a través del punto final REST de SharePoint como se muestra a continuación
Limitación: requiere realizar dos solicitudes.
Cómo recuperar campos de publicación con REST de SharePoint 2013
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);
}
Uso
El siguiente ejemplo demuestra cómo recuperar campos de página, incluidos campos de publicación, como 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));
}
Probablemente la mejor solución aquí sería utilizar 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']);
}
}
Desafortunadamente, el campo Imagen de publicación no se puede devolver técnicamente a través de REST (al menos, según este artículo).
Sin embargo, encontré (usando el cliente REST avanzado) que en realidad puede recuperar el html para el campo Imagen de publicación haciendo dos solicitudes. Uno para recuperar el elemento de la lista para el que está intentando obtener la imagen de publicación y otro para recuperar el html de la imagen de publicación a través del FieldValuesAsHtml
propiedad de los resultados devueltos.
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;
};
Si bien no es ideal, al menos con html puede usar jQuery u otro método para extraer la uri de la imagen del elemento html. O simplemente puede insertar el elemento tal cual en el DOM.
¡Espero que esto ayude!