Il blog di Giuseppe Marchi - SharePoint MVP
NAVIGATION - SEARCH

Le Feature di Sharepoint

Le Feature di Sharepoint
Data: 23/06/2007
Categoria: Sharepoint

Le feature, sicuramente la novità più importante della nuova versione di Sharepoint, sono state introdotte per ridurre la complessità di personalizzazione del comportamento della maggior parte degli oggetti presenti in un sito Sharepoint, complessità ormai nota dalla precedente versione del prodotto.
Ora, infatti, la maggior parte delle funzionalità di base sono offerte attraverso le feature; è perciò possibile implementare moltissime personalizzazioni in maniera veramente semplice, evitando le copie di intere cartelle e di innumerevoli file per fare poi dei piccoli cambiamenti.
Il meccanismo sottostante, proprio dei Sharepoint Services 3.0, date le suddette proprietà di estensione, viene utilizzato largamente anche in MOOS 2007, prodotto che aggiunge più o meno un ottantina di nuove feature.
Per dirla in breve, quindi, nella nuova versione di Sharepoint, le feature sono veramente ovunque !
Abbiamo, infatti, delle feature per:
  • creare template di sito
  • creare template di lista
  • inserire dei dati di default all'interno di particolari template di lista
  • creare colonne di sito
  • creare content type
  • definire gli event handler per particolari template di lista
  • eseguire il deploy di una web part
  • creare menu di azioni personalizzati e suddividerli in gruppi
  • nascondere menu di azioni di default
  • eseguire il deploy di master page e page layout (per siti con le funzionalità di publishing attivate)
  • definire dei workflow personalizzati
  • definire insiemi di file (moduli) aggiuntivi
  • definire degli user control da inserire nella pagine di siti
Nota: l'elenco completo di tutte le feature installate, è disponibile al seguente percorso:
Local_Drive:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES

Inoltre, un'altra funzionalità davvero comoda presente nel sistema che sta alla base delle feature, è rappresentata dal fatto che ognuno di questi oggetti può essere attivato o meno all'interno di un particolare campo d'azione (scope); in questo modo abbiamo la possibilità di decidere in che punto del sistema deve essere eseguito il nostro codice personalizzato.

Per capirci meglio, dovete provare a vedere una feature come un contenitore di più definizioni, ognuna delle quali rappresenta una personalizzazione legata ad uno degli oggetti o ad una delle caratteristiche dell'intero sistema di Sharepoint. Ogni feature infatti, può contenere più sotto-elementi (le suddette definizioni), in modo tale da formare dei veri e propri pacchetti di personalizzazioni che possono essere installati ed attivati su qualsiasi sito, site collection o web farm Sharepoint. Quindi, ognuno dei componenti che prima erano inseriti uno dopo l'altro in file di definizione XML (vedi il famoso Onet.xml), sono ora suddivisi in pacchetti staccati, in modo tale da essere gestiti al meglio.
Inoltre, per la gioia di noi sviluppatori Sharepoint, è stato introdotto il supporto per la localizzazione ! Non dovremo più creare, quindi, una copia delle nostre personalizzazioni per ogni lingua che vogliamo gestire (come succedeva con Windows Sharepoint Services 2), ma ci basta definire un insieme di coppie chiave-valore all'interno di un file di risorse (.resx), e creare un file di risorse per ogni lingua, esattamente come accade per i siti localizzati scritti in ASP.NET 2.0 (si, perché Sharepoint è interamente basato su tale tecnologia).

Nota: per un esempio di localizzazione di siti in ASP.NET 2, vi rimando alla lettura di questo articolo

LA NOSTRA PRIMA FEATURE
Come esempio, creiamo una feature vuota, senza sotto definizioni quindi, ma con specificati gli attributi ReceiverAssembly e ReceiverClass, in modo tale da poter allegarci un event handler per la gestione degli eventi della feature.
Per prima cosa, quindi, dobbiamo creare una nuova directory all'interno del percorso

Local_Drive:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES

e creare al suo interno, un file XML chiamato feature.xml; vediamone la sintassi:

<?xml version="1.0" encoding="utf-8" ?>

<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
Title="La nostra prima feature"
Id="fd45b845-bc19-48b2-9c39-63f23262f956"
Scope="Web"
Creator="Giuseppe Marchi (www.peppedotnet.it)"
Description="Feature di prova"
ReceiverAssembly="Peppe.Sharepoint.Features,
Version=1.0.0.0,
Culture=neutral,
PublicKeyToken=d408018fb0599590"

ReceiverClass="Peppe.Sharepoint.Features.FeatureEventHandler"
/>

Come si può vedere, abbiamo dovuto specificare il namespace al quale fanno riferimento tutti gli elementi del nostro file feature.xml, il titolo della feature, un guid per identificarla dalle altre, e lo scope. Lo schema generale per i file XML che definiscono le feature è consultabile nella documentazione di Sharepoint.
Questi, invece, sono gli attributi dell'elemento Feature:
  • ActivateOnDefault – Da impostare a TRUE se vogliamo che la feature venga attivata automaticamente dopo essere stata installata. Altrimenti FALSE.
  • AlwaysForceInstall – Da impostare a TRUE se vogliamo che la feature venga installata anche se gia presente. FALSE altrimenti.
  • AutoActivateInCentralAdmin – Da impostare a TRUE se vogliamo che la feature venga attivata automaticamente nei siti di amministrazione (la central administration), nelle site collection o nelle Web Application. FALSE altrimenti.
  • Creator – Nome del creatore della feature.
  • DefaultResourceFile – Nome del file di risorse (.resx) per la localizzazione delle label.
  • Description – Descrizione testuale della feature.
  • Hidden– Da impostare a TRUE se vogliamo che la nostra feature risulti nascosta nell'interfaccia grafica.
  • Id – GUID per identificare univocamente la feature.
  • ImageUrl – Url dell'immagine rappresentante la feature (se omessa, verrà utilizzata quella di default di Sharepoint).
  • ImageUrlAltText – Rappresenta il testo da visualizzare nel tooltip dell'immagine della feature.
  • ReceiverAssembly – Assembly segnato, contenente l'event handler per la gestione degli eventi della feature.
  • ReceiverClass – Nome della classe, che eredita da SPFeatureReceiver, rappresentante l'handler.
  • RequireResources – Da impostare a TRUE se vogliamo che Windows Sharepoint Services controlli se il file di risorse collegato esista e sia conforme al formato di default.
  • Scope – Rappresenta il campo d'azione della nostra feature. Può contenere uno di questi quattro valori: Site (site collection), Web (singolo sito), WebApplication (web application) e Farm (server farm).
  • SolutionId - Specifica l'identificativo della soluzione (.wsp) cui la feature appartiene.
  • Title – Il titolo della feature.
  • Version – La versione della feature, secondo il formato specificato dal tipo System.Version
Nota: per facilitare la scrittura di feature, vi consiglio di installare le estensioni di WSS 3.0 per Visual Studio .NET 2005, sul vostro server di sviluppo Sharepoint

Una volta creato il file di feature, dobbiamo inserire nella GAC del server la libreria contenente il nostro handler (solo per questo particolare esempio) e infine installare la feature.
Per la creazione di un receiver per gli eventi della feature e per la sua installazione, rimandiamo alla lettura dell'articolo sugli event handler.

INSTALLAZIONE

Per installare la nostra feature, ci dobbiamo avvalere dell'utilizzo dell'utility STSADM, l'utility a riga di comando inserita con l'installazione base di Sharepoint, con la quale è possibile fare innumerevoli operazioni, tra le quali il backup e il restore di intere site collection e, appunto, la gestione delle feature. Questa utility è presente sotto il percorso:

