Luca Vassalli's Website - Home page


Home
Indice

1.Introduzione

2.Centro Solidarietà di Genova

3.Politeama Genovese

 

3.3 Area pubblica

Prima di incominciare a parlare della 'Home' è necessario descrivere come funziona il sito nel complesso.
La struttura di una generica pagina è la seguente: i nomi dei file contenenti il codice visualizzato sono indicati fra parentesi; tutti gli elementi visualizzati nella pagina rientrano all'interno di una grande tabella HTML suddivisa in varie parti. Poiché molti elementi, come il menu e il box "Newsletter", vanno visualizzati in ogni pagina del sito, per evitare una ridondanza dannosa in caso di modifica, l'intera area pubblica è gestita da poche pagine PHP che visualizzano, in alcune parti sempre gli stessi menu e in altre parti, in base ai parametri che ricevono in 'Get', le corrette informazioni. Questo è realizzato tramite un'apposita funzione PHP ('include') che include nel punto in cui è invocata il codice contenuto in un file a parte. Per esempio il codice che visualizza il menu principale è stato scritto una sola volta ma compare in tutte le pagine del sito.
Sempre in riferimento allo schema 1 le righe continue indicano una differenza tra file di codice inclusi, mentre quelle tratteggiate indicano che, anche se divisi graficamente, gli elementi si trovano all'interno dello stesso file. Gli unici tre file che, senza eccezioni, sono presenti in tutto il sito sono: "menu.inc" che contiene la scritta "Politeama Genovese", il menu principale, il box "Newsletter" e il box "Documentazione"; "top.inc" che contiene alcuni collegamenti d'interesse e il logo dello sponsor del sito; "bottom.inc" che contiene gli stessi collegamenti d'interesse di "top.inc" e i loghi della Wildcard Service s.r.l. e della Papier digital.
Passando ad analizzare la struttura della parte pubblica del sito nel suo complesso si possono individuare quattro aree tematiche, specificatamente "Il teatro", "La stagione", "Biglietteria" e "Documentazione", più varie funzionalità.
Il menù principale presenta le prime tre aree tematiche: "Il teatro" contenente notizie sulle caratteristiche tecniche, sulla storia del teatro e informazioni utili su Genova; "La stagione" da cui si possono visualizzare tutti gli spettacoli della stagione attuale o le locandine di quelle passate; "Biglietteria" da cui si possono ottenere informazioni sui prezzi e sui punti vendita. Al di sotto del menu principale è situato il box "Documentazione" da cui si possono scaricare vari file d'interesse in formato pdf.
Per quanto riguarda le funzionalità: si possono acquistare biglietti on-line, si possono effettuare ricerche a tema per visualizzare spettacoli di un determinato genere o mese dell'anno, ci si può iscrivere o cancellare alla Newsletter.
I collegamenti in cima e in fondo alla pagina sono ridondanti, in quanto portano a pagine a cui si può accedere anche da altri collegamenti interni al sito, ma sono visualizzati perché particolarmente importanti.
Per quanto riguarda l'organizzazione dei file del sito si è cercato di mantenere una struttura la più ordinata possibile. Le pagine principali in PHP che visualizzano tutte le pagine dell'area pubblica del sito si trovano dentro alla cartella "Politeama"; i vari file, che vengono inclusi a seconda dei collegamenti che l'utente sta selezionando con il mouse, si trovano all'interno della cartella "Include"; sempre in "Include" c'è un'ulteriore cartella ("Funzioni") con un file contenente il codice necessario per la connessione al database.
Nella cartella "Spettacoli", per ogni spettacolo in programmazione, vi è una cartella che si chiama "spet_numero" dove a 'numero' va sostituito l'attributo "IdSpettacolo", chiave della tabella "Spettacoli" del database; dentro ad ognuna di queste cartelle vi sono tre file di tipo flash, creati dal grafico dall'immagine della locandina, la cui animazione consiste nel susseguirsi di scritte contenenti data, titolo e protagonista. Sono tre in quanto ve n'è uno per ognuno dei tre possibili formati: "grande" da visualizzare nella "Home page" quando lo spettacolo è in programmazione; "media" da mostrare nella pagina con la scheda dello spettacolo a cui si arriva selezionando con il mouse il collegamento nel flash dello spettacolo; "piccola" per tutti gli altri casi. Sempre all'interno di ciascuna cartella vi è un file HTML contenente la trama dello spettacolo e un'ulteriore cartella con i possibili file multimediali dello spettacolo, come estratti audio, video o ulteriori immagini, che uno spettacolo ha abbinati. Nel caso il campo "Speciale" della tabella "Spettacoli" valga '1' allora al posto dei flash grande e medio viene caricata un'immagine di tipo JPG e non sarà presente alcun file di testo di tipo HTML. Questa soluzione, sebbene non condivisa personalmente, è stata espressamente richiesta dalla responsabile del Politeama che si è occupata del sito. E' stata adottata per esempio per il primo spettacolo in programmazione della stagione "Genova per Gaber". Infine, per gli spettacoli fuori programmazione, esiste un'apposita cartella denominata "speciale" che contiene, in un file HTML, tutti i dati che devono essere visualizzati ed un'immagine in formato JPG. A questi spettacoli corrisponde una notizia nella bacheca della 'Home' con collegamento alla pagina dello spettacolo che pubblicizza l'evento. Un esempio di questa tipologia di spettacolo si è avuta per un fuori programma di "Ficarra & Picone" a Settembre intitolato "Diciamoci la verità".
In alcuni casi particolari al posto del testo HTML e del file flash di medie dimensioni, sarà possibile caricare un'immagine in formato JPG, come verrà chiarito meglio in seguito.
Sono poi presenti: le cartelle con i testi HTML delle diverse aree del menù principale; la cartella di nome "Images" contenente tutti i file dei vari bottoni e sfondi del sito; la cartella "locandine" con le pagine per l'area riservata del sito; la cartella "documentazione" con i file che si possono scaricare dall'omonimo box; la cartella con le funzioni Javascript utilizzate nell'area pubblica.

