|
La nostra applicazione sfrutta un cookie per il mantenimento delle opzioni. Infatti è previsto un bottone Modifica
Opzioni che conduce alla schermata mostrata in figura 3:
 Figura 3 - Schermata dell'agenda per la specifica delle opzioni di visualizzazione.
Questa schermata permette di nascondere la visualizzazione di parte della agenda. Ovviamente il codice che implementa
la visualizzazione dell'agenda sarà più comprensibile dopo che sono state illustrate le informazioni su cui si basa: in
particolare occorre tenere presente le opzioni, che illustriamo in questo paragrafo.
Poiché i cookie devono occupare meno spazio possibile per le limitazioni imposte dai browser, utilizzeremo per la loro
memorizzazione solo dei singoli bit di una maschera. Definiamo delle costanti corrispondenti alle varie opzioni:
// File: functions.inc
// Opzioni
define(F_COMP_ADDR, 1);
define(F_COMP_PHONE, 2);
define(F_COMP_NET, 4);
define(F_CONT_HOME, 8);
define(F_CONT_MOBILE, 16);
define(F_CONT_EMAIL, 32);
In PHP un cookie appare come una variabile come le altre. Quando inizia l'esecuzione delle pagine vengono infatti
impostate tutte le variabili specificate nella query string specificato dal GET, nei dati forniti con il POST ed infine
variabili rese persistenti con i cookie, in questo ordine. Si ricorda che l'opzione gpc_order permette di cambiare
questo comportamento (vedere paragrafo 6.7).
La seguente form semplicemente inizializza i suoi campi in base al valore che trova nella variabile $mask. Non viene
fatta nessuna gestione particolare per leggere questa variabile: il PHP assegna le variabili automaticamente.
<form>
<table border=0 cellspacing=0 cellpadding=5>
<tr bgcolor=#abcdef>
<th>Opzioni Ditta
<th>Opzioni Contatto
<tr>
<td bgcolor=#dddddd valign=top>
<? echo "<input type=checkbox name=opt[] value=" . F_COMP_ADDR .
( ($mask & F_COMP_ADDR) ? " checked>" : ">") ?>
Nascondi Indirizzo <br>
<? echo "<input type=checkbox name=opt[] value=" . F_COMP_PHONE .
( ($mask & F_COMP_PHONE) ? " checked>" : ">") ?>
Nascondi Numeri Telefonici <br>
<? echo "<input type=checkbox name=opt[] value=" . F_COMP_NET .
( ($mask & F_COMP_NET) ? " checked>" : ">") ?>
Nascondi Riferimenti Internet
</blockquote>
<td bgcolor=#eeeeee valign=top>
<? echo "<input type=checkbox name=opt[] value=" . F_CONT_HOME .
( ($mask & F_CONT_HOME) ? " checked>" : ">") ?>
Nascondi Telefono Casa
<br>
<? echo "<input type=checkbox name=opt[] value=" . F_CONT_MOBILE .
( ($mask & F_CONT_MOBILE) ? " checked>" : ">") ?>
Nascondi Telefono Cellulare
<br>
<? echo "<input type=checkbox name=opt[] value=" . F_CONT_EMAIL .
( ($mask & F_CONT_EMAIL) ? " checked>" : ">") ?>
Nascondi Email
<tr bgcolor=#abcdef>
<td colspan=2 align=center>
<? echo "<input name=op type=submit value='".SAVE_OPTIONS."'>" ?>
<input name=op type=submit value='Annulla'>
</table>
Notare come i vari campi di input vengono visualizzati con il segno di spunta oppure no aggiungendo l'attributo
CHECKED quando il bit corrispondente nella maschera è a 1. A parte questo trucco non ci sono particolari novità. La
parte più sofisticata la vediamo adesso, ed è relativa alla gestione del cookie, che mostra come impostarli, e alla
gestione delle checkbox.
Come abbiamo fatto notare finora, il PHP inizializza le variabili leggendole dai dati forniti con GET, POST e COOKIE.
Una variabile di un POST per esempio sovrascrive una variabile omonima di un GET. La sovrascrittura avviene anche
con variabili omonime fornite con uno stesso metodo: se in una form per esempio sono presenti due campi con lo
stesso nome, il secondo sovrascrive il primo. Le variabili possono anche essere assegnate ai campi di un array
associativo, come abbiamo visto nell'esempio precedente, specificando per esempio come nome della variabile
Company[idCompany].
Quando occorre gestire una serie di campi simili (come nel caso delle checkbox), è possibile memorizzare tutti i valori
in un array. Si ottiene questo risultato specificando dopo il nome del campo due parentesi quadre. Nella form che
abbiamo appena visto utilizziamo opt[]. Ricordiamo che in PHP, opt[] = 1; aggiunge un elemento all'array e
assegna il valore all'elemento aggiunto. Chiarito questo punto, possiamo esaminare la gestione delle opzioni.
Nel file agenda.php abbiamo:
// necessario porlo qui: bisogna impostare
// i cookie prima di ogni altra cosa
Header("pragma", "no-cache");
if($op==SAVE_OPTIONS)
save_options($opt);
La save_options è posta all'inizio della pagina in modo che venga chiamata prima che venga prodotto qualsiasi
altro output (per via del fatto che le intestazioni di una pagina devono venir inviate prima del documento). La funzione
save_options codifica le opzioni che sono memorizzate nell'array opts e genera il valore della variabile $mask
che viene salvata come cookie:
// File: functions.inc
Function save_options($opt) {
global $mask;
$mask = 0;
if(is_array($opt))
while(list($k,$v) = each($opt))
$mask |= $v;
setcookie("mask", $mask, time()+3600);
}
La funzione setcookie specifica il nome e il valore del cookie, e l'ora di scadenza (in questo caso un'ora dopo che è
stato impostato). Notare che se nella pagina delle opzioni non viene selezionato alcun elemento, non viene fatto alcun
assegnamento alla variabile opts che quindi non è un array e genera errore eseguendo each. Per questo viene
verificato che si tratta effettivamente di un array con is_array prima di ogni altra operazione.
ATTENZIONE: un problema che spesso si verifica con i cookie è legato al fatto che la pagina che imposta i cookie non li
legge! Quando eseguo setcookie, il resto della pagina non è ancora a conoscenza del nuovo valore del cookie
(mentre solitamente è una informazione che serve già da subito!). Questo genera solitamente una certa confusione. Per
fortuna esiste una semplice soluzione: fare in modo la funzione che imposta un cookie inializzi già da subito la
variabile che nelle successive invocazioni conterrà il valore letto dal cookie. Per questo motivo abbiamo usato global
$mask, in modo da impostare subito la variabile $mask che nelle successive chiamate verrà invece letta dai coolie.
|