|

Figura 1 Diagramma della Agenda Contatti
Il diagramma va letto come segue: i nodi rettangolari rappresentano nodi di "smistamento" delle azioni che vengono
richieste, mentre i nodi circolari rappresentano la visualizzazione dei risultati. In PHP, ad differenza della
programmazione CGI classica in cui è più semplice distinguere tra pagine e script, si hanno solamente pagine. Per
risolvere questo problema utilizzeremo una "pagina" che realmente non visualizza nulla, ma esegue delle azioni. Una
volta che una azione viene eseguita, in risposta alle necessità vengono richiamate, tramite include, le pagine vere e
proprie che visualizzano i risultati delle operazioni. L'applicazione è pertanto composta dai seguenti file:
| File |
Descrizione |
| agenda.php |
Il file principale dell'applicazione.
Decide le azioni da effettuare in base ai bottoni premuti
Include gli altri file in base all'azione scelta. |
| list.inc |
Visualizza l'agenda.
Elenca le ditte e i contatti per ditta |
| company.inc |
Form per l'immissione e la modifica delle ditte |
| contact.inc |
Form per l'immissione e la modifica dei contatti |
| options.inc |
Form per la modifica delle opzioni di visualizzazione |
| functions.inc |
Raccolta di funzioni e definizioni di costanti.
La maggior parte delle operazioni non visuali
sono effettuate da funzioni raccolte in questo file. |
Nella maggior parte dei casi, l'azione da eseguire viene scelta in base al bottone che viene premuto. Un bottone in
HTML viene rappresentato da un campo <INPUT TYPE=SUBMIT NAME=nome VALUE=etichetta>. Quando il
bottone viene premuto lo script che viene indicato come destinatario ottiene in input un campo chiamato con il nome
che ha come valore l' etichetta specificata nel tag. Allo scopo di uniformare la gestione, scegliamo di chiamare tutti i
campi di input con lo stesso nome, op, e di centralizzare la gestione delle azioni da effettuare nella pagina principale,
impostando come action di tutte le form la pagina agenda.php.
Ogni form quindi richiama agenda.php; questo script trova sempre nella variabile op l'azione da eseguire. Una
serie di if a cascata selezionano l'azione da effettuare, chiamano la funzione opportuna e infine visualizzano i risultati
includendo (con include) la pagina da visualizzazione. Esaminiamo adesso il codice che implementa questa
impostazione. Prima di tutto definiamo alcune costanti, corrispondenti ai bottoni che appaiono nell'applicazione:
// File: functions.inc
// etichette dei bottoni
define(NEW_COMPANY, "Nuova Ditta");
define(EDIT_COMPANY, "Modifica Ditta");
define(DELETE_COMPANY, "Elimina Ditta");
define(SAVE_COMPANY, "Salva Ditta");
define(NEW_CONTACT, "Nuovo Contatto");
define(EDIT_CONTACT, "Modifica Contatto");
define(DELETE_CONTACT, "Elimina Contatto");
define(SAVE_CONTACT, "Salva Contatto");
define(EDIT_OPTIONS, "Modifica Opzioni");
define(SAVE_OPTIONS, "Salva Opzioni");
Il codice di agenda.php è:
<? //File: agenda.php
require("functions.inc");
// necessario porlo qui: bisogna impostare
// i cookie prima di ogni altra cosa
Header("pragma", "no-cache");
if($op==SAVE_OPTIONS)
save_options($opt);
?>
<html>
<head>
<title>Agenda</title>
</head>
<body bgcolor=#ffffff>
<?
if($op==EDIT_OPTIONS) {
include("options.inc");
} else if($op==SAVE_OPTIONS) {
include("list.inc");
} else if($op==NEW_COMPANY) {
include("company.inc");
} else if($op==EDIT_COMPANY) {
if($Company = select_company($idCompany)) {
include("company.inc");
} else {
setErr(ERR_NOKEY);
include("list.inc");
}
} else if($op==SAVE_COMPANY) {
if(check_company()) {
insert_update_company();
include("list.inc");
} else {
include("company.inc");
}
} else if($op==DELETE_COMPANY) {
if($idCompany)
delete_company($idCompany);
else
setErr(ERR_NOKEY);
include("list.inc");
} else if($op==NEW_CONTACT) {
include("contact.inc");
} else if($op==EDIT_CONTACT) {
if($Contact = select_contact($idContact)) {
include("contact.inc");
} else {
setErr(ERR_NOKEY);
include("list.inc");
}
} else if($op==DELETE_CONTACT) {
if($idContact)
delete_contact($idContact);
else
setErr(ERR_NOKEY);
include("list.inc");
} else if($op==SAVE_CONTACT) {
if(check_contact()) {
insert_update_contact();
include("list.inc");
} else
include("contact.inc");
} else {
include("list.inc");
}
?>
</body>
</html>
Il file inizia con un require('functions.inc') che carica tutte le funzioni di gestione che per comodità sono
state scritte in un file separato.
ATTN: Ricordiamo che una pagina inviata da un Web Server inizia sempre con una serie di intestazioni che forniscono
informazioni aggiuntive. Alcune funzioni utilizzano le intestazioni per comunicare con il browser. Per questo motivo in
PHP queste funzioni devono essere poste immediatamente all'inizio di una pagina, prima ancora che venga generato
qualsiasi testo HTML. Infatti l'intestazione deve venire viene inviata prima del documento. Quando si richiamano le
funzioni suddette dopo che si è già scritto qualcosa che appartiene al corpo del documento, le intestazioni a questo
punto non possono più essere inviate, l'operazione viene ignorata e viene generato un messaggio di avvertimento.
La funzione che genera intestazioni sono, in questo caso, la SetCookie la Header. La prima genera un cookie,
mentre la seconda genera una richiesta al browser di disabilitare il caching delle pagine. I cookie che servono a
memorizzare variabili nel browser, e a mantenere quindi uno stato dell'applicazione, come vedremo nel prossimo
paragrafo. Per quanto riguarda la disabilitazione della cache, bisogna tenere presente che il browser, allo scopo di
evitare il caricamento ripetuto della stessa pagina (operazione comune quando l'utente naviga nel web e torna indietro
ad una pagina già vista), memorizza le pagine già viste in una copia locale. Purtroppo le applicazioni Web tipicamente
generano le pagine dinamicamente, e il caching solitamente crea più confusione che aiuto: per esempio se l'utente
modifica il database inserendo un nuovo elemento e poi torna alla pagina indice, lo stesso URL che ha visualizzato la
vecchia situazione dovrà visualizzare quella relativa al nuovo database. Se è attivo il caching viene visualizzata la
vecchia pagina, quindi l'utente non vede il nuovo elemento che è stato inserito anche se effettivamente il database è
cambiato. Allo scopo di evitare questi problemi, si comunica al browser di disabilitare il caching per quella pagina. Un
modo è quello di utilizzare l'intestazione non standard (ma accettata dai principali browser) pragma con il valore
no-cache. In generale la funzione Header genera (sempre che sia chiamata prima di generare altri output)
l'intestazione appropriata per il browser. Nel nostro caso, la funzione save_options genera, come vedremo, le
intestazioni necessarie per salvare informazioni di stato sull'applicazioni utilizzando i cookie.
Il resto della pagina è composta da una serie di if a cascata che scelgono l'azione da effettuare in base al valore della
variabile op. Si tratta di una traduzione in codice di quanto mostrato nello schema di figura 1.
|