Processo e ritorno al form

ATTENZIONE: data la complessità dell'argomento, il contenuto di questo tutorial è stato diviso in più pagine che possono essere scelte dal menù qui sotto

Prosegue nelle pagine indicate qui di seguito
Form Processo al Form Pagina finale

Gli argomenti di questa pagina

  • I files necessari:
  • Il form
  • Il processo al form
  • Pagina di ringraziamento

Un sito PHP si distimgue da un normale sito in HTML per il fatto che le sue pagine sono dinamiche, cioè che la loro struttura e gli oggetti in esse contenute sono mutabili e cambiano col cambiare delle situazioni e delle richieste dell'utente.
Alcuni dei punti di forza di questo linguaggio sono appunto i FORM ed i DataBase.

Possiamo fare subito alcune considerazioni sui FORM, su come li presentiamo e su come li elaboriamo.

Uno dei problemi principali da risolvere, lavorando coi FORM, è quello che dobbiamo affrontare dopo che la loro elaborazione fallisce e dobbiamo ripresentarlo per far modificare o inserire nuovi dati. Se un FORM presenta pochissimi campi, come, per esempio, succede quando facciamo un login per entrare in un settore riservato di un sito o un forum, il problema del ritorno al FORM è irrilevante. Il vero problema si pone quando la validazione del FORM con numerosi campi fallisce e dobbiamo tornarci per correggere alcuni errori commessi e troviamo il FORM assolutamente vuoto e ricominciare ad inserire tutti i dati daccapo.

Possiamo decidere di scrivere tutta la procedure di riempimento del FORM, sua elaborazione e ringraziamento in una unica pagina. Ho provato ad usare questo metodo ma l'ho subito abbandonato perchè presenta alcuni inconvenienti. Se dopo la validazione del FORM dobbiamo inviare una E-Mail o dobbiamo registrare i dati ricevuti in un DataBase, facciamo dei refresh della pagina nella maggior parte dei casi avviene che la E-Mail e/o registrazione dei dati vengono ripetuti per ogni refresh. Per evitare questo occorrerebbe porre nella pagina molti controlli che, in termini di codice, significa scrivere molte righe di codice che andrebbero a gonfiare esageratamente la pagina.

La soluzione che sto adottando in questi tempi è quella di scrivere codice in più pagine differenti e la pagina del processo al FORM e relativo invio E-Mail e/o registrazione la rendo invisibile all'utente con una redirect tramite la funzione PHP header location che, a seconda dell'esito della validazione al FORM rimanda alla pagina del FORM o alla pagina finale dello script.

Rimane il problema della presentazione del FORM contenente ancora i dati precedentemente inseriti dopo il fallimento della sua validazione. Si potrebbero usare alcuni metodi che ho già sperimentato ed abbandonati. Quello che presento ora è l'uso delle SESSION e di una piccola Querystring. La SESSION servirà per portare i dati tra una pagina ed un'altra, la Querystring servirà ad indicare alla pagina del FORM da quale pagina si accede.

I files necessari:

  • pop_processo.php
  • config.php
  • pop_processo_post.php
  • pop_processo_thanks.php

Tutte queste pagine, eccetto il config, ovviamente, perchè va incluso nella pop_processo_post.php e nella pop_processo_thanks.php, per funzionare hanno bisogno di aprire e tenere in vita la SESSION con l'istruzione "session_start();" da mettere come prima riga su ogni pagina.

Il form

Ho presentato in questa pagina un form molto improbabile. Infatti vi ho voluto inserire diversi tipi di controlli per sperimentare il modo di ripopolamento dopo il fallimento della validazione.

  • I controlli di tipo text o textarea sono tra i più semplici da gestire.
  • Per le select il lavoro comincia a diventare più complesso: bisogna stabilire se dargli la proprietà selected
  • Per i radio è come la select ma bisogna stabilire se dargli la proprietà checked
  • Ancora più complesso è il trattamento delle checkbox. Se è un singolo controllo il problema è relativamente semplice. Ma se di controlli son più di uno occorre metterli in matrice ed anche i valori da leggere sono in matrice. Quindi per stabilire se dargli la proprietà checked occorre interrogare la matrice di valori.

Questo è il lavoro che viene eseguito nella pagina del FORM.

Nella parte alta della pagina azzero tutte le variabili che vengono usate per controllare tutti i campi del FORM. Tra queste ce n'è una, $camera, per la quale uso "unset()". Questo perchè, come dicevo più sopra, è la matrice che debbo consultare per controllare la serie di checkbox.
Fatto questo lavoro preliminare, controllo la condizione della variabile $_REQUEST['form'] che è la Querystring appesa al link della pagina se nella pagina del processo al FORM si sono riscontrati degli errori.
Se è presente questa variabile andiamo ad interrogare anche l'altra variabile di SESSIONE, $_SESSION['sess_error'], per controllare se contiene qualche errore.
Se viene riscontrata la presenza di errori trovati durante il processo al FORM, vengono valorizzate le varie variabili che ci serviranno per valorizzare i campi del FORM. I valori da dare a queste variabili vengono prelevati dalle variabili si SESSIONE valorizzate durante il processo al FORM.

Finito questo lavoro preliminare possiamo passare a disegnare il nostro FORM e restituirgli eventuali valori precedentemente inseriti.

  • Per i controlli del tipo text: per questo controllo possiamo usare la semplice forma che cambia la sua proprietà "value":
    value="<?php echo $variabile; ?>"
    non importa se la variabile è valorizzata o meno: nel primo caso avremo un valore per il controllo, nel secondo caso il valore sarà vuoto
  • Per il controllo textarea è quasi la stessa cosa: aggiungo il nuovo valore tra l'apertura e la chiusura del tag <textarea>......</textarea>:
    <?php echo $messaggio; ?>
  • Per il controllo select l'operazione è leggermente più complessa. Per selezionare una delle voci contenute tra le varie option non si può usare la proprietà "value" ma bisogna confrontare il "value" della option col valore contenuto nella variabile dedicata per poi decidere se si deve usare la proprietà "selected"
    In questo form ho volutamente inserite delle select scritte in HTML ed altre scritte in PHP per mostrare la lieve differenza tra le due istruzioni.
    Per entrambe viene eseguito un controllo per decidere se e quale voce selezionare. Per abbreviare e rendere più conciso lo script viene usato l'operatore ternerio " ? " in questa forma:
    • Per la select scritta in HTML:
      <option value="info" <?php echo ($motivo == 'info' ? "selected='selected'" : "" ) ?>>Informazioni</option>
    • Per la select scritta in PHP:
      echo "<option value=\"".$i."\"" . ($giorno == $i ? " selected='selected'" : "") . ">".$i."</option>\n";
  • Per il controllo radio si segue la stessa procedura vista per la select. Occorre confrontare il "value" del controllo radio col valore memorizzato nella variabile dedicata e, se il confronto risulta positivo viene attivato il controllo usando la proprietà "checked". Anche qui il confronto viene eseguito usando l'operatore ternario " ? " in uno dei due modi usati per la select:
    <input type="radio" name="mezzo" value="treno" <?php echo ($mezzo == 'treno' ? "checked='checked'" : "" ) ?> />
  • Per il controllo checkbox: anche per questo tipo di controllo occorre intervenire sulla proprietà "checked".
    Ma le cose si complicano ulteriormente per via della natura di queste checkbox quando lavorano in gruppi.
    Quando un checkbox è in un gruppo, per facilitarne l'identificazione durante il processo, si assegna la proprietà "name" ad una matrice come è stato fatto nell'esempio:
    name="camera[]".
    Solo i valori delle checkbox selezionate durante il processo vengono memorizzati anch'essi in una matrice.
    Di conseguenza, per stabilire se la checkbox deve essere mostrata come "checked", occorre usare un'altra strategia.
    Io mi sono comportato in questa maniera.
    Nella matrice $camera() ci sono solo i valori delle checkbox che durante il processo presentavano la proprietà "checked" impostata a checked.
    Per questo, per ogni checkbox controllo il suo valore con quelli memorizzati nella matrice. Se il riscontro è positivo nella variabile $axxx viene memorizzata la stringa "checked=\"checked\"", altrimenti la variabile $axxx rimane vuota.
    Finito questo lavoro passo a scrivere i vari checkbox aggiungendo semplicemente le variabili appena preparate.
    Ne consegue che, se la variabile è vuota, non viene aggiunto nulla, ma se la variabile contiene contiene la stringa "checked=\"checked\"" al controllo checkbox viene aggiunta questa stringa.

Ho usato anche una tecnica sperimentale per quanto riguarda le tre select usate per la data. In ogni select di solito nella prima option, quella che di solito è usata per le didascalie del tipo "scegli", di solito si imposta la proprietà "value" a vuoto: value="".
In questo caso, solo per risparmiare codice per interpretare i valori inviati dai tre campi che dovranno fromare la data, ho usato dare un valore: value=\"0\".

Quando occorre inserire una data in un form io preferisco sempre usare le tre select per la scelta del giorno, mese ed anno per alcuni motivi legati alla data:
il più importante è quello di evitare all'utente di commettere errori di digitazione
l'altro motivo è dato dalla gestione della data nella pagina del processo al form quando si incontra un campo "data"; infatti a seconda di quel che si vuol fare occorre che la data sia presentata nel formato "mm-gg-aaaa", oppure "aaaa-mm-gg", oppure "gg-mm-aaaa". Ma di questo ne parleremo in altra sede se e quando ci arriverò.