3.3.1 Home Page

La 'Home' è contenuta nel file "Index.PHP". Sono inclusi i file contenenti: il menu principale; i collegamenti in cima e in fondo alla pagina; sulla destra, il riquadro "Prossimamente" contenente i file flash dei prossimi tre spettacoli in programmazione e, più in basso, un modulo per la ricerca, in base a parametri immessi dall'utente, degli spettacoli d'interesse (fig.1). La parte visualizzata al centro della pagina si trova all'interno di "main.inc" per quanto riguarda l'immagine e il riquadro con il testo, mentre la bacheca elettronica "News" è contenuta nel file "scroller.inc".

Fig. 1 Home Page
Fig. 1 Home Page

In "main.inc" viene visualizzato il file flash di dimensioni grandi dello spettacolo che al momento è in programmazione oppure, nel caso in cui non ce ne siano, del primo spettacolo che andrà in programmazione; sotto si trovano due bottoni uno per l'acquisto 'online' del biglietto e l'altro per andare alla scheda dello spettacolo. Per visualizzare il file con l'immagine si fa un'interrogazione al database in cui si impone che la data della fine dello spettacolo visualizzato sia posteriore alla data odierna e si ordina il risultato in maniera crescente così che venga visualizzato quello più vicino, dopo aver eliminato tutti gli spettacoli passati. Una volta individuato lo spettacolo corretto si recupera dal database "IdSpettacolo" e, conosciuto questo, il percorso del file da caricare è "spettacoli/spet_identificativospettacolo/nomefile" dove il 'nomefile' vale "grande.swf".
Il bottone "acquista biglietto" porta ad una pagina da cui gli utenti non registrati possono accedere al modulo di registrazione, gli altri possono autenticarsi e quindi acquistare il biglietto. Il bottone "vai alla scheda" (fig.1) porta alla pagina "Stagione.PHP" con i parametri passati in 'Get': "pagina" al valore "scheda" per comunicare la necessità di visualizzare al centro della pagina i file relativi alla scheda dello spettacolo; "id" al valore dell'identificativo dello spettacolo corrente per permettere la visualizzazione dei dati dello spettacolo corretto. In effetti un qualunque visitatore modificando questo valore direttamente nella barra degli strumenti del browser, può cambiare a proprio piacimento lo spettacolo visualizzato, ma non è questo un problema dal punto di vista della sicurezza, in quanto vengono comunque visualizzate pagine del sito che sono pubbliche.
Al di sotto di questi bottoni si trova un box con il campo "desc_breve" della tabella "Spettacoli" presentato su video. Essendo, questo campo della tabella, di tipo 'text', si possono visualizzare nel box, tramite l'utilizzo dei tag HTML opportunamente inseriti all'interno di "desc_breve", frasi in grassetto, corsivo o persino collegamenti ad altre pagine.
In "scroller.inc" si trova, invece, il codice relativo alla sottostante bacheca elettronica chiamata "News". Poiché il file "scroller.inc" è utilizzato in diverse pagine, si trovano al suo interno dei blocchi condizionali che, in base al valore di una variabile ('scroll'), visualizzano all'interno di un box le informazioni, che a seconda della pagina del sito cambieranno, con la possibilità di vederle scorrere dall'alto verso il basso, grazie alle doppie freccie che si trovano sulla destra del box stesso. In questo caso sono le primissime righe di 'Index.PHP' che attribuiscono il valore corretto ('news') alla variabile di controllo, così che quando si arriva alle righe di codice di "scroller.inc" viene effettuata un'interrogazione alla tabella "News" del database, in cui si selezionano tutte le notizie con l'attributo "Stato" a '1' e quindi le si visualizzano nella bacheca.
Come nel caso del box sottostante all'immagine dello spettacolo in programmazione, anche le notizie contenute in questa bacheca possono contenere scritte in grassetto, colorate o anche collegamenti. Per esempio, selezionando con il mouse la parola "Ficarra & Picone" che si può vedere nel titolo di una notizia in figura 1, si accede ad una pagina con dettagli sullo spettacolo fuori programmazione pubblicizzato.

3.3.2 Menu principale

Il menu principale è contenuto nel file "menu.inc" ed è richiamato in tutte le pagine del sito, sia nell'area pubblica che in quella privata. Il menu principale è costituito da tre aree tematiche: teatro, stagione e biglietteria (fig.2). Inoltre selezionando con il mouse la scritta a caratteri grandi "Politeama Genovese" si accede alla 'Home Page'. Ciascuna delle tre aree è gestita da una diversa pagina PHP, la quale prende nome dall'area stessa.

Fig. 2 Pagina dell'area 'Teatro'
Fig. 2 Pagina dell'area 'Teatro'

