Usare HTML_QuickForm con Smarty

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}
{$obj_form.hidden}

{include file="common/footer.tpl"}

{$obj_form.header.titolo}
{$obj_form.requirednote}
{$obj_form.txtAddress.label} {$obj_form.txtAddress.html}
{$obj_form.ddlCountry.label} {$obj_form.ddlCountry.html}
{if $obj_form.txtEmailAddress.required} (*) {/if} {$obj_form.txtEmailAddress.label} {$obj_form.txtEmailAddress.html}
{$obj_form.errors.txtEmailAddress}
{if $obj_form.btn.required} (*) {/if} {$obj_form.txtEmailAddress.label} {$obj_form.btn.html}

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *