ePrometeusCorsoLinuxLinux
testi articoli
Testi Articoli  Download
Home | PHP | Espressioni | Comandi | Libreria | Form | Cookie | Database | Config | 
CorsoJava è ora Video! Free for all!
Clicca Qui!
Tutorial PHP
Cookie
Gestione delle opzioni


<<< Gestione delle opzioni

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.

ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com