Sharepoint 2007 Creare un menu personalizzato Custom Action

In questo articolo, vedremo come aggiungere ad una raccolta elenchi, un menu personalizzato, inoltre utilizzremo una pagina aspx per copiare un file.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

Introduzione

In questo articolo, vedremo come creare con il linguaggio Visual Basic Net e C#, un menu personalizzato per una raccolta elenco, la voce di menu avrà il compito di copiare il file selezionato in una determinato elenco (documenti library).

Utilizzeremo i file xml per l'installazione di tale voce (figura 1) ed una pagina web, che avrà il compito di copiare il file selezionato in una raccolta elenchi (denominata Amministrazione) creata in precedenza.

Utilizzeremo la classe spfoleder, spfile, listitem e list, per la gestione del file, liste, e cartelle.


 

Figura 1


 


 

Creazione del file xml feature e customAction.

In questa parte, vedremo la creazione dei file xml, che permetteranno di gestire il menu personalizzato, i file xml sono due, uno denominato feature, che avrà il compito di visualizzare nelle impostazioni della raccolta elenco siti di Sharepoint 2007 il componente, mentre il file UICustomAction.xml (il nome può variare) contiene le informazioni riguadante il menu.

Ma vediamo in dettaglio i vari file.

Di seguito si riporta un esempio del file Feature.xml

 <
feature
id ="46F90BDF-416F-4eb7-B7CC-23FD5488403A"
Title="Invia amministrazione"
Description="Invia il file selezionato alla direzione amministrativa"
Version="1.0.0.0"
Scope="Web"
xmlns="http://schemas.microsoft.com/sharepoint/">
<
ElementManifests
>
    <
ElementManifest Location="UICustomActions.xml"
/>
  <
/ElementManifests
>

 Il tag Id, è un guid, per generare tale valore, tramite l'ambiente di sviluppo visual studio 2005 o versione successiva, selezionare dal menu Strumenti (tools per la versione inglese) la voce crea guid (create guid). Nella finestra che viene aperta facciamo click sul pulsante copy, in questo modo che si copia il codice guid, lo applichiamo a tale campo.

Per il tag Title, impostiamo un titolo. Mentre il tag Description, sarà la descrizione, entrambi visibili nella pagina caratteristiche raccolta siti.

Il tag vesion, indica la versione.

Il tag Scope, è un tag molto importante, infatti, se lo impostiamo con il valore web, questo componente verrà installato nel sotto sito che indichiamo ,ossia se abbiamo diversi siti nel nostro portale, psossiamo far in modo che tale componente venga installato nel sotto sito specifico.

Se invece impostiamo il tag Scope con il valore Site, questo componente verrà installato per tutto il sito compresi i sotto siti.

Ora passiamo all'altro file xml ossia UICustomAction.xml, questo file, riguarderà le impostazioni relative al menu che dovrà essere visualizzato nel singolo elemento della raccolta elenco.

Di seguito si riporta il frammento di codice del file xml.

<
CustomAction
Id="UserInterfaceCustomActions.ECBItemToolbar"
RegistrationType="List"
RegistrationId="101"
ImageUrl = "/_layouts/images/Protocollo.GIF"
Location="EditControlBlock"
Sequence="106"
Title="Invia Amministrazione">

 Il tag ID, sta per nome del menu, mentre il tag RegistrationTypy si riferisce al tipo di oggetto che andremo a pesronalizzare, e quindi una lista, mentre il tag RegistrationID, l'id del tipo di menu.

Il tag imageUrl, indica l'immagine, che verrà visualizzata accanto alla voce di menu, mentre il tag Seguence, l'ordine in cui visualizzarlo.

Il tag Title, indica il testo che verrà visualizzato nel menu.

Fate attenzione al tag UrlAction, questo tag è molto importante, perchè una volta selezionata la voce di menù, verrà caricata una pagina (che l'utente non vedrà, perchè ritornerà indietro ) nella quale si trovano le istruzioni per copiare il file nella raccolta elenchi amministrazione.

I parametri che vengono passati, riguardano la lista e l'elemento selezionato, infatti con il parametro ItemId, otteniamo il codice identificativo dell'elemento, mentre con il parametro ListId, otteniamo il codice identificatvo della lista.

Essendo un sotto sito, si è inserito l'urlo del server più il sotto sito, nel caso non era un sottosito, si poteva omettere.

Creazione della pagina.

Terminata la creazione dei file XML, occorre creare la pagina Aspx, la quale avrà il compito di copiare il file selezionato nella raccolta elenchi denominata Amministrazione, e ritornare nella cartella documenti condivisi, una volta terminata tale operazioni. Faccio presente un aspetto da non sottovalutare, infatti, la nostra pagina avrà il compito di cambiare il valore di una colonna della lista Documenti condivisi, e di copiare il file, ma nel caso, che l'utente non ha il ruolo di amministratore o un ruolo di modifica che succede? Semplice, non potrà eseguire il codice, per questo motivo, dobbiamo impersonare il ruolo di amministratore per far si che, la copia del file, avvenga con successo.

 

Codice C#

<script runat="server">

 
public void esegui()
{

 
SPUser user = Web.AllUsers["WIN2KSP2K7/Administrator"];

 
SPUserToken token = user.UserToken;
SPSite impersonatedSiteCollection = new SPSite(Web.Url , token);
SPWeb WebSito = impersonatedSiteCollection.OpenWeb();
WebSito.AllowUnsafeUpdates = true;
WebSito.Site.AllowUnsafeUpdates = true;
SPList List;
SPListItem ListItem;
string paramList = Request.Params["ListId"];
string paramID = Request.Params["ItemID"];
 
List = WebSito.Lists[new Guid(paramList)];
ListItem = List.GetItemById(Convert.ToInt32(paramID));
SPFolder DestFolder = WebSito.GetFolder("Amministrazione");

 
 

 
if (List.Title != "Documenti condivisi")
{
//Codice
SPUtility.Redirect("Messaggio.aspx",
SPRedirectFlags.Default,
HttpContext.Current);
return;
}
else
{
 

 

 
if ( ListItem["Stato"] != null)
{
SPUtility.Redirect(List.DefaultViewUrl,
SPRedirectFlags.Default,
HttpContext.Current);
return;

 
}

 
//imposto lo stato
ListItem["Stato"] = "In attesa di verifica";
ListItem.Update();
//rilevo il file selezionato
Byte[] FileContents = ListItem.File.OpenBinary();
//Salvo il dato
SPFile NewFile = DestFolder.Files.Add(DestFolder.ServerRelativeUrl + "/" + ListItem.File.Name, FileContents, true);

SPListItem MioFile = NewFile.Item;
DestFolder.Update();
WebSito.Update();
 
SPUtility.Redirect(List.DefaultViewUrl,
SPRedirectFlags.Default,
HttpContext.Current);

 
WebSito.AllowUnsafeUpdates = false;
}

}

 
protected void Page_Load(object sender, EventArgs e)
{

esegui();

 

 
}

script>
Codice VB.Net
<asp:content ID="Content1" contentplaceholderid="PlaceHolderAdditionalPageHead" runat="server">

 
asp:Content>

 
<script runat="server">
Public Sub esegui()
 
Dim user As SPUser = Web.AllUsers("WIN2KSP2K7/Administrator")

 
Dim token As SPUserToken = user.UserToken
 
Dim impersonatedSiteCollection As New SPSite(Web.Url, token)
 
Dim WebSito As SPWeb = impersonatedSiteCollection.OpenWeb()
WebSito.AllowUnsafeUpdates = True
WebSito.Site.AllowUnsafeUpdates = True
 
Dim List As SPList
 
Dim ListItem As SPListItem
 
Dim paramList As String = Request.Params("ListId")
 
Dim paramID As String = Request.Params("ItemID")
List = WebSito.Lists(new Guid(paramList))
ListItem = List.GetItemById(Convert.ToInt32(paramID))
Dim DestFolder As SPFolder = WebSito.GetFolder("Amministrazione")
 
If List.Title <> "Documenti condivisi" Then
SPUtility.Redirect("Messaggio.aspx", SPRedirectFlags.Default, HttpContext.Current)
 
Else
If ListItem("Stato") <> Nothing Then
SPUtility.Redirect(List.DefaultViewUrl, SPRedirectFlags.Default,HttpContext.Current)
End If
'imposto lo stato
ListItem("Stato") = "In attesa di verifica"
ListItem.Update()
'rilevo il file selezionato
Dim FileContents As Byte() = ListItem.File.OpenBinary()
 
'Salvo il dato
Dim NewFile As SPFile = DestFolder.Files.Add(DestFolder.ServerRelativeUrl + "/" + ListItem.File.Name, FileContents, True)
Dim MioFile As SPListItem = NewFile.Item
DestFolder.Update()
WebSito.Update()
SPUtility.Redirect(List.DefaultViewUrl, SPRedirectFlags.Default, HttpContext.Current)
WebSito.AllowUnsafeUpdates = False
 
End If
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
 
esegui()

 

 
End Sub

 

 

 

 

 
script>


 

 

Installazione.

A questo punto, non ci resta che installare i componenti, per prima cosa, occorre installare il file feature xml, tramite il comando stsadm, come si vede qui di seguito.

 

 C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN>stsadm -o installfeature -filename MenuInvia\Feature.xml


 Come si vede, dopo essersi posizionati nella cartella Bin, che contiene diversi tools, viene eseguito il comando stsadm, con i parametri per l'installazione del componente.


 Se tutto procede in modo corretto, occorre attivare il componente UICustomAction, ossia il file xml collegato al feature.

Di seguito si riporta il comando per attivare tale componente:

 

C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN>stsadm -o activatefeature -filename MenuInvia\Feature.xml -url http://win2ksp2k7:
24267/contabile/

Per attivarlo, utilizziamo sempre il comando stsadm, ma tra i vari parametri , utilizziamo activatefeature, che permette l'attivazione del componente.

Faccio presente che dopo il parametro -url, viene digitato il sottosito denominato contabile, che fa parte del sito principale, in questo modo, il componente non sarà installato su tutti siti, ma benì, su quello specificato.


 


 

Figura 2


 

Verifica

A questo punto non ci resta che testare il nostro menu personalizzato.

Prima di tutto occorre creare nella raccolta elenchi documenti condivisi, del nostro sotto sito una colonna denominata stato, ed una raccolta elenchi, denominata Amministrazione.


 

Conclusioni:

L'articolo proposto, ha voluto illustrare una tecnica di come personalizzare il portale Microsoft Sharepoint 2007, in particolare aggiungendo una propria voce, nel menu di una raccolta elenco.

In allegato a tale articolo, si può scaricare i sorgenti utilizzati, tramite la parola download.
 

Download