Nell'area dedicata alle notizie sul teatro si possono visualizzare una serie di informazioni relative: alla sua storia (fig.2), alle specifiche tecniche, a curiosità riguardanti il mondo del teatro, a come arrivare a teatro, a consigli su ristoranti e alberghi convenzionati nel centro di Genova. Alcune di queste informazioni sono accessibili selezionando una voce di un ulteriore menu chiamato "Approfondimenti" che appare sulla destra dello schermo, in una qualunque delle pagine dell'area. Le pagine caricate nel centro dello schermo sono file HTML che la direzione del teatro ci ha fornito e che vengono inclusi, di volta in volta, grazie ai parametri che l'utente passa in 'Get' selezionando con il mouse i collegamenti d'interesse. Come per la bacheca elettronica delle notizie nella 'Home', anche in questo caso i testi sono inclusi all'interno di uno 'scroller' che, grazie alle freccie agli angoli sulla destra, fa scorrere il testo dall'alto verso il basso, evitando così di cambiare la struttura della pagina in caso di file HTML inclusi particolarmente lunghi. Per quanto riguarda l'immagine sopra il testo essa cambia da pagina a pagina dell'area e, poiché in seguito si potrebbe decidere che il formato non deve essere più JPG ma magari PNG o flash, si richiama il file "percorso/tabletop*", tramite una funzione PHP ("shell_exec") che ha come parametro una stringa che è passata come comando al sistema operativo del server; così facendo l'importante è che l'immagine abbia sempre nome "tabletop" ma, qualunque sia la sua estensione, verrà presentata su video.
L'area dedicata alla biglietteria ha funzionamento analogo a quello appena descritto, con la differenza che in questo caso il riquadro "Approfondimenti" contiene informazioni relative: agli abbonamenti, ai metodi per l'acquisto dei biglietti, ai prezzi dei biglietti e ai punti vendita.
L'area dedicata agli spettacoli ha invece una struttura più complessa. Quando selezioniamo con il mouse il collegamento di "La Stagione" o "stagione 2004/2005" si apre una pagina in cui vengono visualizzati tutti gli spettacoli; la stessa pagina la visualizziamo selezionando, all'interno del box "Tutta la stagione - ricerca spettacoli", la voce "elenca tutti gli spettacoli". Se invece selezioniamo "stagioni passate" si apre una pagina con, al centro, un elenco di collegamenti ai documenti in formato PDF delle locandine delle passate stagioni teatrali e, sulla sinistra, lo stesso riquadro 'Prossimamente in teatro' che è presente anche nella 'Home' (fig.2). Per riuscire a visualizzare tutti i file delle locandine disponibili si ricorre alla stessa procedura già analizzata nel Centro Solidarietà di Genova per visualizzare tutti i nomi di testi HTML del sito modificabili. Quindi, anche questa volta, se il sistema operativo del server non fosse Linux ma Windows la pagina non funzionerebbe correttamente.

3.3.3 Ricerca spettacoli

La funzione di ricerca spettacoli è offerta dal box "Tutta la stagione - ricerca spettacoli". Questo box si trova in quasi tutte le pagine del sito quasi sempre sulla parte destra dello schermo verso il basso (fig.2). Esso è costituito da un collegamento, verso una pagina che visualizza tutti gli spettacoli dell'attuale stagione teatrale, e da un modulo costituito da due menù a tendina che permettono di selezionare i campi d'interesse rispetto ai quali effettuare una ricerca tra gli spettacoli nel database. I menù a tendina, realizzati tramite il tag HTML "select", permettono: il primo, di indicare, tra i mesi di programmazione del teatro, quello in cui si desidera conoscere le rappresentazioni; il secondo, di selezionare il genere d'interesse tra quelli possibili.

Fig. 3 Risultati ricerca
Fig. 3 Risultati ricerca

Per iniziare una ricerca con le preferenze indicate è sufficiente selezionare con il mouse l'immagine con le doppie freccie rivolte verso destra: in questo caso essa funziona come un pulsante di invio del modulo stesso. Inviato il modulo viene caricata la pagina "stagione.PHP", con il parametro "pagina" in 'Get' al valore "searchres" così che nella pagina, al centro, viene caricato il file "searchres.inc" deputato alla visualizzazione della lista di spettacoli corretti (fig.3).
L'algoritmo per l'estrazione dal database degli spettacoli è stato scritto due volte in quanto nella prima versione, seppur funzionante, faceva svolgere una grossa mole di lavoro all'interprete del server prendendo dal database quasi tutti gli spettacoli ed in seguito, tramite blocchi logici, visualizzando a schermo quelli corretti. Nella seconda versione si è invece spostato il problema sull'interrogazione al database che viene fatta in maniera tale che le tuple restituite corrispondano a quelle degli spettacoli con le caratteristiche scelte dall'utente.
Innanzi tutto bisogna chiarire come funziona l'interrogazione al database. Oltre ai normali predicati di confronto relazionali, SQL mette a disposizione un operatore "like" per il confronto di stringhe, che permette di confrontare stringhe in cui compaiono i caratteri speciali "_" e "%". L'interrogazione "Select * From Spettacoli Where DataInizio like '2004-10%' or DataFine like '2004-10%' " è soddisfatta da un qualsiasi spettacolo che inizia o finisce la propria programmazione in un qualunque giorno del mese di Ottobre dell'anno '2004'.
Passando ad analizzare il comportamento dell'algoritmo, inizialmente è verificato se l'utente abbia effettuato una ricerca con nessun campo selezionato, oppure selezionando il collegamento "elenca tutti gli spettacoli", e in tal caso si verifica quale mese dell'anno sia quello in corso: se è un mese posteriore o uguale a Luglio, allora si visualizzano tutti gli spettacoli nel database che iniziano o terminano in qualunque giorno dal Settembre del corrente anno al Maggio dell'anno venturo; se è un mese anteriore a Luglio, si visualizzano tutti gli spettacoli del periodo che va dal Settembre dell'anno passato al Maggio dell'anno in corso. Per capire la logica dietro all'algoritmo, bisogna tenere a mente che nel database, in futuro, potranno essere memorizzati spettacoli anche degli anni passati, e che, inoltre, la stagione teatrale inizia ad Ottobre e finisce a Maggio. Il caso più semplice si verifica quando la ricerca è effettuata sul solo genere: sarà allora sufficiente visualizzare tutti gli spettacoli che hanno nell'attributo omonimo il valore indicato dall'utente. Infine vi è il caso in cui l'utente seleziona gli spettacoli di un dato mese oppure di un dato mese e un certo genere. Le due situazioni sono risolte nello stesso modo in quanto l'interrogazione effettuata è la stessa e cioè "SELECT * FROM Spettacoli WHERE Genere LIKE '$select2' AND (DataInizio LIKE '$interrogazione' OR DataFine LIKE '$interrogazione') ORDER BY DataInizio; " dove, se il genere non viene selezionato, "select2" vale '%' mentre in caso contrario ha il valore scelto dall'utente.
Per quanto riguarda il controllo sulla data, l'algoritmo è il seguente:
  • se si effettua una ricerca da Luglio in avanti selezionando un mese posteriore ad Agosto, bisogna visualizzare gli spettacoli dell'anno in corso e del mese selezionato. Esempio: a Novembre 2004 decido di voler vedere gli spettacoli di Dicembre allora la variabile '$interrogazione' vale "2004-12%";
  • se si effettua una ricerca da Luglio in avanti selezionando un mese anteriore ad Agosto, dato che è probabile che io voglia visualizzare gli spettacoli del mese selezionato dell'attuale stagione teatrale, e non della passata, bisogna visualizzare gli spettacoli dell'anno venturo e del mese selezionato. Esempio: a Novembre 2004 decido di voler vedere gli spettacoli di Marzo allora la variabile '$interrogazione' vale "2005-03%";
  • se si effettua una ricerca prima di Luglio selezionando un mese posteriore ad Agosto, bisogna visualizzare gli spettacoli dell'anno passato e del mese selezionato in quanto la futura stagione teatrale ancora non esiste, e dunque sono interessato a qualche spettacolo che è già uscito di programmazione. Esempio: a Marzo 2005 decido di voler vedere gli spettacoli di Dicembre allora la variabile '$interrogazione' vale "2004-12%";
  • se si effettua una ricerca prima di Luglio selezionando un mese anteriore ad Agosto, bisogna visualizzare gli spettacoli dell'anno in corso e del mese selezionato. Esempio: a Marzo 2005 decido di voler vedere gli spettacoli di Aprile allora la variabile '$interrogazione' vale "2005-04%";
