sabato 24 gennaio 2009

Sharepoint 2007 creare un menu personalizzato in una raccolta documenti modificando il custom action

Riporto l'articolo scritto per il sito iprogrammatori http://www.iprogrammatori.it/articoli/programmazione/art_sharepoint-2007---creare-un-menu-persona_664.aspx riguardante la creazione di un custom action personalizzato.


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, possiamo 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

1 commento:

Enrico Zerilli ha detto...

Ciao Emanuele
prima di tutto complimenti per l'articolo. Non ho però capito una cosa: le pagine .ASPX come si deploiano nel sito Sharepoint?
Grazie in anticipo