Se si vuole integrare la creazione di form con l’uso di smarty si può optare per due soluzioni:
la prima consiste nell’assegnare ad una variabile dell’oggetto Smarty l’intero HTML generato dall’oggetto HTML_QuickForm;
la seconda consiste nell’impiegare il renderer HTML_QuickForm_Renderer_ArraySmarty basato su HTML_QuickForm::toArray().
1) Il metodo più semplice e immediato
E’ sufficente assegnare ad una variabile di Smarty il valore restituito dal metodo toArray dell’oggetto HTML_QuickForm.
Questo fornisce il codice HTML relativo al form costruito che può essere scritto così com’è nella pagina.
A fronte dell’estrema semplicità si contrappone il totale controllo dell’aspetto da parte del codice.
In questo modo per cambiare aspetto al form bisogna intervenire sul codice e non è sufficente apportare modifiche al template.
Codice di esempio:
// creo l'oggetto QuickForm e Smarty
$obj_form = new HTML_QuickForm('frmReg');
$smarty = new Smarty();
// aggiunge gli elementi
$obj_form->addElement('textarea', 'txtAddress', 'Address:',
array('rows' => 3, 'cols' => 30));
$obj_form->addElement('text', 'txtEmailAddress', 'Email Address:',
array( 'size' => 40, 'maxlength' => 255));
$obj_form->addElement('submit', 'btnSubmit', 'Register');
// processo gli eventuali dati ricevuti dal form
if($obj_form->validate()) {
.....
}
// assegno alla variabile il codice HTML da mostrare nella pagina
$smarty->assign('mio_form',$obj_form->toHtml());
// visualizza il template
$smarty->display('mio_template.tpl');
/*
* Nel template ? sufficente inserire il seguente
* comando per avere il form creato
*/
....cut....
{$mio_form}
....cut....
2) Pieno controllo a Smarty
Con questo metodo, si pu? demandare praticamente tutto il controllo dell’aspetto del form al template engine, prevedendo la posizione per ogni singolo elemento del form, compresi i messaggi di errore e gli asterischi per i campi obbligatori.
//PEAR::HTML_QuickForm
require_once 'HTML/QuickForm.php';
require_once 'HTML/QuickForm/Renderer/ArraySmarty.php';
/* .... codice per l'inserimento degli elementi nel form .... */
// associo il renderer all'oggetto Smarty
$renderer =& new HTML_QuickForm_Renderer_ArraySmarty($smarty);
// processo i dati inviati da form
if($form->validate()) {
$form->freeze();
}
// accetta le eventuali modifiche al renderer
$form->accept($renderer);
//assegna l'array generato a una variabile
$smarty->assign('obj_form', $renderer->toArray());
// mostra il template
$smarty->display('test.tpl');
Il codice da inserire nel template invocato nello script ? il seguente:
{$obj_form.javascript}
In sostanza, il metodo toArray permette di ottenere un array con una particolare struttura che poi viene assegnato ad una variabile di Smarty.
Nel manuale questa struttura è ben documentata.
Certo è che con questo sistema aumenta molto la complessità del template Smarty (si pensi se non si conoscono a priori gli elementi presenti nel form), ma di sicuro si può operare un completo controllo sull’aspetto del form intervenendo solo sul template.
3) Un’ulteriore soluzione
Mi è venuto in mente che una soluzione ulteriore è quella di creare un file di configurazione che può essere letto per impostare in modo appropriato il sistema template del renderer di HTML_QuickForm per poi utilizzare la soluzione 1.