Local_Drive:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN

La sintassi, da eseguire a riga di comando o comunque da inserire in un file .bat, per installare la nostra feature, sarà quindi la seguente:

pushd C:\program files\common files\microsoft shared\web server extensions\12\bin

stsadm -o uninstallfeature -filename MyCustomFeature\feature.xml
stsadm -o installfeature -filename MyCustomFeature\feature.xml

dove MyCustomFeature è il nome della directory che abbiamo scelto per la nostra feature.
Fatto questo, la feature deve essere attivata in uno (o più) dei siti della nostra site collection. Per farlo dobbiamo andare su "Site Actions > Site Settings > Site Features" e selezionare il tasto Activate relativo alla nostra feature.

Pagina di gestione delle feature
Figura 1 – Attivazione della feature.

DIPENDENZE E PROPRIETA'

Un'altra delle funzionalità inserite nel meccanismo delle feature, è rappresentata dalle dipendenze di attivazione. Abbiamo cioè la possibilità di vincolare l'attivazione della nostra feature alla presenza di altre feature nello stesso scope e alla loro stessa attivazione. Questo attraverso la specifica dell'elemento ActivationDependencies, che contiene la definizione di tutte le dipendenze che vincolano l'attivazione della nostra feature.
Nell'esempio, controlliamo la presenza della feature che descrive il template di lista delle document library.

<?xml version="1.0" encoding="utf-8" ?>

<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
Title="La nostra prima feature"
Id="fd45b845-bc19-48b2-9c39-63f23262f956"
Scope="Web"
Creator="Giuseppe Marchi (www.peppedotnet.it)"
Description="Feature di prova"
ReceiverAssembly="Peppe.Sharepoint.Features,
Version=1.0.0.0,
Culture=neutral,
PublicKeyToken=d408018fb0599590"

ReceiverClass="Peppe.Sharepoint.Features.FeatureEventHandler"
>
<ActivationDependencies>
<ActivationDependency FeatureId="00BFEA71-E717-4E80-AA17-D0C71B360101" />
</ActivationDependencies>
</Feature>

Se, per qualche motivo, la feature di dipendenza, non è attiva nel campo d'azione prescelto, la nostra feature non potrà mai essere attivata.
Questa funzionalità è molto utile quando si dividono le proprie personalizzazioni in più feature e la presenza di una di queste, vincola il corretto funzionamento di tutte le altre.

Inoltre, è possibile specificare un'insieme di proprietà personalizzate per la nostra feature, contenenti dei valori di default, che magari non vogliamo cablare direttamente nel codice. Per far questo, ci avvaliamo dell'utilizzo dell'elemento Properties, contenente una collezione di elementi Property che rappresentano le nostre singole proprietà attraverso la definizione di una coppia chiave-valore.

<?xml version="1.0" encoding="utf-8" ?>

<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
Title="La nostra prima feature"
Id="fd45b845-bc19-48b2-9c39-63f23262f956"
Scope="Web"
Creator="Giuseppe Marchi (www.peppedotnet.it)"
Description="Feature di prova"
ReceiverAssembly="Peppe.Sharepoint.Features,
Version=1.0.0.0,
Culture=neutral,
PublicKeyToken=d408018fb0599590"

ReceiverClass="Peppe.Sharepoint.Features.FeatureEventHandler"
>
<ActivationDependencies>
<ActivationDependency FeatureId="00BFEA71-E717-4E80-AA17-D0C71B360101" />
</ActivationDependencies>
<Properties>
<Property Key="listName" Value="MiaLista"/>
</Properties>
</Feature>

In questo modo, all'interno dell'handler degli eventi della nostra feature, possiamo richiamare il valore delle nostre proprietà attraverso le relative chiavi.

public override void FeatureActivated(SPFeatureReceiverProperties properties)

