Development

Documentation/it_IT/book/forms/02-Form-Validation (diff)

You must first sign up to be able to contribute.

Changes from Version 1 of Documentation/it_IT/book/forms/02-Form-Validation

Show
Ignore:
Author:
garak (IP: 85.18.214.242)
Timestamp:
10/29/08 12:52:55 (9 years ago)
Comment:

non finita...

Legend:

Unmodified
Added
Removed
Modified
  • Documentation/it_IT/book/forms/02-Form-Validation

    v0 v1  
     1{{{ 
     2#!WikiMarkdown  
     3 
     4Validazione di form 
     5=================== 
     6 
     7Nel Capitolo 1 abbiamo imparato come creare e visualizzare una semplice form di contatto. In questo capitolo imparerai a gestire la validazione delle form. 
     8 
     9Prima di iniziare 
     10----------------- 
     11 
     12La form di contatto creata nel Capitolo 1 non è ancora pienamente funzionale. Che succede se un utente inserisce un indirizzo email non valido o un messaggio vuoto? In questi casi, ci piacerebbe mostrare dei messaggi di errore per chiedere all'utente di correggere i dati, come mostrato in figura 2-1. 
     13 
     14Figura 2-1 - Mostrare i messaggi di errore 
     15 
     16![Mostrare i messaggi di errore](http://www.symfony-project.org/images/forms_book/en/02_01.png "Mostrare i messaggi di errore") 
     17 
     18Ecco le regole di validazione da implementare per la form di contatto: 
     19 
     20  * `name` : opzionale 
     21  * `email` : obbligatoria, il valore deve essere un indirizzo email valido 
     22  * `subject`: obbligatorio, il valore scelto deve essere compreso in una lista di valori 
     23  * `message`: obbligatorio, la lunghezza del messaggio deve essere almeno di quattro caratteri 
     24 
     25>**NOTE** 
     26>Perché abbiamo bisogno di validare il campo `subject`? Il tag `<select>` costringe già l'utente ad un elenco di valori predefiniti. Un utente medio può solo scegliere una delle opzioni mostrate, ma altri valori possono essere inviati usando degli strumenti come l'estensione Web Developer di Firefox, oppure simulando una richiesta con strumenti come `curl` o `wget`. 
     27 
     28Il Listato 2-1 mostra il template che abbiamo usato nel Capitolo 1. 
     29 
     30Listato 2-1 - Il template della form di contatto 
     31 
     32    // apps/frontend/modules/contact/templates/indexSucces.php 
     33    <form action="<?php echo url_for('contact/index') ?>" method="post"> 
     34      <table> 
     35        <?php echo $form ?> 
     36        <tr> 
     37          <td colspan="2"> 
     38            <input type="submit" /> 
     39          </td> 
     40        </tr> 
     41      </table> 
     42    </form> 
     43 
     44La Figura 2-2 evidenzia l'interazione tra applicazione e utente. Il primo passo è presentare la form all'utente. Quando l'utente invia la form, o i dati sono validi e l'utente viene rimandato alla pagina di ringraziamento, oppure i dati hanno dei valori non validi e la form viene mostrata di nuovo con i messaggi di errore. 
     45 
     46Figura 2-2 - Interazione tra applicazione e utente 
     47 
     48![Interazione tra applicazione e utente](http://www.symfony-project.org/images/forms_book/en/02_02.png "Interazione tra applicazione e utente") 
     49 
     50Validatori 
     51---------- 
     52 
     53Una form in symfony è fatta di campi. Ciascun campo può essere identificato da un nome univoco, come osservato nel Capitolo 1. Abbiamo connesso un widget ad ogni campo per poterlo mostrare all'utente, ora vediamo come possiamo applicare le regole di validazione a ciascun campo. 
     54 
     55### La classe sfValidatorBase 
     56 
     57La validazione di ogni campo viene fatta da oggetti che ereditano dalla classe `sfValidatorBase`. Per poter validare la form di contatto, dobbiamo definire gli oggetti validatori per ognuno dei quattro campi: `name`, `email`, `subject`, e `message`. Il Listato 2-2 mostra l'implementazione di tali validatori nella classe form usando il metodo `setValidators()`. 
     58 
     59Listato 2-2 - Aggiungere validatori alla classe `ContactForm` 
     60 
     61    [php] 
     62    // lib/form/ContactForm.class.php 
     63    class ContactForm extends sfForm 
     64    { 
     65      protected static $subjects = array('Subject A', 'Subject B', 'Subject C'); 
     66      
     67      public function configure() 
     68      { 
     69        $this->setWidgets(array( 
     70          'name'    => new sfWidgetFormInput(), 
     71          'email'   => new sfWidgetFormInput(), 
     72          'subject' => new sfWidgetFormSelect(array('choices' => self::$subjects)), 
     73          'message' => new sfWidgetFormTextarea(), 
     74        )); 
     75        $this->widgetSchema->setNameFormat('contact[%s]'); 
     76      
     77        $this->setValidators(array( 
     78          'name'    => new sfValidatorString(array('required' => false)), 
     79          'email'   => new sfValidatorEmail(), 
     80          'subject' => new sfValidatorChoice(array('choices' => array_keys(self::$subjects))), 
     81          'message' => new sfValidatorString(array('min_length' => 4)), 
     82        )); 
     83      } 
     84    } 
     85 
     86 
     87 
     88 
     89 
     90 
     91 
     92 
     93 
     94 
     95  
     96Usiamo tre diversi validatori: 
     97 
     98  * sfValidatorString: valida una stringa 
     99  * sfValidatorEmail : valida un'email 
     100  * sfValidatorChoice: valida un valore che proviene da una lista predefinita 
     101 
     102Ogni validatore accetta una lista di opzioni come primo argomento. Come i widget, alcune di queste opzioni sono obbligatorie, altre sono opzionali. Per esempio, il validatore `sfValidatorChoice` accetta un parametro obbligatorio, `choices`. Ogni validatore può anche accettare le opzioni `required` e `trim`, definite di default nella classe `sfValidatorBase`: 
     103 
     104<table> 
     105  <tr> 
     106    <th>Opzione</th> 
     107    <th>Valore predefinito</th> 
     108    <th>Descrizione</th> 
     109  </tr> 
     110  <tr> 
     111    <td>required</td> 
     112    <td><code>true</code></td> 
     113    <td>Specifica se il campo è obbligatorio</td> 
     114  </tr> 
     115  <tr> 
     116    <td>trim</td> 
     117    <td><code>false</code></td> 
     118    <td>Rimuove automaticamente gli spazi bianchi dall'inizio e dalla fine di una stringa prima che avvenga la validazione</td> 
     119  </tr> 
     120</table>         
     121 
     122Vediamo le opzioni disponibili per i validatori che abbiamo appena usato: 
     123 
     124<table> 
     125  <tr> 
     126    <th>Validatore</th> 
     127    <th>Opzioni obbligatorie</th> 
     128    <th>Opzioni non obbligatorie</th> 
     129  </tr> 
     130  <tr> 
     131    <td>sfValidatorString</td> 
     132    <td></td> 
     133    <td><code>max_length</code></td> 
     134  </tr> 
     135  <tr> 
     136    <td></td> 
     137    <td></td> 
     138    <td><code>min_length</code></td> 
     139  </tr> 
     140  <tr> 
     141    <td>sfValidatorEmail</td> 
     142    <td></td> 
     143    <td>schema</td> 
     144  </tr> 
     145  <tr> 
     146    <td>sfValidatorChoice</td> 
     147    <td><code>choices</code></td> 
     148    <td></td> 
     149  </tr> 
     150</table>        
     151 
     152Se provi ad inviare la form con valori non validi, non vedrai alcun cambiamento nel comportamento. Dobbiamo aggiornare il modulo `contact` per validare i valori inviati, come mostrato nel Listato 2-3. 
     153 
     154Listato 2-3 - Implementare la validazione nel modulo `contact` 
     155 
     156    [php] 
     157    class contactActions extends sfActions 
     158    { 
     159      public function executeIndex($request) 
     160      { 
     161        $this->form = new ContactForm(); 
     162      
     163        if ($request->isMethod('post')) 
     164        { 
     165          $this->form->bind($request->getParameter('contact')); 
     166          if ($this->form->isValid()) 
     167          { 
     168            $this->redirect('contact/thankyou?'.http_build_query($this->form->getValues())); 
     169          } 
     170        } 
     171      } 
     172      
     173      public function executeThankyou() 
     174      { 
     175      } 
     176    } 
     177 
     178Il Listato 2-3 introduce molti nuovi concetti: 
     179 
     180  * In caso di richiesta GET iniziale, la form è inizializzata e passata al template da mostrare all'utente. La form quindi è in uno <b>stato iniziale</b>: 
     181 
     182         $this->form = new ContactForm(); 
     183  * Quando l'utente invia la form con una richiesta `POST`, il metodo `bind()` lega la form ai dati utente ed attiva il meccanismo di validazione. La form quindi cambia in uno <b>stato vincolato</b>. 
     184 
     185        if ($request->isMethod('post')) 
     186        { 
     187           $this->form->bind($request->getParameter('contact')); 
     188        
     189  * Una volta che la form è vincolata, è possibile verificare la sua validità usando il metodo  `isValid()`: 
     190 
     191    * Se il valore restituito è `true`, la form è valida e l'utente può essere rimandato alla pagina di ringraziamento: 
     192     
     193          if ($this->form->isValid()) 
     194          { 
     195           $this->redirect('contact/thankyou?'.http_build_query($this->form->getValues())); 
     196          } 
     197      
     198    * Altrimenti, il template `indexSuccess` viene mostrato come all'inizio. Il processo di validazione aggiunge dei messaggi di errore nella form, da mostrare all'utente. 
     199 
     200>**NOTE** 
     201>Quando una form è in uno stato iniziale, il metodo `isValid()` restituisce sempre `false` ed il metodo `getValues()` restituirà sempre un'array vuota. 
     202 
     203La Figura 2-3 mostra il codice che viene eseguito durante l'interazione tra applicazione e utente. 
     204 
     205Figura 2-3 - Codice eseguito durante l'interazione tra applicazione e utente 
     206 
     207![Codice eseguito durante l'interazione tra applicazione e utente](http://www.symfony-project.org/images/forms_book/en/02_03.png "Codice eseguito durante l'interazione tra applicazione e utente") 
     208 
     209### Lo scopo dei validatori 
     210 
     211Forse hai notato che durante la redirezione alla pagina di ringraziamento, non abbiamo usato `$request->getParameter('contact')`, ma `$this->form->getValues()`. Infatti, `$request->getParameter('contact')` restituisce i dati utente quando `$this->form->getValues()` restituisce i dati validati. 
     212 
     213Se la form è valida, perché questi due comandi non sono identici? Ogni validatore in realtà ha due compiti: uno di validazione, ma anche uno di pulizia. Il metodo `getValues()` infatti restituisce i dati validati e puliti. 
     214 
     215Il processo di pulizia ha due azioni principali: normalizzazione e conversione dei dati immessi. 
     216 
     217Abbiamo già visto un caso di normalizzazione dei dati con l'opzione `trim`. Ma l'azione della normalizzazione è molto più importante ad esempio per un campo data. `sfValidatorDate` valida una data. Questo validatore accetta diversi formati in entrata (un timestamp, un formato basato su espressione regolare, ...). Invece di restituire semplicemente il valore immesso, lo converte di default nel formato `Y-m-d H:i:s`. Quindi, lo sviluppatore ha la garanzia di ottenere un formato stabile, quale che sia il formato immesso. Questo sistema offre molta flessibilità all'utente ed assicura coerenza allo sviluppatore. 
     218 
     219Ora, consideriamo un'azione di conversione, come l'invio di un file. La validazione di un file può essere fatta usando `sfValidatorFile`. Una volta che il file è stato caricato, invece di restituire il nome del file, il validatore restituisce un oggetto `sfValidatedFile`, rendendo più facile gestire le informazioni sul file. Vedremo più avanti in questo capitolo come usare questo validatore. 
     220 
     221>**TIP** 
     222>Il metodo `getValues()` restituisce un'array di tutti i dati validati e puliti. Ma se serve recuperare un solo valore, c'è anche il metodo `getValue()`: `$email = $this->form->getValue('email')`. 
     223 
     224}}}