mercoledì 29 dicembre 2010

Creare una feature per il deploy delle liste SharePoint

Ci sono diversi metodi per fare il deploy di una lista:
- salvare la lista come list template direttamente dall'interfaccia di SharePoint.
- scrivere una feature affinche' costruisca la lista interamente via codice.
- realizzare una feature definita "list definition".

Per un lavoro veloce le list defintion sono da preferirsi, non occorre scrive codice e non presentano il problema legato alla perdita dei riferimenti alle liste di lookup, come invece accade con le list template.

Per generare la feature possiamo utilizzare il tool "SharePoint Solution Generator", installato con il package "Visual Studio 2008 Extensions v1.3".



quindi selezionare l'icona 'List Definition', il site dove si trovano le liste, le liste che vogliamo esportare e infine confermare il salvataggio.


Il salvataggio crea per ogni lista una cartella, alcuni dei file contenuti in queste cartelle dovranno essere modificati per adattarli alle nostre esigente, questi sono: schema.xml e listdefinition.xml

Una delle modifiche prevede la riassegnazione delle liste di lookup, quindi dobbiamo aprire il file schema.xml e sostituire tutti gli attributi List dei Field di tipo Lookup o LookupMulti (rapresentati da dei guid) con il path della lista di lookup, ad esempio:

<Field Type="Lookup" List="Lists/LOOKUP_LIST"
<Field Type="LookupMulti" List="Lists/LOOKUP_LIST"


Un'altra modifica prevede l'assegnazione di un codice numerico univoco alla proprietà Type dello schema.xml e del file ListDefinition.xml, ad esempio: 10000.

Per chi fosse interessato alla descrizione degli elementi presenti nel file schema.xml puo' dare un'occhiata al seguente link: List Schema Elements


Se avete la necessita' di fare il deploy di una lista con il suo contenuto, potete usare il tool SPListInstanceGenerator che ho realizzato per esigenze personali (in fondo all'articolo e' possibile farne il download). Questo tool crea il file ListInstance.xml che andra' poi sostituito a quello presente nella cartella della lista corrispondente.
Il file xml generato dal tool non e' ben formattato, per cui prima di procedere consiglio sempre di riformattarne il contenuto. Procedere quindi caricando l'xml in Visual Studio, riformattare il file utilizzando la combinazione di tasti CTRL+A (per selezionare l'intero contenuto), CTRL+K e CTRL+F e infine salvare il file senza cambiarne il nome.
Se poi il contenuto dell'xml dovesse contenere dei caratteri speciali dovrete aver cura di incapsularli tra i seguenti tag:

<![CDATA[
...
]]>



Ci siamo quasi, una volta che le liste sono state definite non ci resta che aggiungere il file feature.xml al progetto, questo file infatti dice cosa e dove andrà installata la feature, e infine compilare il pacchetto wsp.

Il pacchetto wsp da utilizzarsi per il deploy puo' essere generato a mano editando un file ddf, il manifest e infine costruendo il file cab con il tool makecab, questo file non e' altro che un wsp.
In alternativa e' possibile installare il tool WSPBuilder e creare il progetto della feature direttamente da Visual Studio 2008.


Download:
Visual Studio 2008 Extensions v1.3
WSPBuilder
SPListInstanceGenerator

sabato 25 dicembre 2010

Accedere agli oggetti SharePoint con i privilegi alzati

Alzare i privilegi di SharePoint da codice per poter eseguire delle operazioni altrimenti non consentite in forma anonima è possibile utilizzando il seguente codice C#:

SPSecurity.RunWithElevatedPrivileges(() =>
{
using (SPSite site = new SPSite(siteUrl))
{
using (SPWeb web = site.OpenWeb())
{
// Qui si possono usare gli oggetti site e web con i privilegi alzati
...
}
}
});


Se si vuole aprire il root web utilizzare invece questa istruzione:

using (SPWeb rootWeb = site.OpenWeb(site.RootWeb.ID))


Nell'esempio si è creato l'SPSite e si è aperto il SPWeb utilizzando l'istruzione using in modo da avere il dispose automatico una volta usciti dallo scope.

Il codice sopra usa una lambda expression (=>), se invece si desidera utilizzare il metodo standard la sintassi è la seguente:

SPSecurity.RunWithElevatedPrivileges(delegate()
// ....
});


non credo che ci siano sostanziali differenze tra i due metodi, è comunque consigliato farne l'abitudine visto che con SharePoint 2010 verranno utilizzate le espression lambda al posto delle query CAML per leggere dalle liste.

Per utilizzare il metodo lambda basta includere il seguente namespace:

Microsoft.SharePoint.Linq namespace