Come si può vedere dal codice dell'interrogazione, riportato in precedenza, lo spettacolo viene visualizzato se va in scena, anche per un solo giorno, nel mese scelto.
Altro algoritmo particolarmente interessante, presente nella pagina "searchres.inc" è quello utilizzato per visualizzare un predeterminato numero di spettacoli nella stessa pagina. Infatti, quando viene effettuata una ricerca, spesso gli spettacoli, che andrebbero visualizzati, sono in un numero tale che, mostrandoli tutti nella stessa pagina, non si otterrebbe un buon risultato grafico. Affinché si possa variare a proprio piacimento il numero di spettacoli per pagina visualizzabili, questo valore è impostato da una sola istruzione del codice PHP assegnando ad una variabile il valore attuale, che è '4'. Questa riga è opportunamente commentata in maniera tale che sia facilmente individuabile. La necessità di cambiare questo valore si è realmente presentata dopo che il mio tirocinio presso la Wildcard s.r.l. era terminato in quanto, secondo il parere della responsabile del Politeama, quattro spettacoli erano troppo pochi da visualizzare nella stessa pagina: il grafico, nonostante le sue limitate conoscenze di PHP, è stato in grado di modificare l'impostazione.
Dal momento che non tutti i risultati vengono visualizzati contemporaneamente, il meccanismo con cui si passa da una pagina all'altra è gestito come si fa nei motori di ricerca: nella parte bassa dello schermo si trova una scritta "Pagine risultati:" con indicato il numero di pagine necessarie alla visualizzazione di tutti i risultati dove il numero stesso è un collegamento verso la pagina con gli spettacoli cercati (fig.3). Ovviamente nel caso il risultato della ricerca restituisca un numero di spettacoli inferiore o uguale a quelli che possono essere mostrati contemporaneamente, la scritta "Pagine risultati:" non comparirà.
L'algoritmo richiede che in 'Get' venga passata una variabile il cui valore indichi il numero di spettacoli già visualizzati. Infatti, gli spettacoli sono mostrati nelle varie pagine in ordine crescente di data di inizio della rappresentazione, cioè nell'ordine in cui vengono estratti dal database. L'idea è che se io so quanti spettacoli sono già stati visualizzati, e quanti devono essere visualizzati per ogni pagina, posso scartare le prime tuple estratte dal database, che corrispondono agli spettacoli già visualizzati in altre pagine, visualizzarne un numero corretto, e quindi fermarmi. Grazie alla funzione 'mysql_num_rows' di PHP è possibile conoscere il numero di tuple coinvolte in una certa interrogazione ed è grazie a questo parametro che si decide se visualizzare o meno la scritta "Pagine risultati:" in fondo alla pagina. I vari numeri di pagine dei risultati saranno dei collegamentiu alla stessa pagina con passati in 'Get' i parametri: 'pagina=searchres' necessario per fare in modo che "Stagione.PHP" includa la pagina con il codice necessario alla visualizzazione dei risultati; "var1=$select1" e "&var2=$select2", nel caso di una ricerca per mese o per genere o per entrambi, che servono affinché la pagina possa fare nuovamente l'interrogazione con estrazione degli spettacoli dal database; "ricerca=tutti", nel caso di una ricerca su tutti gli spettacoli, sempre per l'interrogazione al database; "stamp=$visualizzatetot" necessario per sapere il numero di spettacoli finora visualizzati.
Sarebbe stato possibile, invece di passare i dati per rifare l'interrogazione e il numero di spettacoli già visti, passare gli identificativi degli spettacoli da visualizzare in una data pagina. Questo avrebbe reso più veloce il caricamento delle pagine in quanto il numero di tuple restituite dall'interrogazioni sarebbe stato minore e non ci sarebbe stato bisogno di scartare alcune righe, ma in caso di modifica del numero di pagine contemporaneamente visualizzate all'interno della stessa pagina quest'algoritmo si sarebbe dimostrato meno flessibile, richiedendo l'intervento di un programmatore.
Per quanto concerne i vari spettacoli visualizzati, per ognuno viene mostrato: il file flash di piccole dimensioni, l'attributo del database 'DatoUno' in grassetto, l'attributo 'DatoDue', quando presente, ed infine l'attributo 'desc_breve', che dovrebbe aver la funzione di incuriosire il lettore tanto da spingerlo di andare a leggere la scheda dello spettacolo. In tutti i file flash, compresi quelli di tipo piccolo, è presente un collegamento alla pagina con la scheda dello spettacolo. Per attivare il collegamento è sufficiente selezionare con il mouse le doppie freccie, rivolte verso destra, che si trovano, in basso a destra, in tutti i flash. Di questo collegamento all'interno dei flash si è occupato l'altro sviluppatore, con cui ho collaborato per la creazione del sito, inserendo una riga di codice all'interno del file tramite il programma per la creazione di flash di Macromedia.