{
SPFeatureProperty prop = properties.Definition.Properties["listName"];
if (prop != null)
{
string listName = String.Format("{0}", prop.Value);
if (!String.IsNullOrEmpty(listName))
{
using (SPWeb web = properties.Feature.Parent as SPWeb)
{
web.Lists.Add(listName, "", web.ListTemplates["Document Library"]);
SPList list = web.Lists[listName];
list.OnQuickLaunch = true;
list.Update();
}
}
}
}

Questo esempio, è differente rispetto a quello proposto nell'articolo sugli Event Handler di WSS. In questo caso, lo scope della nostra feature è settato con il valore "Web", quindi, la proprietà properties.Feature.Parent sarà di tipo SPWeb, e non SPSite (questo è il caso in cui lo scope fosse Site). Questo vale per tutti gli scope possibili; il tipo di tale proprietà, in pratica, varia a seconda del campo d'azione della feature.

LOCALIZZAZIONE

Il sistema su cui si basano le feature è stato disegnato per essere completamente a se stante, staccato dal contesto dei vari siti Sharepoint e delle varie Web Application. In questo modo ha possibilità infinite di estensione.
Grazie proprio a queste caratteristiche, anche la gestione delle lingue è risultata veramente facilitata, in quanto all'interno di ogni feature è possibile richiamare il valore di una label, da un file di risorse (.resx) attraverso la relativa chiave; sarà poi il sistema di rendering di Sharepoint (basato sul meccanismo di localizzazione di ASP.NET 2.0) che si occuperà di far visualizzare il testo in base alla lingua con cui è stato creato il sito.
Il file di risorse può essere creato tranquillamente con Visual Studio .NET 2005; in seguito va spostato nella directory

Local_Drive:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ Resources.

All'interno della nostra feature, invece, dobbiamo prima definire il nome del file di risorse da utilizzare (attraverso l'attributo DefaultResourceFile), poi, possiamo utilizzare la sintassi della localizzazione esplicita di ASP.NET 2.0, per impostare i valori dei campi Title, Description e Creator (ho scelto questi campi per puro esempio).

<?xml version="1.0" encoding="utf-8" ?>

<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
Title="$Resources:myResources,myTitle;"
Id="fd45b845-bc19-48b2-9c39-63f23262f956"
Scope="Web"
Creator="$Resources:myResources,myCreator;"
Description="$Resources:myResources,myDescription;"
DefaultResourceFile="myResources"
ReceiverAssembly="Peppe.Sharepoint.Features,
Version=1.0.0.0,
Culture=neutral,
PublicKeyToken=d408018fb0599590"

ReceiverClass="Peppe.Sharepoint.Features.FeatureEventHandler"
>
<ActivationDependencies>
<ActivationDependency FeatureId="00BFEA71-E717-4E80-AA17-D0C71B360101" />
</ActivationDependencies>
<Properties>
<Property Key="listName" Value="MiaLista"/>
</Properties>
</Feature>

Per supportare ulteriori lingue, ora, non ci basta far altro che copiare il file di risorse di default e crearne uno per ogni lingua che vogliamo gestire, seguendo il formato di file della localizzazione di ASP.NET 2:
  • myResources.resx (file di default)
  • myResources.it-IT.resx (italiano)
  • myResources.en-US.resx (inglese)

CONCLUSIONI

In questa prima panoramica sull'utilizzo delle feature della nuova versione di Sharepoint, abbiamo visto come creare la nostra prima feature, come installarla ed attivarla, come utilizzare le dipendenze, le proprietà e, cosa più importante, la localizzazione.
Come avete potuto vedere, ci sono possibilità di estensione quasi illimitate del sistema, in quanto è stato disegnato per fare da base a tutte le possibili personalizzazione ed aggiunte che ci vengono utili.
Nei prossimi articoli, andremo a fondo vedendo tutti i possibili esempi di utilizzo di una feature.

Link utili
Feature.xml files
Feature element
Utility stsadm