Questo che segue è il codice della pagina che contiene il FORM.

La pagina pop_processo.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
<?php
session_start
();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Form per inserimento dati</title>
</head>
<body>
<?php
$nominativo 
"";
$indirizzo "";
$citta "";
$mail "";
$motivo "";
$pagamento "";
$giorno "";
$mese "";
$anno "";
$permanenza "";
unset (
$camera);
$mezzo "";
$messaggio "";
if (isset(
$_REQUEST['form']) && $_REQUEST['form'] == "form") {
    if (
$_SESSION['sess_error']) {
        
$nominativo = ($_SESSION['sess_nominativo']);
        
$indirizzo = ($_SESSION['sess_indirizzo']);
        
$citta = ($_SESSION['sess_citta']);
        
$mail = ($_SESSION['sess_mail']);
        
$motivo = ($_SESSION['sess_motivo']);        //    sel
        
$pagamento = ($_SESSION['sess_pagamento']);    //    sel
        
$giorno = ($_SESSION['sess_giorno']);        //    sel
        
$mese = ($_SESSION['sess_mese']);            //    sel
        
$anno = ($_SESSION['sess_anno']);            //    sel
        
$permanenza = ($_SESSION['sess_permanenza']);
        
$camera = ($_SESSION['sess_camera']);        //    check
        
$mezzo = ($_SESSION['sess_mezzo']);        //    radio
        
$messaggio = ($_SESSION['sess_messaggio']);
        foreach ( 
$_SESSION['sess_error'] as $valore) {
            echo 
$valore "<br />\n";
        }
    }
}
?>
<h2>Il form per l'inserimento dei dati</h2>
<form method="post" name="modulo" action="pop_processo_post.php">
<table class="tabella_it">
<tr>
<td colspan="2">Modulo o Form di esempio</td>
</tr>
<tr>
<td>Nominativo (*)</td>
<td><input type="text" name="nominativo" value="<?php echo $nominativo?>" size="45" /></td>
</tr>
<tr>
<td>Indirizzo</td>
<td><input type="text" name="indirizzo" value="<?php echo $indirizzo?>" size="45" /></td>
</tr>
<tr>
<td>CittĂ </td>
<td><input type="text" name="citta" value="<?php echo $citta?>" size="45" /></td>
</tr>
<tr>
<td>E-Mail (*)</td>
<td><input type="text" name="mail" value="<?php echo $mail?>" size="45" /></td>
</tr>
<tr>
<td>Motivo contatto (*)</td>
<td>
<select name="motivo">
<option value="">Scegli</option>
<option value="info" <?php echo ($motivo == 'info' "selected='selected'" "" ?>>Informazioni</option>
<option value="prenota" <?php echo ($motivo == 'prenota' "selected='selected'" "" ?>>Prenotazione</option>
<option value="disp" <?php echo ($motivo == 'disp' "selected='selected'" "" ?>>Disponibilita</option>
<option value="prev" <?php echo ($motivo == 'prev' "selected='selected'" "" ?>>Preventivo</option>
</select>
</td>
</tr>
<tr>
<td>Tipo pagamento</td>
<td>
<select name="pagamento">
<option value="">Scelta tipo pagamento</option>
<option value="Contanti" <?php echo ($pagamento == 'Contanti' "selected='selected'" "" ?>>Contanti</option>
<option value="Assegno" <?php echo ($pagamento == 'Assegno' "selected='selected'" "" ?>>Assegno</option>
<option value="Bonifico" <?php echo ($pagamento == 'Bonifico' "selected='selected'" "" ?>>Bonifico</option>
<option value="Carta_credito" <?php echo ($pagamento == 'Carta_credito' "selected='selected'" "" ?>>Carta credito</option>
<option value="Altro" <?php echo ($pagamento == 'Altro' "selected='selected'" "" ?>>Altro</option>
</select>
</td>
</tr>
<tr>
<td>Data arrivo</td>
<td>
<?php
$mesi 
= array (
    
"01" => "Gennaio",
    
"02" => "Febbraio",
    
"03" => "Marzo",
    
"04" => "Aprile",
    
"05" => "Maggio",
    
"06" => "Giugno",
    
"07" => "Luglio",
    
"08" => "Agosto",
    
"09" => "Settembre",
    
"10" => "Ottobre",
    
"11" => "Novembre",
    
"12" => "Dicembre"
);
echo 
"<select name=\"giorno\">\n";
echo 
"<option value=\"0\">Giorno</option>\n";
for(
$i=1;$i<32;$i++) {
    echo 
"<option value=\"".$i."\"" . ($giorno == $i " selected='selected'" "") . ">".$i."</option>\n";
}
echo 
"</select>\n";
echo 
"<select name=\"mese\">\n";
echo 
"<option value=\"0\">Mese</option>\n";
foreach (
$mesi as $key => $value) {
    echo 
"<option value=\"".$key."\"" . ($mese == $key " selected='selected'" "") . ">".$value."</option>\n";
}
$cur_year date ("Y");
echo 
"</select>\n";
echo 
"<select name=\"anno\">\n";
echo 
"<option value=\"0\">Anno</option>\n";
echo 
"<option value=\"".$cur_year."\"" . ($anno == $cur_year " selected='selected'" "") . ">".$cur_year."</option>\n";
echo 
"<option value=\"".($cur_year+1)."\"" . ($anno == ($cur_year+1) ? " selected='selected'" "") . ">".($cur_year+1)."</option>\n";
echo 
"<option value=\"".($cur_year+2)."\"" . ($anno == ($cur_year+2) ? " selected='selected'" "") . ">".($cur_year+2)."</option>\n";
echo 
"<option value=\"".($cur_year+3)."\"" . ($anno == ($cur_year+3) ? " selected='selected'" "") . ">".($cur_year+3)."</option>\n";
echo 
"<option value=\"".($cur_year+4)."\"" . ($anno == ($cur_year+4) ? " selected='selected'" "") . ">".($cur_year+4)."</option>\n";
echo 
"<option value=\"".($cur_year+5)."\"" . ($anno == ($cur_year+5) ? " selected='selected'" "") . ">".($cur_year+5)."</option>\n";
echo 
"</select>\n";
?>
</td>
</tr>
<tr>
<td>Permanenza (*)</td>
<td>
<?php
echo "<select name=\"permanenza\">\n";
echo 
"<option value=\"\">GG</option>\n";
for(
$b=1;$b <= 30;$b++) {
    echo 
"<option value=\"".$b."\"" . ($permanenza == $b " selected='selected'" "") . ">".$b."</option>\n";
}
echo 
"</select>\n";
?>
Giorni
<!-- <input type="text" name="permanenza" value="<?php echo $permanenza?>" size="45" /> -->
</td>
</tr>
<tr>
<td>
Camera (*)
</td>
<td>
<?php
$a1 
"";
$a2 "";
$a3 "";
$a4 "";
$a5 "";
if (
is_array($camera)) {
$a1 = (in_array('Singola'$camera) ? "checked=\"checked\"" "");
$a2 = (in_array('Matrimoniale'$camera) ? "checked=\"checked\"" "");
$a3 = (in_array('Colazione'$camera) ? "checked=\"checked\"" "");
$a4 = (in_array('Mezza_Pensione'$camera) ? "checked=\"checked\"" "");
$a5 = (in_array('Pensione_completa'$camera) ? "checked=\"checked\"" "");
}
?>
<label><input name="camera[]" value="Singola" type="checkbox" <?php echo $a1?> />Camera singola</label><br />
<label><input name="camera[]" value="Matrimoniale" type="checkbox" <?php echo $a2?> />Camera matrimoniale</label><br />
<label><input name="camera[]" value="Colazione" type="checkbox" <?php echo $a3?> />Camera e colazione</label><br />
<label><input name="camera[]" value="Mezza_Pensione" type="checkbox" <?php echo $a4?> />Mezza pensione</label><br />
<label><input name="camera[]" value="Pensione_completa" type="checkbox" <?php echo $a5?> />Pensione completa</label>
</td>
</tr>
<tr>
<td>Mezzo di arrivo</td>
<td>
<label><input type="radio" name="mezzo" value="treno" <?php echo ($mezzo == 'treno' "checked='checked'" "" ?> />Treno</label><br />
<label><input type="radio" name="mezzo" value="bus" <?php echo ($mezzo == 'bus' "checked='checked'" "" ?> />Autobus</label><br />
<label><input type="radio" name="mezzo" value="auto" <?php echo ($mezzo == 'auto' "checked='checked'" "" ?> />Auto</label><br />
<label><input type="radio" name="mezzo" value="barca" <?php echo ($mezzo == 'barca' "checked='checked'" "" ?> />Barca</label>
</td>
</tr>
<tr>
<td>Comunicazioni (*)</td>
<td><textarea name="messaggio" rows="5" cols="35"><?php echo $messaggio?></textarea></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>
<input type="reset" value="resettare" />&nbsp;
<input type="submit" value="Invia" />
</td>
</tr>
</table> 
</form>
</body>
</html>    

 

Apri form

Prosegue nelle pagine indicate qui di seguito
Form Processo al Form Pagina finale

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum