Professional Documents
Culture Documents
Facoltà di Ingegneria
Relatore Laureando
2. Analisi ............................................................................................................................. 6
3. Requisiti........................................................................................................................ 12
4. Realizzazione ............................................................................................................... 23
5. Conclusioni ................................................................................................................... 59
Bibliografia .............................................................................................................................. 60
1. Introduzione
Con questa tesi, sullo sviluppo di portali verticali attraverso la parametrizzazione e
Attualmente, il portale presente è composto da una semplice pagina statica contenente una
piccola presentazione delle attività e degli obiettivi della scuola, l’elenco delle pubblicazioni degli
ultimi anni e l’elenco dei dottorandi in corso.
L’applicazione sarà installata sul web server del DICAMP che utilizza come sistema
operativo Windows Server 2003. L’utilizzo del portale sarà pubblico e quindi le funzionalità
implementate dovranno essere compatibili con il maggior numero di browser presenti in rete
(Internet Explorer, Mozilla Firefox, Opera, etc.) in modo tale da garantirne il funzionamento in ogni
condizione.
La tecnologia scelta per lo sviluppo del portale è WSS 3.0 SP11, mentre l’ambiente di
sviluppo per la parametrizzazione è Microsoft Office SharePoint Designer 2007. Le pagine
1 Microsoft Windows SharePoint Service 3.0 con Service Pack 1 versione 12.0.0.6219. Pagina di
riferimento http://technet.microsoft.com/en-us/windowsserver/sharepoint/bb400747.aspx.
4
dedicate all’inserimento dei dati saranno sviluppate nel linguaggio C# utilizzando l’ambiente di
sviluppo Visual Studio 2008 Professional. Infine, il DBMS adottato è Microsoft SQL Server 2005.
Dal punto di vista organizzativo, ho suddiviso questo lavoro in quattro fasi. Si parte da
un’analisi dello stato iniziale, per poi passare allo studio dei requisiti del nuovo portale per arrivare
infine alla realizzazione vera e propria del portale, alla sua installazione ed alla sua pubblicazione.
La fase di analisi iniziale consiste nella verifica dello stato attuale del portale e nell’analisi
della base di dati messa a disposizione dalla scuola (Capitolo 2).
La fase dei requisiti illustra le richieste per il nuovo portale (Capitolo 3). A tale scopo sono
stati proposti come portali di riferimento RECA2 e Intranet dei DICAMP3
Inoltre l’attuale situazione non permette il dialogo con sorgenti database esterne,
attualmente presenti all’interno della scuola, e contenenti tutte le informazioni riguardanti lo stato di
attività dei dottorandi in corso.
Da un punto di vista organizzativo dei dati, l’attuale costruzione non dispone di un elenco di
collegamenti ipertestuali alle varie sezioni, rendendo il contenuto disordinato e di difficile
consultazione.
6
2.1.2 Sistema informatico
Il web server sul quale è installata attualmente la pagina è il DICAMPSRV1 che adotta
come sistema operativo Microsoft Windows Server 2003.
7
In vwDorroandiInCorso ci sono alcuni campi derivati: i campi Expr1 e Expr2 indicano
rispettivamente il Cognome ed il Nome del docente che svolge attività di tutor nei confronti del
dottorando, il campo Expr3 indica il dipartimento di appartenenza del docente.
Tale vincolo può sembrare molto restrittivo ma risulta fondamentale rispettarlo per non
incorrere in problemi di backup e restore del portale da macchina di sviluppo a macchina di lavoro,
che può portare, a volte, nel peggiore dei casi, addirittura alla perdita di dati.
8
2.2.2 Vincoli temporali
La pubblicazione del portale inizialmente non prevedeva un vincolo temporale preciso.
Durante la fase di sviluppo è sorta la necessità di rendere il portale operativo entro la data del 01
Marzo 2009.
2.3.1 Accessibilità
L’utilizzo del portale sarà pubblico e quindi le funzionalità implementate dovranno essere
compatibili con il maggior numero di browser presenti in rete (ad esempio Internet Explorer, Mozilla
Firefox, Opera, etc.) in modo tale da garantirne il funzionamento in ogni condizione.
Per raggiungere tale obiettivo è stato scelto di puntare sulla barra orizzontale disposta sulla
parte superiore delle varie pagine: tale disposizione dovrà permettere il rapido collegamento alle
varie sezioni, permettendo una navigazione più chiara e mirata rispetto alla precedente versione.
9
Come indicato precedentemente, WSS 3.0 genera sul lato sinistro del portale un elenco di
collegamenti (il classico menu di navigazione presente in qualsiasi sito internet). In questo elenco,
in aggiunta ai collegamenti sopra elencati, verranno predisposti ulteriori collegamenti: in particolare
saranno inseriti dei link alle librerie di documenti ed al calendario contenente le scadenze e gli
appuntamenti delle attività svolte all’interno della scuola.
Avendo deciso di utilizzare per la realizzazione del nuovo portale la stessa tecnologia su
cui sono basati RECA e Intranet, vedremo in seguito come siano di facile implementazione i punti
elencati precedentemente; meno ovvia invece risulterà la loro personalizzazione.
10
Figura 5 – Home Page del portale RECA
Tale predisposizione permetterà sia il dialogo con DB per la visualizzazione dei dati
presenti nelle tabelle sia la realizzazione di contenuti dinamici aggiornabili direttamente online.
11
3. Requisiti
Lo schema scelto per la costruzione della pagina iniziale del portale della scuola è simile a
quello usato per la realizzazione della pagina iniziale di RECA. Per maggiore chiarezza riportiamo
di seguito la struttura della pagina (Figura 7).
12
Figura 7 – Struttura portale RECA
Nella colonna laterale di sinistra sono presenti gli annunci ed i link ipertestuali. Gli annunci
visualizzano le informazioni secondo un ordine temporale (dal più recente al meno recente) e per
ogni annuncio viene indicato: titolo, data e ora di pubblicazione, nome dell’utente che ha pubblicato
l’annuncio, testo del messaggio ed eventuali allegati. I link ipertestuali invece visualizzano un unico
dato, che è il nome del collegamento: tale voce se cliccata apre una nuova finestra del browser
con la risorsa desiderata.
Nella colonna di destra è presente un corposo testo arricchito di varie immagini dove viene
descritta la finalità del progetto RECA.
Usando come base tale esempio è stato deciso di impostare la pagina iniziale del portale
della scuola nel seguente modo (Figura 8).
13
Figura 8 – Struttura del portale NANOTECH
Anche in questo portale la sezione dell’intestazione conterrà il logo e il nome del portale.
Nella colonna laterale di sinistra sarà presente il classico menu. L’elenco delle voci e dei
corrispondenti collegamenti alle sezioni viene gestito interamente da WSS.
Nella colonna centrale sarà presente una parte testuale. Il testo sarà inserito in un secondo
momento dall’amministratore del portale: tale parte dovrà essere modificabile online e dovrà
supportare l’inserimento di immagini o di link ipertestuali.
Nella colonna di destra saranno presenti l’elenco degli annunci e sotto, l’elenco dei link.
L’elenco degli annunci del portale della scuola, come per RECA, visualizzerà le informazioni
secondo un ordine temporale (dal più recente al meno recente). Diversamente da RECA, è stato
richiesto che i dettagli presenti per ogni annuncio siano solamente il titolo del messaggio, il giorno
di inserimento ed il testo del messaggio.
Per quanto riguarda l’elenco dei collegamenti non è stata richiesta alcuna modifica
particolare, quindi la struttura rimane la stessa proposta dal portale RECA.
14
Per tale pagina non sono state avanzate esigenze particolari, l’unica è la possibilità di
modifica online del testo contenuto.
Su richiesta del committente, all’interno del portale della scuola, dovranno essere
predisposti degli elenchi per visualizzare il contenuto delle viste, già illustrate nel capitolo
precedente (2.1.3 Basi di dati esistente).
1. “Collegio dei docenti”: le informazioni per il presente elenco saranno prelevate dalla
vista vwCollegioDocenti
2. “Consiglio scientifico” : le informazioni per il presente elenco saranno prelevate dalla
vista vwConsiglioScientifico
3. “Supervisori” : le informazioni per il presente elenco saranno prelevate dalla vista
vwSupervisors
4. “Dottorandi in corso” : le informazioni per il presente elenco saranno prelevate dalla
vista vwDottorandiInCorso
Ora analizziamo come saranno visualizzati nelle varie sezioni i dati restituiti dalle varie
viste.
15
La Tabella 2 indica lo schema per la visualizzazione della vista vwConsiglioScientifico. I
campi presenti ed il significato sono simili ai campi presentati nella Tabella 1.
15 DI GIUSTO Mauro 19 2004 Dip. di Scienze della vita MARZARI Roberto Titolo della tesi … BIO/06
21 SCIAN Giovanni 20 2005 Dip. di Fisica ROSEI Renzo Titolo della tesi … FIS/03
30 SCOCCHI Giulio 21 2006 DICAMP FERMEGLIA Maurizio Titolo della tesi … ING-IND/24
… … … … … … … … …
Tabella 4 – Campi dell’elenco “Dottorandi in corso”
Per alcuni dei campi presenti negli elenchi sono state richieste delle funzionalità aggiuntive.
In primo luogo, tutti i campi E-mail presenti in ogni elenco (di docenti o dottorandi), dovranno
essere cliccabili permettendo l’invio di un messaggio di posta elettronica.
Ad esempio:
15 DI GIUSTO Mauro 19 2004 Dip. di Scienze della vita MARZARI Roberto Titolo della tesi … BIO/06
21 SCIAN Giovanni 20 2005 Dip. di Fisica ROSEI Renzo Titolo della tesi … FIS/03
16
Il dottorando Di Giusto Mauro ha come chiave primaria il numero 15; al clic del testo del
titolo il portale dovrà aprire il documento denominato d0015.pdf.
Il dottorando Scian Giovanni ha come chiave primaria il numero 21; al clic del testo del
titolo il portale dovrà aprire il documento denominato d0021.pdf.
Per soddisfare tale esigenza è stato deciso di utilizzare la tecnologia AJAX. In 4.4.3.4
Elenco dei “Dottorandi in corso” dedicato sarà spiegato in maniera molto più dettagliata
l’implementazione di tale funzionalità.
3.2.4 Calendario
La tecnologia WSS contiene già la funzionalità del calendario. Tale funzionalità permette
l’inserimento di eventi di vario genere. La visualizzazione delle attività inserite può essere mensile,
settimanale o giornaliera.
Per l’aggiunta di un nuovo evento è presente un pulsante con scritto “Nuovo” nella barra
superiore del calendario. Alcuni dei campi richiesti (quelli indicati con un asterisco), sono
obbligatori e rappresentano le informazioni minime per un nuovo evento. In aggiunta, però, è
possibile allegare un documento, indicare la ricorrenza dell’evento ed indicarne l’area di lavoro
dell’evento.
17
2. l’indicazione del mese selezionato
3. la visualizzazione per giorno, per settimana o per mese (la Figura 10 ad esempio
raffigura la visualizzazione mensile del mese di marzo 2009)
4. se nel portale WSS sono presenti delle liste di utenti, è possibile inviare
automaticamente un email ad ognuno per comunicare l’inserimento di un nuovo evento.
18
Nella barra superiore della raccolta di documenti sono presenti i pulsanti “Nuovo” e “Carica”
che permettono rispettivamente l’aggiunta di un nuovo documento o il caricamento di documenti
da una specifica cartella.
In questa videata è possibile navigare tra le varie cartelle presenti all’interno del pc,
visualizzare il contenuto di ogni cartella e selezionare tutti i documenti che si desidera caricare
all’interno della raccolta.
L’uso di tale raccolta è subordinato all’accesso tramite un login che permette l’utilizzo dei
documenti presenti in elenco. Il fatto che tale raccolta sia vincolata ad un accesso non modifica
assolutamente le funzionalità viste nel paragrafo precedente.
19
3.2.7 Sviluppo delle pagine dedicate all’inserimento dei dati nel DB
L’aggiornamento delle informazioni contenute nel DB sarà effettuato da più persone. In
particolare una di queste utilizza come postazione un PC basato su sistema operativo Macintosh.
Per spiegare meglio questa soluzione illustro l’esempio facendo riferimento alla tabella
tblDottorando.
20
Figura 13 - Schema della tabella tblDottorando
Osservando i dati inseriti in Figura 14 vediamo come essi descrivano il form per
l’inserimento delle informazioni in tabella. I campi descritti non devono essere obbligatoriamente
tutti i campi presenti nella tabella di riferimento (in questo caso tblDottorando).
Le varie voci “Cognome” – “Nome” – etc. vengono prelevate dal valore presente nel campo
“InItalian”; la tipologia della casella di testo dal campo “TypeControl” e le relative caratteristiche dai
21
campi “Enabled” – “Length”; l’obbligatorietà del dato viene indicata con l’asterisco rosso e fa
riferimento al campo “Required”.
22
4. Realizzazione
La realizzazione delle varie parti si articola secondo tre modalità:
parametrizzazione semplice
parametrizzazione avanzata
sviluppo funzionalità aggiuntive.
La parametrizzazione semplice riguarda i componenti già presenti in WSS e per i quali non
sono state richieste particolari personalizzazioni. Tali componenti sono il calendario, le raccolte di
documenti, la personalizzazione del logo e dell’intestazione del portale.
Lo sviluppo delle nuove parti riguarda componenti non presenti in WSS. Tali componenti
sono gli elenchi presentati nel precedente capitolo e la pagina dedicata all’inserimento dei dati.
Dando per scontate le procedure per creare un’unità virtuale e per installare il sistema
operativo, prima di procedere all’installazione di WSS, è indispensabile verificare che il sistema
soddisfi i requisiti previsti per WSS.
23
Figura 16 – Maschera per l’installazione di IIS
Le opzioni da richiamare in questa videata sono indicate in Figura 16. Per completare tale
operazione è necessario il cd di installazione del sistema operativo.
Un secondo requisito fondamentale è che nel sistema siano installate le estensioni per il
Framework .NET 3.5. Tale pacchetto è scaricabile gratuitamente al seguente indirizzo
http://www.microsoft.com/downloads/details.aspx?displaylang=it&FamilyID=333325fd-ae52-4e35-
b531-508d977d32a6.
Ultimo requisito è la presenza di una versione di Internet Explorer pari o superiore alla 6.
Per lo sviluppo di questo progetto è stato scelto di utilizzare la versione 8 (attualmente l’ultima
release disponibile) ed anch’essa è scaricabile gratuitamente al seguente indirizzo
http://www.microsoft.com/windows/internet-explorer/default.aspx.
Verificati questi punti, procediamo all’installazione del pacchetto WSS. Tale pacchetto,
anch’esso gratuito, è scaricabile al seguente indirizzo
http://www.microsoft.com/downloads/details.aspx?familyid=EF93E453-75F1-45DF-8C6F-
4565E8549C2A&displaylang=en.
24
Figura 17 – Tipologia di installazione di WSS
Nella parte superiore della pagina sono presenti i pulsanti “Operazioni” e “Gestione
applicazioni”. Tali comandi permettono rispettivamente di:
25
eseguire l’operazione di configurazione di WSS come backup e ripristino di dati,
configurazione del server WSS, gestione delle registrazioni e della reportistica
sull’utilizzo, etc.
gestire le applicazioni WSS: creare o rimuovere applicazioni e portali, e configurare i
relativi parametri di utilizzo e di protezione, gestire gli account di posta elettronica,
etc.
il nome del nuovo portale Web IIS: indica l’indirizzo web del server web locale
attraverso il quale è raggiungibile il portale
26
Figura 20 – Nuovo sito Web IIS
il db del contenuto
Figura 24 – Nome del server e relativo nome del database per il nuovo Web IIS
27
Terminata la compilazione dei campi, viene avviata la creazione della nuova applicazione
e, ad operazione terminata, compare una videata di conferma.
Ora bisogna creare una nuova “Raccolta siti”. Per avviare la procedura, è necessario
selezionare la voce “Crea raccolta siti” da “Gestione applicazioni”.
Terminato l’inserimento di questi dati le operazioni sono finite ed il portale inizializzato avrà
la videata come in Figura 28.
28
Figura 28 – Nuovo portale WSS
I comandi presenti in questa tendina sono “Crea”, “Modifica pagina” e “Impostazioni sito” e
permettono rispettivamente di:
4 Una web part è un controllo server ASP.NET che può essere aggiunto da un utente a run time. Più
web part possono essere integrate tra di loro per creare siti web "dinamici" e personalizzabili direttamente
dall'utente.
29
modificare il contenuto della pagina selezionata. Come indicato nella descrizione è
possibile solamente aggiungere, modificare o rimuovere delle web part
accedere alla pagina dedicata alle impostazioni del portale.
4.2.1 Calendario
Per aggiungere il calendario al portale selezioniamo la voce “Crea” dal pulsante “Azioni
sito”. Nella videata che appare selezionare la voce “Calendario” presente nel gruppo “Gestione”
come in Figura 30.
30
Figura 32 – Gruppo gestione delle Raccolte
La scelta del modello di documento non vincola in alcun modo la possibilità di caricare nella
raccolta qualsiasi altro formato, ma impone il formato nel momento in cui ne viene creato uno
nuovo.
31
Per personalizzare il logo e l’intestazione del portale selezioniamo la voce “Impostazione
sito” dal pulsante “Azioni sito”. Nella videata che appare selezionare la voce “Titolo, descrizione e
icona” presente nel gruppo “Aspetto” come in Figura 34.
Selezionando la voce indicata compare la videata come in Figura 35. Nella casella di testo
“Titolo” e “Descrizione” è possibile modificare l’intestazione e la descrizione del portale.
Figura 35 - Maschere per la modifica del Titolo e del logo del portale
Il campo URL indica l’indirizzo della nuova immagine scelta per il logo; tale immagine deve
essere già presente nella cartella Images del portale. Si può notare che in Figura 35 non è
presente alcun pulsante per il caricamento di documenti, perciò, per poter utilizzare un proprio logo
personalizzato bisogna utilizzare un programma esterno che permetta l’upload di file nelle cartelle
del portale.
32
Una volta avviato il programma e collegato al portale, sullo schermo compare la lista di tutte
le cartelle o documenti presenti come in Figura 36. Dopo aver selezionato la cartella Images, come
indicato nell’immagine, usando il comando File\Importa si può caricare una o più immagini
all’interno della cartella specificata.
Terminata questa operazione, ritornando alla Figura 35, nel campo URL indichiamo il
percorso relativo dell’immagine desiderata. La prima parte del percorso /images/ indica, come visto
in fase di caricamento, la cartella contenente i file e la seconda parte il nome del file scelto. Sotto a
questa casella di testo appare la dicitura “Fare clic qui per verificare l’indirizzo”, lo scopo di questo
collegamento è la verifica dell’esattezza del percorso digitato: se è corretto viene aperta una nuova
finestra del browser e viene visualizzata l’immagine.
33
Per effettuare tali modifiche, nella maggior parte dei casi, la procedura prevede delle
operazioni iniziali quali l’inserimento di elenchi, raccolte o quant’altro (come visto nel paragrafo
precedente) e poi una seconda fase di modifica manuale usando SharePoint Designer.
Nella videata che appare viene richiesto il nome da assegnare alla nuova raccolta di
annunci, la descrizione e se visualizzare il collegamento alla lista nel menu laterale.
In Figura 38 si può vedere la videata che appare quando viene richiamata la lista degli
annunci; attraverso tale videata è possibile gestire i messaggi.
Per richiamare in una qualsiasi pagina l’elenco degli annunci come web part, selezionare la
voce “Modifica pagina” da “Azioni sito”. Richiamando questo comando la pagina passa dalla
visualizzazione normale alla modalità di modifica e all’interno della pagina compaiono dei pulsanti
con scritto “Aggiungi Web Part” che permettono di aggiungere web part alla pagina.
Cliccando su un qualsiasi pulsante “Aggiungi web part” compare la lista delle web part
attive, come in Figura 39, e da questo elenco selezioniamo il nome della lista degli annunci creata
precedentemente. Il risultato finale si può vedere in Figura 40.
34
Figura 40 – Web Part annuncio inserita nella pagina
Aprendo la pagina si vede che il componente dell’elenco viene inserito come unico oggetto,
le modifiche permesse sono limitate ma per le personalizzazioni avanzate è possibile convertire
l’oggetto in “XSLT Data View”. Per effettuare tale operazione selezionare la voce “Converti in
XSLT Data View” dal menu contestuale che appare premendo il tasto destro sull’oggetto come
Figura 41.
Dopo che l’oggetto viene convertito in linguaggio XSLT, è possibile modificare il codice in
modo da ottenere un elenco come richiesto.
La parte iniziale del codice, generata da WSS e qui non riportata, è necessaria per la
connessione alla sorgente dei dati, la seconda parte invece è la parte di codice modificata per
ottenere le modifiche richieste.
35
<tr>
<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
<td class="ms-vb" width="1%" nowrap="nowrap">
<span ddwrt:amkeyfield="ID" ddwrt:amkeyvalue="ddwrt:EscapeDelims(string(@ID))" ddwrt:ammode="view"></span>
</td>
</xsl:if>
<td class="ms-vb" style="height: 20px">
<a href="#" onclick="document.location.href='/Lists/News/DispForm.aspx?ID='+{@ID};"><strong><em><xsl:value-of select="@Title"
/></em></strong></a>
<xsl:if test="ddwrt:IfNew(string(@Created))"><IMG SRC="/_layouts/1040/images/new.gif" alt="Nuovo" /></xsl:if>
</td>
<td class="style4" style="height: 20px">
<xsl:value-of select="ddwrt:FormatDate(string(@Created) ,1040 ,1)"/>
</td>
</tr>
<tr>
<td colspan="2" bgcolor="black" style="height:1px"></td>
</tr>
<tr>
<td colspan="2"><xsl:value-of select="@Body" disable-output-escaping="yes"/></td>
</tr>
<tr>
<td colspan="2" style="height: 5px"></td>
</tr>
</xsl:template>
Il codice sopra riportato genera il titolo delle news; tale titolo sarà un collegamento
ipertestuale alla pagina dedicata alla news “/Lists/News/DispForm.aspx?ID='+{@ID};”. Se il
messaggio è stato inserito recentemente, vicino al titolo compare la piccola immagine con scritto
“Novità”. Sul lato destro della stessa riga viene visualizzata la data di creazione dell’annuncio. La
rimanente parte del codice genera una piccola riga nera di divisione ed il testo completo del
messaggio.
36
4.3.2 Personalizzazione dei Link
La procedura seguita per la personalizzazione dell’elenco dei link rispecchia la serie di
operazioni indicate per la modifica dell’elenco degli annunci.
Tale parte di codice visualizza l’elenco dei collegamenti inseriti senza altre funzionalità:
viene visualizzato semplicemente il nome del collegamento e tale nome è un collegamento
ipertestuale alla risorsa specificata.
5 Le Web Part Zone sono i contenitori presenti nelle pagine Aspx all’interno dei quali è possibile
inserire le varie web part
37
Con semplici operazioni di selezione, eliminazione ed inserimento si è ottenuto una
struttura della pagina del seguente tipo (Figura 45).
Ora non rimane altro che richiamare le singole Web Part nelle zone predestinate utilizzando
il pulsante che appare “Aggiungi web part”.
Ottenuto il nuovo elenco è necessario richiamare la pagina con Microsoft Office Designer
per poter eliminare l’elenco inserito da WSS ed aggiungere un’unica Web Part Zone.
Predisposta la nuova Web Part Zone, attraverso il pulsante “Aggiungi web part”
aggiungiamo la “Web Part Editor Contenuto”. Come già indicato nel precedente paragrafo tale web
part dispone di un Rich Text Editor per la scrittura del testo.
Il programma indicato supporta la lettura di dati da varie fonti quali liste di Sharepoint,
elenchi di Sharepoint, documenti XML e connessioni a database.
Nel nostro caso il fattore più importante riguarda la connessione al DB della scuola;
attraverso tale mezzo saranno create le stringhe di connessione alle viste presenti.
38
Per realizzare una connessione richiamare la finestra “Data source Library” dal menu “Task
Panes”, sul lato di destra compare la videata come in Figura 46.
Ripetendo le operazioni descritte per ognuna delle viste si ottiene il seguente risultato come
in Figura 48.
39
Figura 48 – Elenco delle connessioni stabilite alle viste
Al termine di questa operazione, verrà aggiunta una nuova cartella alla cartella “Lists”; il
nome della nuova cartella sarà il nome specificato per il nuovo elenco ed il contenuto una serie di
40
pagine per la gestione delle informazioni. Tra tutte le pagine presenti, quella da modificare per
ottenere gli elenchi richiesti si chiama AllItems.aspx.
Tali operazioni vanno ripetute per ogni elenco, e il risultato finale saranno tante cartelle
quanti sono gli elenchi desiderati (Figura 51).
41
Figura 52 – Elenco del “Collegio dei docenti”
Come possiamo vedere in Figura 52, terminato il trascinamento della connessione stabilita
con la vista vwCollegioDocenti, Designer visualizza un elenco contenente i primi campi indicati (in
questo caso IDDocente, Cognome, Nome, SSD, Ente). Il menu visualizzato in Figura 53 compare
ogni volta che l’elenco viene selezionato e permette la personalizzazione dei campi contenuti.
42
WEB PART CONNECTION: visualizza lo stato della connessione; in questo caso
alla vista vwCollegioDocenti
PARAMETERS: permette l’inserimento di parametri da passare alla web part
REFRESH DATA VIEW: aggiorna i dati
DATA VIEW PROPERTIES: è la finestra generale dov’è riassunto tutto quanto visto
in questo menu.
Il codice ottenuto alla fine è molto lungo; di seguito riportiamo alcune spezzoni con la
relativa descrizione.
<table border="0" width="100%" cellpadding="5" cellspacing="0">
<tr valign="top" class="ms-menutoolbar">
<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
<th class="ms-toolbar" width="1%" nowrap="nowrap"></th>
</xsl:if>
<th class="ms-toolbar" nowrap="" style="text-align:left">
<xsl:call-template name="dvt.headerfield" ddwrt:atomic="1">
<xsl:with-param name="fieldname">@Cognome</xsl:with-param>
<xsl:with-param name="fieldtitle">Docente</xsl:with-param>
<xsl:with-param name="displayname">Cognome</xsl:with-param>
<xsl:with-param name="sortable">1</xsl:with-param>
<xsl:with-param name="fieldtype">x:string</xsl:with-param>
</xsl:call-template>
</th>
<th class="ms-toolbar" nowrap="" style="text-align:left">
<xsl:call-template name="dvt.headerfield" ddwrt:atomic="1">
<xsl:with-param name="fieldname">@Ruolo</xsl:with-param>
<xsl:with-param name="fieldtitle">Ruolo</xsl:with-param>
<xsl:with-param name="displayname">Ruolo</xsl:with-param>
<xsl:with-param name="sortable">1</xsl:with-param>
<xsl:with-param name="fieldtype">x:string</xsl:with-param>
</xsl:call-template>
43
</th>
…
</tr>
Questa prima parte visualizza la prima riga della tabella. Ogni voce della prima riga
permette, attraverso la comparsa di una tendina, il filtraggio o il raggruppamento dei dati
direttamente online.
In particolare:
<xsl:with-param name="fieldname">@Cognome</xsl:with-param>
Per collegare l’intestazione dell’elenco con la classe css sopra riportata, in ogni riga è stato
aggiunto un riferimento class="ms-toolbar"; ciò rende sensibile l’elenco al cambiamento del tema
da parte dell’amministratore del portale della scuola.
Il codice riportato di seguito indica la seconda parte, tale codice visualizza tutti i dati
prelevati dalla vista.
<tr>
…
<td class="ms-vb">
<xsl:value-of select="@Cognome"/>
<xsl:text xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" ddwrt:whitespace-preserve="yes"
xml:space="preserve"> </xsl:text>
<xsl:value-of select="@Nome"/>
</td>
<td class="ms-vb">
<xsl:value-of select="@Ruolo"/>
</td>
<td style="text-align:center">
<a href="mailto:{@email}"><img src="../../images/email_ico.gif" border="0" alt="Invia email a {@email}" /></a>
</td>
<td class="ms-vb">
<a href="mailto:{@email}"><xsl:value-of select="@email" /></a>
</td>
<td class="ms-vb">
<xsl:value-of select="@NomeDip"/>
</td>
<td class="ms-vb" style="text-align:center">
<xsl:value-of select="@Ente"/>
</td>
44
<td class="ms-vb" style="text-align:center">
<xsl:value-of select="@SiglaPosizione"/>
</td>
<td class="ms-vb" style="text-align:center">
<xsl:value-of select="@SSD"/>
</td>
</tr>
</xsl:template>
In particolare:
<td class="ms-vb">
<xsl:value-of select="@Ruolo"/>
</td>
per ogni campo da visualizzare è stata richiamata la variabile associata. Nello spezzone di
codice sopra riportato, ad esempio viene richiamato il valore del campo @Ruolo.
<a href="mailto:{@email}"><img src="../../images/email_ico.gif" border="0" alt="Invia email a {@email}" /></a>
Questo spezzone di codice inserisce vicino al campo @Email una piccola immagine
cliccabile che permette l’invio di un messaggio di posta elettronica.
1. Nominativo
2. Ruolo
3. Email
4. Dipartimento
5. Ente
6. Posizione
7. SSD
45
<xsl:call-template name="dvt_1.body">
<xsl:with-param name="Rows" select="$Rows"/>
</xsl:call-template>
</table>
…
In questo caso non è prevista una tendina per l’ordinamento o per il raggruppamento; difatti
il codice, per inserire ogni singola voce, è più breve rispetto al precedente elenco.
Nella seconda parte invece il codice è pressoché identico a quanto visto per il “Collegio dei
docenti”.
…
<td class="ms-vb">
<xsl:value-of select="@Cognome"/>
<xsl:text xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" ddwrt:whitespace-preserve="yes" xml:space="preserve">
</xsl:text>
<xsl:value-of select="@Nome"/>
</td>
<td class="ms-vb">
<xsl:value-of select="@RuoloConsiglioScientifico"/>
</td>
<td style="text-align:center">
<a href="mailto:{@email}"><img src="../../images/email_ico.gif" border="0" alt="Invia email a {@email}" /></a>
</td>
<td class="ms-vb">
<a href="mailto:{@email}"><xsl:value-of select="@email"/></a>
</td>
<td class="ms-vb">
<xsl:value-of select="@NomeDip"/>
</td>
<td class="ms-vb" style="text-align:center">
<xsl:value-of select="@Ente"/>
</td>
<td class="ms-vb" style="text-align:center">
<xsl:value-of select="@SiglaPosizione"/>
</td>
<td class="ms-vb" style="text-align:center">
<xsl:value-of select="@SSD"/>
</td>
…
1. Supervisore
2. Dottorando
3. Ciclo
4. Anno inizio
5. Anno fine
46
6. Dipartimento
7. Ente
47
</xsl:if>
<th class="ms-toolbar" nowrap="">
<xsl:call-template name="dvt.headerfield" ddwrt:atomic="1" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime">
<xsl:with-param name="fieldname">@ID</xsl:with-param>
<xsl:with-param name="fieldtitle">#</xsl:with-param>
<xsl:with-param name="displayname">ID</xsl:with-param>
<xsl:with-param name="sortable">1</xsl:with-param>
<xsl:with-param name="fieldtype">x:int</xsl:with-param>
</xsl:call-template>
</th>
<th class="ms-toolbar" nowrap="" style="text-align:left">
<xsl:call-template name="dvt.headerfield" ddwrt:atomic="1" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime">
<xsl:with-param name="fieldname">@Cognome</xsl:with-param>
<xsl:with-param name="fieldtitle">Dottorando</xsl:with-param>
<xsl:with-param name="displayname">Cognome</xsl:with-param>
<xsl:with-param name="sortable">1</xsl:with-param>
<xsl:with-param name="fieldtype">x:string</xsl:with-param>
</xsl:call-template>
</th>
…
</table>
La costruzione di questa prima parte di codice è simile all’elenco del “Collegio dei docenti”,
che, come vista già in precedenza, visualizza la prima riga della tabella.
<tr>
…
<td class="ms-vb" style="text-align:center">
<xsl:value-of select="format-number(@ID, '#,##0.#;-#,##0.#')"/>
</td>
<td class="ms-vb">
<xsl:value-of select="@Cognome"/>
<xsl:text xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" ddwrt:whitespace-preserve="yes"
xml:space="preserve"> </xsl:text>
<xsl:value-of select="@Nome"/>
</td>
…
<td class="ms-vb">
<xsl:value-of select="@NomeDip"/>
</td>
<td class="ms-vb">
<xsl:value-of select="@Expr1"/>
<xsl:text xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" ddwrt:whitespace-preserve="yes"
xml:space="preserve"> </xsl:text>
<xsl:value-of select="@Expr2"/>
</td>
<td class="ms-vb" style="text-align:center">
<a href="#" onclick="ResultTestDoc(GenerateLinkDocument(1,{@ID}));"><img src="../../images/logo_pdf.png" border="0" width="20px"
height="20px" /></a>
</td>
<td class="ms-vb">
<a href="#" onclick="ResultTestDoc(GenerateLinkDocument(1,{@ID}));"><xsl:value-of select="@TitoloTEsiITA"/></a>
</td>
<td class="ms-vb" style="text-align:center">
<xsl:value-of select="@SSD"/>
</td>
</tr>
48
In questa seconda parte di codice vengono generate le righe contenenti i dati dei dottorandi
in corso; anche in questo caso la costruzione è simile agli elenchi visti finora.
La particolarità di tale necessità riguarda il fatto che il sistema deve verificare l’esistenza del
documento, e solo in caso di risposta affermativa, visualizzarne il contenuto.
Per realizzare il collegamento è stato scelto di sviluppare un file javascript contenente una
chiamata AJAX: il funzionamento dello script verrà illustrato in maniera più dettagliata paragrafo
4.4.4 Script javascript per la chiamata AJAX.
Il comando ScriptLink aggiunge alla pagina una riga di codice, riportata di seguito,
<SharePoint:ScriptLink runat="server" id="MakeLinkDocuments" Name="makelinkdocuments.js" Language="javascript"/>
49
presente sul server di lavoro.
ResultTestDoc()
o se il documento PDF associato al dottorando è presente all’interno della
cartella, viene visualizzato in una nuova finestra, altrimenti viene restituito un
messaggio di errore che comunica all’utente che il documento non è
presente
o accetta come parametro il nome del documento, in questo caso generato
dalla funzione GenerateLinkDocument()
GenerateLinkDocument()
o restituisce il nome del documento, ad esempio d0020.pdf
o accetta come parametri un numero identificativo della lettera iniziale e il
valore della chiave primaria del dottorando di cui l’utente vuole vedere la
relazione.
Il motivo per cui è stato scelto di utilizzare questa tecnologia deriva dal fatto che il codice
presente in una pagina WSS non accetta l’intrusione di un codice esterno e il comando ScriptLink
accetta il caricamento solo di documenti .js.
function SetInitialChar(id) {
var InitialChar;
if (id==1) { InitialChar='d'; }
if (id==2) { InitialChar='p'; }
return InitialChar;
}
function GenerateLinkDocument(initial,id) {
var idtable,beginwith,namefiledocument,extension;
50
idtable=id;
extension='.pdf';
if (idtable < 10)
{ beginwith=SetInitialChar(initial) + String('000'); }
else if (idtable < 100) { beginwith=SetInitialChar(initial) + String('00'); }
else if (idtable < 1000) { beginwith=SetInitialChar(initial)+ String('0'); }
else if (idtable < 10000) { beginwith=SetInitialChar(initial); }
namefiledocument = beginwith + idtable + extension;
return namefiledocument;
}
function ResultTestDoc(url) {
if (!called) { // Prima volta che richiamo la funzione?. Chiamo Ajax...
loadXMLDoc(url);
called = true;
oTimer = setInterval(function(){ResultTestDoc(url);},100); // Imposto il timer di attesa della risposta da parte del server.
// Richiamo la funzione e verifico il risultato.
}
else {
if (ResultXMLHttp==-1) // Risultato e' ancora -1: aspetto il prox ciclo!
return;
clearInterval(oTimer); // Risultato non e' -1: analizzo la risposta del server.
called = false; // Reimposto la variabile called per un nuovo utilizzo.
if (ResultXMLHttp==200) { // testo Risultato
window.open(url);
}
else {
alert('File doesn\'t exist or can\'t open it!');
}
}
}
function loadXMLDoc(url) {
xmlhttp=null;
if (window.XMLHttpRequest) // Codice per IE7, Firefox, Opera, etc.
{ xmlhttp=new XMLHttpRequest(); }
else if (window.ActiveXObject) // Codice per IE6, IE5
{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }
if (xmlhttp!=null)
{
xmlhttp.onreadystatechange=state_Change;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}
else
{ alert("Your browser does not support XmlHTTPRequest."); }
}
function state_Change() {
if (xmlhttp.readyState==4)
{ // 4 = "loaded"
if (xmlhttp.status==200)
{ // 200 = "OK" 404 = "File non found"
ResultXMLHttp = xmlhttp.status;
}
else {
//alert("Problem retrieving data: " + xmlhttp.statusText);
ResultXMLHttp = xmlhttp.status;
51
}
}
}
che richiama la funzione ResultTestDoc(url) finché viene ricevuta una risposta dal parte del
server. Il risultato da parte del server viene fornito con i codici 200 e 404, che indicano
rispettivamente “File exist” e “File not found”, e di conseguenza viene visualizzato il documento o
restituito un messaggio che indica l’assenza del documento PDF.
Come già spiegato nel paragrafo 3.2.7 Sviluppo delle pagine dedicate all’inserimento
dei dati nel DB è stato scelto di realizzare nel NanotechDB delle tabelle descrittive di ogni tabella
presente. Il compito della pagina in oggetto sarà quello di leggere le tabelle descrittive e di
visualizzare dei form idonei all’inserimento dei dati richiesti dall’utente.
1. TBL_FieldDipartimento
2. TBL_FieldDocente
3. TBL_FieldDottorando
4. TBL_FieldEnte
5. TBL_FieldMissione
6. TBL_FieldPosizione
7. TBL_FieldRuoloCollegio
8. TBL_FieldRuoloCS
9. TBL_FieldTutoraggio
52
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Text;
if (queryStringValue != null)
{
switch (queryStringValue)
{
case "1": NameOfTable = "TBL_FieldDottorando"; break;
case "2": NameOfTable = "TBL_FieldDocente"; break;
case "3": NameOfTable = "TBL_FieldDipartimento"; break;
case "4": NameOfTable = "TBL_FieldEnte"; break;
case "5": NameOfTable = "TBL_FieldMissione"; break;
case "6": NameOfTable = "TBL_FieldPosizione"; break;
case "7": NameOfTable = "TBL_FieldRuoloCollegio"; break;
case "8": NameOfTable = "TBL_FieldRuoloCS"; break;
case "9": NameOfTable = "TBL_FieldTutoraggio"; break;
default: NameOfTable = null; break;
}
if (NameOfTable != null) { SQLQueryString = string.Format("SELECT * FROM {0}", NameOfTable.ToString()); }
}
if (SQLQueryString != null)
{
switch (queryStringValue)
{
case "1": NameOfTableInsert = "tblDottorando"; break;
case "2": NameOfTableInsert = "tblDocente"; break;
case "3": NameOfTableInsert = "tblDipartimento"; break;
53
case "4": NameOfTableInsert = "tblEnte"; break;
case "5": NameOfTableInsert = "tblMissione"; break;
case "6": NameOfTableInsert = "tblPosizione"; break;
case "7": NameOfTableInsert = "tblRuoloCollegio"; break;
case "8": NameOfTableInsert = "tblRuoloCS"; break;
case "9": NameOfTableInsert = "tblTutoraggio"; break;
default: NameOfTableInsert = null; break;
}
try
{
conn.Open();
54
panelModule.Controls.Add(rfvModule);
}
}
if (field["TypeControl"].ToString() == "combobox")
{
DropDownList ddlModule = new DropDownList();
SqlDataSource ddlDataSourceModule = new SqlDataSource();
ddlDataSourceModule.ID = string.Format("ddlDataSource_{0}", field["FieldName"].ToString());
ddlDataSourceModule.ConnectionString = ConnString.ToString();
ddlDataSourceModule.SelectCommand = field["SQLStringForComboBox"].ToString();
ddlModule.DataTextField = "comboboxText";
ddlModule.ID = field["FieldName"].ToString();
ddlModule.DataSourceID = string.Format("ddlDataSource_{0}", field["FieldName"].ToString());
ddlModule.DataValueField = string.Format("{0}", field["IDTableReference"].ToString());
ddlModule.CssClass = "comboboxModule";
if (Convert.ToInt32(field["Length"]) != null || Convert.ToInt32(field["Length"]) > 0)
ddlModule.Width = Convert.ToInt32(field["Length"]) * 10;
else
ddlModule.Width = 50 * 10;
panelModule.Controls.Add(ddlDataSourceModule);
panelModule.Controls.Add(ddlModule);
}
panelModule.Controls.Add(new LiteralControl("<br/>"));
SQLInsertString.Append(string.Format("{0},", field["FieldName"].ToString()));
pnlForm.Controls.Add(panelModule);
SQLInsertString.Remove(SQLInsertString.ToString().LastIndexOf(','), 1);
SQLInsertString.Append(") VALUES (");
}
finally
{
}
}
SQLInsertString.Remove(SQLInsertString.ToString().LastIndexOf(','), 1);
55
SQLInsertString.Append(")");
lblResult.Text = SQLInsertString.ToString();
try {
conn.Open();
SQLIstruction.ExecuteNonQuery();
}
catch (SqlException ex) {
lblResult.Text = string.Format("Impossibile inserire dati. Errore : {0}.", ex.ToString());
}
finally
{
conn.Close();
//lblResult.Text = string.Format("Inserimento avvenuto!");
}
56
Ora illustriamo un po’ più nel dettaglio alcune parti per renderne il funzionamento più
chiaro.
viene inizializzata la variabile NameOfTable; tale operazione permette di caricare i dati per
il form.
if (field["TypeControl"].ToString() == "combobox")
{
…
}
panelModule.Controls.Add(new LiteralControl("<br/>"));
SQLInsertString.Append(string.Format("{0},", field["FieldName"].ToString()));
che analizza il campo “TypeControl”. Se il valore presente è “textbox” viene generata una
casella di testo con relative proprietà, mentre se il valore è “combobox” viene generata una tendina
con relative proprietà. Infine viene aggiunto alla variabile SQLInsertString il campo analizzato. La
variabile SQLInsertString, al termine del ciclo, conterrà la stringa SQL per effettuare l’inserimento
dei dati in DB.
Il codice seguente viene attivato quando viene richiesto l’invio dei dati.
foreach (DataRow field in ListFields.Tables[0].Rows)
57
{
string t = HttpContext.Current.Request.Form[field["FieldName"].ToString()];
string textField = t.Replace("'", "''");
SQLInsertString.Append(string.Format("'{0}'", textField));
SQLInsertString.Append(',');
}
Il ciclo foreach, effettuando una chiamata HTTPCONTEXT, preleva tutti i dati inseriti
dall’utente nei vari campi e li aggiunge alla variabile SQLInsertString.
Terminato questo ciclo non rimane altro che effettuare la connessione al DB, inviare la
chiamata SQL, ed eventualmente gestire il possibile errore con un messaggio.
SqlCommand SQLIstruction = new SqlCommand(SQLInsertString.ToString(),conn);
try {
conn.Open();
SQLIstruction.ExecuteNonQuery();
}
catch (SqlException ex) {
lblResult.Text = string.Format("Impossibile inserire dati. Errore : {0}.", ex.ToString());
}
finally
{
conn.Close();
//lblResult.Text = string.Format("Inserimento avvenuto!");
}
58
5. Conclusioni
Il progetto è stato completato nei tempi previsti per la pubblicazione (del 01 Marzo 2009).
Attualmente è in fase di verifica da parte di una commissione che valuterà se le funzionalità
presenti sono adeguate o meno al tipo di scuola in questione.
Le richieste del committente sono state soddisfatte, i vari elenchi sono stati sviluppati ed
inoltre sono state realizzate delle guide per spiegare come implementarne di nuovi.
Oltre a quanto illustrato in tutti i capitoli precedenti, durante la fase di sviluppo, è stata
analizzata la possibilità di aggiungere o realizzare web part personalizzate. Purtroppo a causa di
molti fattori come:
Un altro punto di cui è stato richiesto lo studio riguarda la possibilità di sviluppare un portale
con il supporto della doppia lingua (nel caso del portale Nanotech inglese ed italiano). Dopo varie
ricerche in Internet si è giunti alla conclusione che l’unica strada è la creazione di due portali
paralleli, uno con lingua italiana e l’altro con lingua inglese.
Il futuro del portale prevede l’aggiunta di nuovi elenchi personalizzati, quali gli elenchi dei
dottori di ricerca e le pubblicazioni del collegio, oltre ad un’estensione delle funzionalità della
pagina dedicata all’inserimento dei dati.
Nel complesso mi ritengo molto soddisfatto del lavoro svolto, penso che personalmente
continuerò lo studio della tecnologia Sharepoint.
59
Bibliografia
Microsoft – “Windows® SharePoint® Services 3.0 - Evaluation Guide”
MSDN – http://msdn.microsoft.com/en-us/library/bb931737.aspx
MSDN - http://msdn.microsoft.com/en-us/library/ms452873.aspx
w3schools - http://www.w3schools.com/XML/xml_http.asp
Blog - http://www.raregrooverider.com/post/2008/01/20/Automating-the-install-of-the-
Application-Templates-for-SharePoint.aspx
60