3.3.4 Scheda spettacoli

Una volta che si è selezionato con il mouse un collegamento, all'interno di un qualunque file flash, si accede alla pagina di visualizzazione della scheda dello spettacolo, da cui possiamo ottenere informazioni più approfondite sulla rappresentazione scelta. La pagina che gestisce la visualizzazione degli spettacoli è sempre "stagione.PHP" che in questo caso ha in 'Get': la variabile "pagina=scheda", in modo da sapere quale funzionalità la pagina debba svolgere; la variabile "id=IdSpettacolo", affinché possa essere caricata la scheda dello spettacolo selezionato. Le primissime righe di codice di "stagione.PHP" servono per affrontare il caso in cui, per qualche errore o per manipolazioni dell'utente sulla barra degli indirizzi, si possa arrivare a questa pagina senza che in 'Get' si trovi alcun valore di 'id'. In tal caso verrà visualizzato lo spettacolo corrente, tenendo eventualmente conto di una eventuale visualizzazione speciale, in base all'attributo "Speciale" della tabella "Spettacoli".

Fig.4 Scheda spettacolo
Fig.4 Scheda spettacolo

Prima di passare ad analizzare ciò che appare al centro dello schermo, si può notare, in figura 4, come il box "Prossimamente" visualizzi anche l'immagine dello spettacolo di cui viene mostrata la scheda a pieno schermo, nel caso questo sia tra i prossimi tre spettacoli che vanno in rappresentazione. Questa scelta è stata richiesta espressamente dal teatro per evidenziare la collocazione temporale dello spettacolo quando la sua rappresentazione è imminente.
Al centro dello schermo è visualizzata l'immagine flash di medie dimensioni; sotto quattro bottoni con soprascritte le loro funzioni: estratti audio, estratti video, rassegna stampa e acquista biglietto. Non è detto che tutti e quattro i bottoni siano sempre visualizzati: l'acquisto del biglietto sarà possibile solo a partire da qualche mese prima della rappresentazione; gli altri bottoni saranno visualizzati solo quando sono effettivamente disponibili file audio, video o documenti relativi allo spettacolo visionato. Si è deciso, per convenzione, che i file multimediali possono avere solo dei nomi sempre uguali: "audio.mp3" per gli estratti audio, "video.avi" per quelli video e "stampa.gif" per i documenti. Questi file si trovano all'interno della cartella "file" dentro la cartella dello spettacolo corrispondente. Conoscendo l'id dello spettacolo, si verifica se esiste, tramite dei blocchi logici e l'utilizzo della funzione PHP 'file_exist', il percorso "spettacoli/spet_id/file/nomefile". Nel caso il percorso esista, si visualizza il bottone corrispondente e si attiva il collegamento alla pagina "popup.PHP", destinata a visualizzare in una nuova finestra il documento oppure ad aprire lo stream real time per il trasferimento del file multimediale. Di questa pagina PHP e dell'implementazione del server di streaming si è occupato l'altro sviluppatore; si è discusso sulla possibilità di scaricare i file via 'ftp' ma abbiamo pensato che la soluzione di streaming fosse la migliore in quanto permette di visualizzare una parte a proprio piacimento del file multimediale invece di dover scaricare tutto il file prima di poterne vedere anche solo una piccola parte.
Sotto ai bottoni, viene visualizzata, all'interno del consueto box scorribile dall'alto verso il basso come nel caso delle notizie in 'Home page', la scheda dello spettacolo contenente la trama dello spettacolo e, talvolta, qualche curiosità inerente ai protagonisti. Questa scheda si trova all'interno del file "scheda.HTML" dentro la cartella dello spettacolo.
Tutto quanto detto finora cambia nel caso si debba visualizzare uno spettacolo che ha il campo "speciale" nel database con valore settato ad '1'. In questo caso il file flash di medie dimensioni non esisterà e verrà invece visualizzata un'immagine JPG con sotto i consueti pulsanti a seconda della presenza dei file multimediali associati. Non vi sarà, invece, nulla al posto dello scroller con la trama dello spettacolo.
Infine, nel caso di spettacoli fuori programmazione, vi è un terzo modo di visualizzare le informazioni che in questo caso eliminerà la possibilità di acquistare online il biglietto e di visualizzare contenuti multimediali.

