2013-06-14 12 views
5

Ho un modulo contenente una casella di controllo e un "campo valore". Il campo del valore può essere qualsiasi cosa, una casella di testo, un campo composto, una raccolta - qualsiasi cosa.Salta convalida se il campo fratello (casella di controllo) contiene "falso"

Il modulo potrebbe essere la seguente, per esempio:

field_1_label enabled [x] 
       value  [________] 

field_2_label enabled [x] 
       value  sub_field_1 [________] 
          sub_field_2 [________] 

field_3_label enabled [x] 
       value  [________] 

Quando il campo "abilitato" contiene true, tutto funziona bene già. Quando il campo "abilitato" contiene false, desidero disattivare la convalida nel campo del valore e i campi secondari.

Quindi, quando "abilitato" è deselezionato, ignorerò efficacemente il campo. Lo visualizzerò comunque nel modulo, ma non memorizzerò i dati e certamente non lo voglio validato.

Qualcuno ha suggerimenti su come potrei fare questo? Nello specifico, sto riscontrando problemi nel far sì che il sistema di validazione ignori il campo valore e di eventuali potenziali campi secondari.

risposta

9

In Symfony 2.3 è possibile utilizzare falso in validation_groups avere vincoli applicati:

http://symfony.com/doc/current/book/forms.html#groups-based-on-the-submitted-data

Così, per esempio, sul campo che contiene la casella di controllo e valore del campo:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver 
     ->setDefaults([ 
      'validation_groups' => function(FormInterface $form) { 
       // If the form is disabled, don't use any constraints 
       if ($form->get('enabled_checkbox')->getData() == false) { 
        return false; 
       } 

       // Otherwise, use the default validation group 
       return 'Default'; 
      } 
     ]); 
} 
+0

Funziona ancora per 2.4? Sto avendo problemi con esso; restituendo 'false' non sembra disabilitare la convalida per il modulo. – Brian

+0

Ok, sono riuscito a farlo funzionare restituendo invece una matrice vuota, invece di 'false' – Brian

2

Basta rimuovere i campi secondari prima della convalida se la casella di controllo del genitore è impostata su falso.

Ulteriori informazioni nel libro di cucina articolo How to Dynamically Modify Forms Using Form Events.

Iscriviti a form eventsFormEvents::POST_SET_DATA e rimuovi il campo nel tuo abbonato.

La sezione Adding an Event Subscriber to a Fom class copre questo argomento.


È inoltre possibile introdurre diversi validation groups per il modulo.

Basta applicare un altro gruppo di convalida (non contenente i campi di ricerca) se la casella di controllo del genitore è impostata su falso.

+0

La questione con la loro rimozione è che i campi non saranno disponibili quando il modulo sarà nuovamente visualizzato - ci sarà una casella di controllo 'abilitata' ma nessun campo valore se ci sono errori di validazione altrove nel modulo. Lascia la forma in uno stato rotto, a meno che non aggiungo i campi dopo la convalida. Anche se da SUBMIT/POST_SUBMIT in poi non è più possibile rimuovere (o aggiungere) campi poiché la chiamata a -> setParent (null) sul figlio genererà l'eccezione 'Non è possibile rimuovere i bambini da un modulo inviato'. – ledneb

+0

utilizzando POST_SET_DATA anziché POST_BIND non aiuta? Ho aggiunto un'altra possibilità nella risposta - basta usare i gruppi di validazione. per favore ricontrolla. – nifr

+0

La convalida avviene POST_BIND, quindi se dovessi saltare i campi rimuovendo la pre-convalida, dovrei aggiungerli di nuovo su POST_BIND, che non è possibile. Per quanto riguarda i gruppi di validazione, sembra che potrebbe essere utile, ma non vedo come potrei specificare i gruppi da convalidare? Se costruisco vari gruppi di convalida, mi sembra che il sistema dei form sia hardcoded per validare solo il gruppo "Default"?(riga 55 di Symfony \ Component \ Form \ Extension \ Validator \ EventListener \ ValidationListener) – ledneb

Problemi correlati