- Sun
- 30
- Nov
- 08
Zend Framework: introduzione al componente Zend_Form
Di in Php, Zend Framework Controls: +-close
Creare form web con Zend Form
Con Zend Framework possiamo tranquillamente inserire dei form nella nostra applicazione web utilizzando del ’semplice’ html e costruirlo secondo le nostre necessità. Esiste però un componente chiamato Zend_Form con il quale possiamo creare i nostri form in maniera più ‘Object Oriented’, ovvero il form sarà una istanza dell’oggetto Zend_Form ed a loro volta, gli elementi che lo compongono saranno istanze degli oggetti :
- Zend_Form_Element_Button
- Zend_Form_Element_Checkbox
- Zend_Form_Element_File
- Zend_Form_Element_Select
- …
e così via, ovvero il suffisso Zend_Form_Element_ seguito dal nome dell’elemento, che sta ad indicare che ogni elemento è una classe salvata in Zend/Form/Element/.
Oltre agli elementi del form sono disponibili i decorators. In poche parole i decorator definiscono i tag html in cui l’elemento del form è contenuto. Applicati all’istanza del form stesso definiscono di quali elementi html questo dev’essere composto, come ad esempio i tag fieldset, formElement e lo stesso form. A breve faremo qualche esempio per capire meglio.
Inoltre esiste la possibilità di aggiungere dei filtri per la validazione del form e dei metodi per l’internazionalizzazione.
L’argomento è estremamente vasto. In questo articolo mostrerò il metodo che preferisco per realizzare un form usando Zend_Form, ovvero creando una classe che estende questo componente ( un’altro metodo, per esempio, è specificare i vari parametri nel file config.ini ). Il consiglio è quindi di provare il codice che mostrerò nelle prossime righe per poi dare uno sguardo quanto prima alla documentazione ufficiale di Zend Form.
Creare un semplice form
Creare l’oggetto form è semplice, basta istanziare Zend_Form:
$form = new Zend_Form;
una volta istanziato il form dovremo specificare la action ed il method. Come avviene per un normale form questa parte non è sempre necessaria, ma è consigliato sempre specificare questi parametri:>/p>
$form->setAction('/resource/process')
->setMethod('post');
Possiamo anche aggiungere degli attrubuti al nostro form utilizzando il metodo setAttrib:
$form->setAttrib('id', 'login');
Aggiungiamo gli elementi
I seguenti sono gli elementi che potremo utilizzare all’interno del form:
- button
- checkbox ( o diversi checkbox alla volta usando multiCheckbox )
- hidden
- image
- password
- radio
- reset
- select ( regolare e multi-select )
- submit
- text
- textarea
Ci sono 2 metodi per aggiungere un elemento al form, istanziare l’elemento e quindi aggiungerlo o aggiungere l’elemento specificando il tipo in modo testuale:
// 1
$form->addElement(new Zend_Form_Element_Text('username'));
// 2
$form->addElement('text', 'username');
Il mio consiglio in questo caso è utilizzare il primo metodo. Più avanti vedremo che avremo la necessità di attribuire diversi parametri di vario tipo ad un elemento ed il codice resta più facilmente leggibile e gestibile utilizzandolo. Nella fattispecie il mio consiglio è di usare questo genere di sintassi:
$username = new Zend_Form_Element_Text('username');
$form->addElement($username);
E’ possibile specificare l’ordine di comparsa di un elemento, in mancanza del quale l’elemento sarà visualizzato nell’ordine in cui è stato inserito:
$username->setOrder(10);
Aggiungere validatori e filtri ad un elemento
Di default agli elementi non è attribuito nessun tipo di validatore o filtro, sarà lo sviluppatore a decidere se e quali inserire. Come succede per l’aggiunta di un elemento al form allo stesso modo si può passare un validatore ad un elemento:
$username = new Zend_Form_Element_Text('username');
// 1
$username->addValidator(new Zend_Validate_Alnum());
// 2
$username->addValidator('alnum');
I validatori ritornano un valore booleano, true o false. Esistono diversi tipi di validatori, oltre al ‘alnum’ visto, che verifica se il campo contenga solo lettere e numeri, esistono i validatori Alpha, Barcode, Between, Ccnum, Regex per le espressoni regolari e diversi altri, tutti ovviamente molto utili. Per la lista completa vi rimando alla documentazione ufficiale sui validatori.
E’ possibile settare un elemento come obbligatorio applicandogli il metodo setRequired:
$username->setRequired(true);
setRequired applica il NotEmpty validator all’elemento a cui viene applicato. Nella validator chain questo validator viene applicato in cima in modo da assicurare che l’elemento abbia un contenuto.
L’aggiunta dei filtri segue in pratica lo stesso concetto dei validatori:
$username->addFilter('StringtoLower');
Ecco un esempio completo del nostro campo username a cui vengono applicati diversi validatori e filtri:
// 1
$username->addValidator('alnum')
->addValidator('regex', false, array('/^[a-z]/'))
->setRequired(true)
->addFilter('StringToLower');
// 2
$username->addValidators(array('alnum',
array('regex', false, '/^[a-z]/i')
))
->setRequired(true)
->addFilters(array('StringToLower'));
// 3
$form->addElement('text', 'username', array(
'validators' => array(
'alnum',
array('regex', false, '/^[a-z]/i')
),
'required' => true,
'filters' => array('StringToLower'),
));
In questo caso abbiamo addirittura tre possibilità di scrittura per ottenere lo stesso risultato. Personalmente preferisco la prima nonostante la seconda e soprattutto, la terza, siano più compatte.
Visualizzare un form
Visualizzare un form è molto semplice, abbiamo due metodi, chiamare esplicitamente il metodo render() dell’oggetto form passando l’oggetto view o semplicemente fare echo sull’oggetto:
// 1 echo $form->render($view); // 2 echo $form;
Senza complicarci troppo le cose direi di utilizzare la seconda ed usare il seguente codice nella view
<?php echo $this->form ?>
I decorators
Per renderizzare il contenuto dei form Zend Form usa i decorators. I decorators possono sostituire contenuto, aggiungerne prima o dopo dell’elemento. Di default ogni elemento del form contiene i seguenti decorators:
$username->addDecorators(array(
'ViewHelper',
'Errors',
array('HtmlTag', array('tag' => 'dd')),
array('Label', array('tag' => 'dt')),
));
il risultato su schermo sarà:
[...] <dt></dt> <dd><input type="text" value="" id="q" name="q"/></dd> [...]
con l’aggiunta dei tag UL LI per la gestione degli errori nel caso in cui ve ne fossero:
[...] <dt></dt> <dd><input type="text" value="" id="q" name="q"/></dd> <ul class="errors"><li>Value is /empty, but a non-/empty value is required</li></ul> [...]
Questi possono essere completamente sostituiti con altri per avere ogni elemento personalizzato in base alle nostre esigenze.
Validazione del form
Dopo che il form è stato inviato bisogna controllare se questo è valido in base ai validatori immessi. Ogni elemento viene quindi ciclato e controllato. Per verificare la validità o meno del form usiamo il seguente codice:
if ($form->isValid($_POST)) {
// success!
} else {
// failure!
}
Creare un form estendendo Zend_Form
Nel caso dovessimo usare il nostro form in diversi punti dell’applicazione è necessario creare una classe per la sua definizione, classe che dovrà estendere Zend_Form. Creiamo ad esempio un form di ricerca, comprensivo di un campo di testo, una select ed il tasto di invio. Il nome della classe sarà My_Form_Search, dove ‘My’ lo dovrete sostituire con il nome della vostra libreria ( la directory col nome del vostro progetto che dovreste avere in library, dove sono contenute le librerie di Zend ) ‘Form’ è una subdirectory e Search è il nome della classe che definisce il form di ricerca.
In questo esempio semplicemente metteremo insieme sopra discusso. Il codice qui di seguito non è completo, lascio a voi l’onere di recuperare l’array ‘rows’ che dovrà contenere le accoppiate id/nome da ciclare per la generazione della select.
class My_Form_Search extends Zend_Form
{
public function init()
{
// Recuperare le coppie id/nome per essere ciclate ed inserite come option nella select, per esempio
$rows = [ your code ]
$queryString = new Zend_Form_Element_Text('q');
$queryString->class = 'inputText';
$queryString->setLabel('Cerca ')
->setDecorators(array(
array('ViewHelper',
array('helper' => 'formText')),
array('Label',
array('class' => 'label')),
'Errors',
));
$queryString->addValidator('alnum')
->addValidator('regex', false, array('/^[a-z]+/'))
->addValidator('stringLength', false, array(1, 20))
->setRequired(true)
->addFilter('StringToLower');
$categorySelect = new Zend_Form_Element_Select('c');
$categorySelect->setLabel('Categoria ');
$categorySelect->addMultiOption('0', 'TUTTE');
if(!empty($rows)){
foreach($rows AS $cat){
$categorySelect->addMultiOption($cat->category_url, $cat->category_name);
}
}
$categorySelect->setDecorators(array(
array('ViewHelper'),
array('Label', array('class' => 'label'))
));
$submit = new Zend_Form_Element_Submit('go');
$submit->class = 'inputSubmit';
$submit->setDecorators(array(
array('ViewHelper')
));
$this->addElements(array(
$queryString,
$categorySelect,
$submit
));
$this->setDecorators(array(
'FormElements',
'Fieldset',
'Form'
));
}
}
Si conclude qui questo articolo sperando che vi sia stato di aiuto come introduzione al componente Zend_Form.
Related posts:
- Zend Framework: Zend_Form con ReCaptcha Utilizzare il webservice ReCaptcha per validare i form ReCaptcha è...
- Zend Framework: gestione dei moduli ed esempio modulo di amministrazione Come usare Zend_Layout per la gestione dei moduli In quest'articolo...
- Un bootstrap object oriented per Zend Framework ( applicazione reale Zend Framework p.12 ) Trasformiamo il nostro bootstrap in una classe php Il codice...
Related posts brought to you by Yet Another Related Posts Plugin.












We ciao, complimenti ancora, senti puoi fare un articolo sullo Zend_Controller_Router_Route
Ciao Alessio,
grazie per il commento, sono felice ti sia stato utile questo articolo. Zend_Controller_Router_Route? Lo metto tra la lista di cose da fare! Ciao
[...] Zend Framework: introduzione al componente Zend_Form [...]
Come localizzi i messaggi di errore del form ?
I love you
(che non significa io ti amo… ma io ti voglio bene
)
A parte gli scherzi, i tuoi articoli li trovo davvero utili sopratutto per noi povera gente che non mastichiamo tanto bene l’inglese e che abbiamo serie diffocoltà nel trovare un pò di documentazione in italiano.
COntinua così !!!!
Un saluto da un tuo nuovo ammiratore
Giuseppe
Hey, grazie

In questo articolo comunque non avevo parlato della possibilità di abbinare un view script ad un form, cosa utile quando si deve realizzare un form complesso senza dover utilizzare i decorator, che renderebbero la vita un po difficile secondo il mio punto di vista. Questo è comunque scritto nella documentazione ufficiale, ovviamente in inglese
Ciao e presto