3.3.5 Newsletter

La possibilità di iscriversi alla Newsletter del Politeama è stata una delle prime funzionalità che ho dovuto sviluppare. Appena questa è stata disponibile, si sono registrate, già nella prima settima, un centinaio di persone. La Newsletter permette di ricevere, ogni volta che un nuovo spettacolo va in programmazione, informazioni riguardo al medesimo direttamente alla casella di posta che si è registrata. In qualunque pagina del sito è presente il box "Newsletter", ed è sufficiente inserire qui il proprio indirizzo di posta elettronica e selezionare con il mouse le doppie freccie rivolte verso destra a fianco di "Registrati ora!" per poter essere indirizzati alla pagina "newsletter.PHP".
Il campo in cui si è immesso l'indirizzo, nel box sotto al menu, è infatti un modulo con l'attributo 'action' al valore "newsletter.PHP", così che quando si carica la pagina "newsletter.PHP" si può prendere il valore dell'indirizzo di posta elettronica dell'utente, passato dal modulo del box al modulo della pagina caricata, e visualizzarlo subito nel nuovo modulo. L'utente non dovrà così inserire due volte il suo indirizzo, ma nel caso l'abbia digitato sbagliato potrà comunque cambiarlo prima che venga iscritta un'altra persona.
Una volta che è digitato un indirizzo sono eseguiti alcuni controlli volti ad evitare grossolani errori di digitazione. Questi consistono nel controllo, tramite una funzione Javascript ('chkmail'), che il campo di testo contenente l'indirizzo contenga un carattere '@' e un carattere '.' in quanto qualunque indirizzo di posta deve includere questi caratteri. La funzione si attiva quando si selezionano con il mouse le doppie freccie verso destra per l'invio del modulo; affinché funzioni correttamente, dato che nelle pagine di "newsletter.PHP" possono essere presenti due moduli contemporaneamente, quello al centro dello schermo e quello nel menù di sinistra, 'chkmail' prende come parametro il nome del modulo di cui si vuole controllare il campo di testo.
Riguardo al funzionamento dell'algoritmo per la registrazione di nuovi utenti alla Newsletter, si è pensato che potrebbero essere inseriti, appositamente o per sbaglio, indirizzi errati o inesistenti: per questo, prima di aggiungere un nuovo indirizzo alla lista degli iscritti, contenuta in un file di testo di nome "mail.txt", si verifica che l'indirizzo inserito sia valido inviandogli una mail. Una volta che l'utente seleziona con il mouse il collegamento all'interno della mail di registrazione, viene indirizzato alla pagina "newsletter.PHP" e l'indirizzo viene definitivamente registrato in "mail.txt". La procedura di cancellazione è analoga.
Dopo che la mail per la conferma è stata inviata, ma prima che l'utente abbia attivato il collegamento al suo interno, l'indirizzo di posta elettronica è temporaneamente registrato nella tabella "Mail" insieme ad altri due valori: "password" e "data".
La password è un codice pseudo casuale generato da un'apposita funzione da me scritta ('randomnumb') che prende il valore di secondi passati da una data scelta per convenzione, e compie una serie di operazioni a seconda del suo valore. La password è stata introdotta dal momento che l'indirizzo di posta è passato in 'Get' alla pagina "newsletter.PHP" dal collegamento contenuto nella mail. Pertanto un qualsiasi utente, capito il meccanismo, potrebbe registrare nuovi indirizzi fasulli simulando l'invio della conferma con apposi indirizzo nella barra degli indirizzi.
Grazie all'utilizzo della password come ulteriore chiave prima della registrazione questo non è possibile. Infatti quando si seleziona con il mouse il collegamento nella mail di registrazione alla Newsletter vengono inviati in 'Get' alla pagina richiamata non solo l'indirizzo di posta ma anche la password, di una decina di caratteri, e, nel caso manchi uno dei due parametri, non viene aggiornato il file contenente tutte le mail.
La 'data' è invece la data in cui viene inserito nel database il nuovo indirizzo di posta in attesa che l'utente concluda la registrazione. Questo campo è necessario per evitare che nel database si accumulino dati inerenti ad utenti che hanno digitato indirizzi di posta inesistenti o che abbiano cambiato idea e non si siano più iscritti una volta ricevuta la mail di conferma. Ho scritto perciò un breve codice in PHP, che dovrà essere lanciato periodicamente da un 'trigger' del database, contenuto nel file "cleaner.PHP" che serve per eliminare tutte le righe della tabella "Mail" più vecchie di un mese.
Per evitare che in caso di aggiornamento della pagina che manda la mail di conferma si tentasse di registrare nuovamente gli stessi dati nel database o si inviasse più volte la mail, si è utilizzata una variabile ('norefresh') che fa in modo che nell'aggiornamento vengano visualizzate soltanto le schermate che confermano che le operazioni sono andate a buon fine ma non venga compiuta alcuna operazione.
Quando l'utente invia il modulo, visualizzato al centro dello schermo di figura 12, viene richiamata sempre la stessa pagina ('newsletter.PHP) con in 'Get' la variabile 'pagina=registra1' e si entra in un blocco logico nel quale: viene verificato che l'indirizzo indicato non sia già presente nel database; viene generato un codice pseudo casuale abbinato all'indirizzo; viene mandata una mail all'indirizzo corretto tramite un'apposita funzione PHP ('mail') in cui si devono impostare vari parametri affinché la mail inviata abbia le caratteristiche desiderate; viene registrata una nuova riga nel database corrispondente al nuovo indirizzo inserito; viene visualizzato a schermo il messaggio "Una mail è stata inviata all'indirizzo fornitoci.Per registrarti clicca sul link in essa contenuto.". Nel caso l'utente cancelli per errore la mail ricevuta, quando tenterà di iscriversi nuovamente alla Newsletter il codice verificherà che l'indirizzo inserito è già presente nel database: non tenterà di reinserirlo, altrimenti verrebbe visualizzato a schermo un messaggio d'errore assai poco elegante, recupererà la password legata all'indirizzo inserito, invierà una nuova mail, e visualizzerà a schermo il messaggio "Una mail è stata nuovamente inviata all'indirizzo fornitoci. Per registrarti clicca sul link in essa contenuto".
Per quanto riguarda la cancellazione la procedura è identica ed è gestita da un altro blocco logico sempre all'interno di "newsletter.inc": ciò che cambia è che nella mail l'Oggetto sarà "Cancellazione" invece di "Registrazione" e nelle schermate che notificano il funzionamento delle procedure al posto di "registrarti" ci sarà scritto "cancellarti".
Una volta che si è selezionato con il mouse il collegamento, nella mail di conferma per la registrazione, si apre una nuova finestra alla pagina "newsletter.PHP" del sito del Politeama. Qui un blocco logico si attiva in quanto riceve in 'Get' il valore "pagina=registra2" e compie le seguenti azioni: verifica se la password e la mail siano effettivamente registrate nel database; se uno dei due parametri non è valido visualizza il messaggio di errore "Spiacente ma il codice di registrazione non è corretto"; viene aperto il file "mail.txt" e si verifica che l'indirizzo di posta inserito non sia già registrato alla Newsletter ed, in questo caso, visualizza il messaggio "La tua mail è gia registrata alla nostra Newsletter."; nel caso l'indirizzo fornito non sia ancora registrato alla Newsletter lo si aggiunge in fondo alla lista di indirizzi e si inserisce un carattere '\n' affinché il file si ponga alla nuova riga e non si rischi che gli indirizzi siano tutti attaccati; si cancella la riga contenente l'indirizzo dal database; si visualizza un messaggio di conferma del successo delle operazioni. Ancora una volta tramite una variabile si evitano i possibili rischi di doppia scrittura in "mail.txt" in caso di aggiornamento della pagina.
Per quanto riguarda la cancellazione i meccanismi sono analoghi anche per questa seconda parte: l'unica differenza è che in questo caso se il file "mail.txt" contiene l'indirizzo di posta elettronica che si vuole cancellare, si procede con la sua cancellazione e si visualizza il messaggio "La tua mail è stata cancellata correttamente!"; in caso contrario si visualizza il messaggio d'errore "Spiacente, ma non puoi cancellare alcuna mail memorizzata.".
Analizzando più in dettaglio la gestione del file "mail.txt", va innanzi tutto precisato che essa è eseguita tramite una serie di funzioni che PHP mette a disposizione, con delle modalità simili a quelle utilizzate nel C++ anche se più limitate. Prima di registrare un nuovo indirizzo viene copiato tutto il registro in un array, si verifica che il nuovo indirizzo sia presente, quindi si effettua l'operazione di aggiunta o di cancellazione di un record dell'array e si riversa il suo contenuto nel file "mail.txt" aperto in sovrascrittura. Nel caso si verifichi un qualche errore nell'apertura del file l'utente è invitato a riprovare in un altro momento l'operazione.

