Controlli dinamici di validazione form con Symfony

Molto probabilmente, durante l’implementazione e l’utilizzo di classi form con , vi sarà capitato di dover eseguire alcuni controlli di validazione solamente in presenza di certe condizioni. Ad esempio controllare la presenza obbligatoria di un provincia solo se la nazione impostata precedentemente è Italia.

Questo potrebbe essere un problema visto che normalmente i controlli di validazione vengono implementati nelle estensioni delle classi form. Tuttavia è possibile aggiungere i controlli nella action richiamata dal submit del form considerato.

Facciamo un esempio:

Supponiamo di avere una classe form per la gestione degli utenti che implementa il campo nazione e il campo provincia:

'nazione' => new sfWidgetFormPropelSelect(array('model' => 'Countries',
   'key_method' => 'getIdCountry',
   'method' => 'getDescrizione',
   'add_empty' => true,
   'order_by' => array('Descrizione', 'ASC'))),

'provincia' => new sfWidgetFormPropelSelect(array('model' => 'Province',
   'method' => 'getProvincia',
   'add_empty' => true,
   'order_by' => array('Provincia', 'ASC'))),

'nazione' => new sfValidatorString(array('required' => true), array('required' =>
   __('Nazione obbligatoria', null, 'messagesutenti'))),

'provincia' => new sfValidatorString(array('required' => false), array()),

Come potete notare il campo “provincia” è settato come non obbligatorio, questo perchè in alcune situazioni, effettivamente, non deve essere impostato, come nel caso di nazione diversa da Italia.
Il controllo verrà aggiunto dinamicamente in un secondo momento.

Supponiamo di avere una action denominata “SalvaUtente” definita nel modulo “utenti” che viene richiamata dalla submit del form che renderizza i due campi descritti precedentemente. La action potrebbe essere implementata come segue:

private function SalvaUtente(sfWebRequest $request, sfForm $form) {
   $form->bind($request->getParameter($form->getName()));
   $datiForm = $request->getParameter($form->getName());

   if ($datiForm['nazione'] != '' && $datiForm['nazione'] == def::NAZIONE_ITALIA_CODE)
      $form->setValidator('provincia', new sfValidatorString(array('required' => true),
                array('required' => 'Provincia obbligatoria')));

   if ($form->isValid()) {
      //continua ...

Nel momento in cui il campo nazione  è valorizzato ed impostato su Italia, viene aggiunto il controllo di obbligatorietà sul campo provincia. Grazie a questa soluzione risulta facile impostare a piacimento qualsiasi tipo di controllo di validazione il framework metta a disposizione.

Alla prossima

No comments yet. You should be kind and add one!

Leave a Comment

*

Allowed tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>