Visualizzare i metadati degli allegati delle liste sharepoint

In Sharepoint, mentre le document library sono “documento-centriche” (un documento con eventuali metadati), le liste sono “metadati-centriche“, ovvero aggregazioni di metadati con uno o più eventuali allegati.

Gli allegati nelle liste in Sharepoint 2007 non hanno la stessa dignità di quelli delle document library: non sono versionabili versionamento e non hanno attributi, venendo esposti nel dettaglio di un Item dopo i metadati e solo come elenco di titoli con collegamento ipertestuale.

In un progetto che sto seguendo, un obiettivo è quello di ordinare e visualizzare gli allegati di un ListItem insieme alla loro data di caricamento/modifica, utilizzando solo semplici personalizzazioni del frontend e quindi senza scrivere bytecode. Devono quindi essere recuperati gli attributi/metadati degli allegati (per es. data e ora di creazione, data e ora di modifica).

Purtroppo tramite

  • interfaccia standard
  • personalizzazione delle webpart con Sharepoint Designer (SPD)
  • utilizzo dei web services di sharepoint (per es. lists.aspx con SPServices) in logica lato client (javascript)

non c’è possibilità di reperire tali metadati, anche se questi esistono: per esempio vengono visualizzati in Explorer usando la funzione “Apri con Esplora Risorse” e dai vari applicativi MS Office integrabili con Sharepoint.

Queste funzioni e questi applicativi usano il protocollo standard WEBDAV, implementato anche da Sharepoint, e quindi l’idea è quella di utilizzare tale protocollo dal browser tramite javascript per leggere questi dati.

Esistono molte librerie javascript, ma ho preferito spendere qualche minuto per fare un po’ di reverse-engineering del protocollo (utilizzando Wireshark) implementando così una funzione ad hoc, e acquisendo poi ulteriore know how.

In sisntesi WebDAV è un’estensione del protocollo HTTP, poiché aggiunge alcuni nuovi metodi come PROPFIND, MOVE, DELETE in aggiunta ai canonici  GET, POST, PUT.

Per i miei scopi ho analizzato solo il metodo PROPFIND, che permette di leggere (anche a più livelli) gli attributi delle risorse partendo da una data URI, in particolare vengono restituite in un Blob XML le seguenti informazioni:

  • l’url
  • il displayname
  • la data di creazione (UTC)
  • la data di modifica (UTC)
  • la dimensione in byte
  • l’autore dell’ultima modifica
  • la tipologia della risorsa (file o folder)

Per ottenere la risposta XML basta effettuare una chiamata jquery del tipo:

$.ajax({ 
 url: davurl,
 method: "PROPFIND",
 async: false,
 headers: { Depth: 1 } /* 0 = only the url-resource, 1 = the folder and the resources contained , undefined = recurse subfolders */
 }).done(function(data){ 
    var x = data.xml;
   // here analize the xml response
 });

I parametri sono l’url della risorsa (file o cartella) e  il numero di livelli  da analizzare (Depth ), che viene invece passato in un apposito campo nell’header della richiesta HTTP.

Per leggere la risposta usiamo sempre jquery (o meglio l’estensione xpath) per navigare l’XML:

$(x).xpath("//D:response",resolver).each(function(){ 
 
 var url = $(this).xpath("D:href",resolver).text();
 var displayname = $(this).xpath("D:propstat/D:prop/D:displayname",resolver).text();
 var creationdate =$(this).xpath("D:propstat/D:prop/D:creationdate",resolver).text();
 var size =$(this).xpath("D:propstat/D:prop/D:getcontentlength",resolver).text();

});

dove

resolver = function(prefix){
   return "http://www.w3.org/1999/xhtml"; 
}

Per renderne più agevole l’utilizzo, ho incapsulato il “codice WebDav” in una classe javascript “DavResource” (cfr. allegato all’articolo), che ha come prerequisiti le seguenti librerie:

  • JQuery (jquery.js >= 1.9.1)
  • Xpath (jquery.xpath.js)
  • MomentJs (moment.min.js)

In Sharepoint basta quindi personalizzare la pagina contenente il dettaglio del ListItem di interesse, ovvero DispForm.aspx, inserendo una Webpart Editor Contenuto collegata ad uno script HTML precedentemente caricato in Sharepoint stesso, contenente i riferimenti  agli script e la seguente sezione di codice:

<script type="text/javascript">

$(function() {
 $("#idAttachmentsTable").find("a").each(function(){
  var lnk = $(this).attr("href");
  var dav = DavResource.getDAVResource(lnk.replace(/ /ig,"%20"));
  $(this).after("&nbsp;"+ dav.lastmodified); 
 });
} 
 
</script>

Tale codice individua la tabella degli attachment e per ogni attachment recupera ed espone i relativi metadati (qui viene esposta solo la data di ultima modifica)

Metadati allegati sharepoint

Metadati allegati sharepoint

Note

I 2 metodi statici getDAVResource/getDAVResources della classe DavResource ritornano oggetti (rispettivamente un singolo ed un array) della classe stessa, aventi i seguenti attributi:

  • url
  • displayname
  • creationdate (formato ISO in Localtime)
  • lastmodified  (formato ISO in Localtime)
  • isfolder
  • contentlength
  • modifiedby

Download

Scarica la classe javascript DavResourcejquery.DavResource.js.zip (1KB), che non vuole essere sicuramente un progetto finito, ma un punto di partenza per uno nuovo.

Alcuni riferimenti

WebDAV Resources http://www.webdav.org/

WebDav for dummies http://blog.coralbits.com/2011/07/webdav-protocol-for-dummies.html

 

 

Questa voce è stata pubblicata in Sharepoint, Software e contrassegnata con , . Contrassegna il permalink.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


*