3.3.6 Registrazione

E' possibile che in futuro il meccanismo di registrazione degli utenti per l'acquisto di biglietti online venga modificato. Questo perché, quando ho terminato la parte di applicazioni che mi sono state assegnate, non erano stati concordati tutti i parametri di scambio dei dati tra il politeama e l'azienda che deve gestire la vendita dei biglietti. L'idea dell'amministrazione del Politeama è che gli utenti si registrino al loro sito e che le informazioni passate all'azienda che deve gestire le vendite dei biglietti ('Happyticket') siano solo i dati anagrafici indispensabili, il numero di carta di credito e lo spettacolo di cui si sta comprando il biglietto. In passato, invece, gli utenti si registravano al sito di Happyticket e avevano tutta una serie di possibilità di acquisti online, tra cui quello dei biglietti degli spettacoli del Politeama Genovese.
Attualmente quando un utente seleziona con il mouse il bottone "acquista il biglietto", presente per lo spettacolo in corso sotto la locandina dello spettacolo nella 'Home page' e nella pagina con la scheda dello spettacolo, si accede ad una pagina ('autenticazione.PHP') da cui è possibile autenticarsi per comprare il biglietto oppure registrarsi se non si è ancora autenticati (fig.5).

Fig. 5 Modulo di autenticazione
Fig. 5 Modulo di autenticazione

La procedura di autenticazione è già funzionante e verifica, tramite un'interrogazione alla tabella "Utenti", che i dati inseriti siano corretti. Nel caso questi dati siano errati viene nuovamente visualizzato il modulo chiedendo di inserirli correttamente, altrimenti viene visualizzato il menu delle azioni che l'utente ha a sua disposizione. Per il momento esso presenta solo le voci "Per comprare il biglietto indicato clicca qui" e "Per modificare i tuoi dati clicca qui" entrambe non ancora disponibili. In caso vengano selezionate con il mouse si attiva, al centro dello schermo, un messaggio di avviso in Javascript che recita: "Non disponibile".
E' già completamente funzionante la procedura di registrazione. In essa si dovranno prendere da un modulo debitamente compilato tutti i dati dell'utente che saranno quindi registrati all'interno della tabella "Utenti". Gli attributi di questa tabella sono: Idutente, Nome, Cognome, Password, Indirizzo, Telefono, Nascita, Sesso, Indirizzo, Città, Provincia, Cap, Username, Professione, Settore, Nazione, Newsletter, Privacy1, Privacy2, CittaInteresse. A parte quelli che si commentano da soli si ha: "Idutente" è la chiave della tabella, serve per poter individuare unicamente una tupla, ed è generato in maniera completamente trasparente all'utente come intero crescente; "Password" è la chiave di accesso ai servizi insieme all'Username, deve essere lunga almeno quattro caratteri ed esser digitata due volte nello stesso modo; "Privacy1" e "Privacy2" sono due attributi in cui si indica se l'utente abbia accettato o meno la trattazione dei dati personali; "Username" è il 'nickname' scelto dall'utente per accedere ai servizi, deve essere unico all'interno del database anche se si è scelto un altro campo come chiave; "CittaInteresse" è la città ai cui spettacoli è interessato l'utente tra le tre disponibili (Genova, Trieste, Roma); "Newsletter" è un carattere che indica se l'utente voglia essere iscritto o meno alla newsletter del teatro; "settore" indica il campo di attinenza del mestiere praticato dall'utente alla voce "Professione".
Il collegamento nella pagina dell'autenticazione porta alla pagina "reg.PHP" che include al proprio interno il file "reg.inc" con il codice attinente alla parte centrale dello schermo dove si trova il modulo di registrazione vero e proprio. Appena la pagina è caricata per la prima volta si presenta una schermata che ci invita a scegliere, tramite la bandiera della nazione corrispondente, la lingua in cui desideriamo che sia visualizzato il modulo. L'anno passato il modulo era scritto in italiano e aveva le traduzioni in inglese contenute all'interno di parentesi tonde; quest'anno si è deciso di creare due moduli, sviluppati e gestiti entrambi all'interno di 'reg.inc', per avere una struttura più ordinata.
Scelta la lingua si può accedere al modulo per l'inserimento dei dati vero e proprio. Esso è composto da due parti: una prima parte contenente i campi obbligatori (fig.6) e una seconda contenente quelli facoltativi. Tra i campi obbligatori sono incluse due 'textarea' contenenti la descrizione di come verranno trattati i dati anagrafici dell'utente in modo da chiedere l'autorizzazione dell'utente, secondo le attuali norme vigenti. Le due aree prendono il testo dal file "Privacy1.txt" e "Privacy2.txt", che si trovano all'interno della cartella "documenti", e lo includono in queste due 'textarea', opportunamente disattivate affinché l'utente non possa scrivervi. Tutti i campi della tabella hanno fissato l'attributo HTML "maxlength" ad un valore opportuno così che non si possa, per esempio, digitare più di due caratteri nel campo "giorni" della data di nascita, in maniera tale da evitare almeno parte dei possibili errori.

Fig. 6 Modulo di registrazione in italiano
Fig. 6 Modulo di registrazione in italiano

I controlli sulla corretta immissione dei dati all'interno del modulo sono scritti in Javascript e contenuti nel file "FormCntVars.js", che si trova all'interno della cartella "java". Sempre all'interno di questo file ci sono le istruzioni necessarie per inizializzare le variabili, che conterranno gli attributi con i dati dell'utente, a valori iniziali utili per guidare l'utente nella compilazione del modulo. Per esempio la variabile "$nome" sarà inizializzata a "Inserisci qui il tuo nome".
Tutti i controlli sono eseguiti una volta che il modulo è stato inviato ad eccezione di quelli effettuati sui tre campi contenenti la data di nascita di chi si sta registrando. In questo caso, in cui è più frequente sbagliare, si richiama la funzione che controlla che i dati inseriti siano numerici e all'interno del campo di valori consentito, per esempio il numero di mese è un numero compreso tra '1' e '12', non appena il valore in essi contenuto è cambiato. L'attributo HTML all'interno del tag "input" che richiama la funzione per il controllo del campo è "onchange". Ad ognuna delle funzioni utilizzate per verificare la correttezza dei campi della data è passato, come parametro, il nuovo valore che l'utente ha digitato. Nel caso sia stato digitato un valore non valido, è visualizzato a schermo un messaggio d'errore. Dal momento che i moduli possono essere compilati sia in italiano che in inglese, anche i messaggi di errore è previsto che siano visualizzati nella lingua corrispondente.
Tutti gli altri controlli effettuati sui dati inseriti dall'utente sono svolti dopo che l'utente ha selezionato con il mouse il bottone "Invia". Ad eccezione di uno, che analizzeremo fra poco, sono tutti effettuati tramite Javascript e quindi è lo stesso browser dell'utente che li gestisce. Nel caso uno di questi controlli non vada a buon fine è bloccata l'operazione di invio del modulo al server: questo per dare all'utente la possibilità di correggere ciò che è stato indicato come errato, senza che vadano persi tutti i dati già inseriti.
Nel caso tutti i controlli sul modulo abbiano un esito positivo, sempre in "reg.inc" è prevista una parte di codice volta alla registrazione dei dati all'interno del database. In questa parte si effettua una semplice operazione di 'Insert' nel database dei dati forniti e si visualizza a schermo "I tuoi dati sono stati registrati. Clicca qui per tornare alla pagina di autenticazione" nel caso il modulo sia stato compilato in italiano oppure "Your data have been record successfully. Click here to return to the page of login" nel caso sia stato compilato in inglese. Anche nel caso di questa pagina, come in tutti quelli in cui si inseriscono dei dati nel database, è usata una variabile ("$Registrato") volta ad evitare possibili duplicazioni dei dati in caso di aggiornamento della pagina.