2013-06-14 8 views
5

Ich habe ein Formular mit einem Kontrollkästchen und einem "Wert Feld". Das Wertfeld kann alles sein, ein Textfeld, ein zusammengesetztes Feld, eine Sammlung - alles.Überspring Validierung, wenn Geschwister (Checkbox) Feld enthält 'falsch'

Die Form könnte wie folgt aussehen, zum Beispiel:

field_1_label enabled [x] 
       value  [________] 

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

field_3_label enabled [x] 
       value  [________] 

Wenn das "enabled" Feld true enthält, funktioniert alles schon in Ordnung. Wenn das Feld "enabled" false enthält, möchte ich die Validierung für das Wertfeld und die untergeordneten Felder deaktivieren.

Also wenn "aktiviert" deaktiviert ist, werde ich das Feld effektiv ignorieren. Ich werde es immer noch in dem Formular anzeigen, aber ich werde die Daten nicht speichern und ich will es sicher nicht validiert.

Hat jemand Vorschläge, wie ich das machen könnte? Insbesondere habe ich Probleme, das Validierungssystem dazu zu bringen, das Wertfeld und mögliche untergeordnete Felder zu ignorieren.

Antwort

9

In Symfony 2.3 können Sie in validation_groups falsch verwenden keine Einschränkungen angewendet haben:

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

auf dem Feld So zum Beispiel das Kontrollkästchen und Wertfeld enthält:

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

Funktioniert das noch für 2.4? Ich habe Probleme damit; Die Rückgabe von 'false' scheint die Validierung für das Formular nicht zu deaktivieren. – Brian

+0

Ok, ich konnte es zum Laufen bringen, indem ich statt "false" ein leeres Array zurückgab – Brian

2

Entfernen Sie einfach die untergeordneten Felder vor der Überprüfung, wenn das Kontrollkästchen des übergeordneten Elements auf false gesetzt ist.

Lesen Sie mehr im Kochbuch Artikel How to Dynamically Modify Forms Using Form Events.

Abonnieren Sie form eventsFormEvents::POST_SET_DATA und entfernen Sie das Feld in Ihrem Abonnenten. Der Bereich Adding an Event Subscriber to a Fom class behandelt dieses Thema.


Sie können auch verschiedene validation groups für Ihr Formular einführen.

Wenden Sie einfach eine weitere Validierungsgruppe an (die die Felder für die Felder nicht enthält), wenn das Kontrollkästchen des übergeordneten Elements auf "false" gesetzt ist.

+0

Die Frage Beim Entfernen werden die Felder nicht verfügbar sein, wenn das Formular erneut angezeigt wird - es wird ein Kontrollkästchen "aktiviert" geben, aber kein Wertfeld, wenn Validierungsfehler an anderer Stelle im Formular vorhanden sind. Es lässt das Formular in einem fehlerhaften Zustand, es sei denn, ich füge die Felder nach der Überprüfung zurück. Ab SUBMIT/POST_SUBMIT ist es nicht mehr möglich, Felder zu entfernen (oder hinzuzufügen), da der Aufruf von -> setParent (null) auf dem Kind die Ausnahme "Kinder aus einem übermittelten Formular nicht entfernen" auslösen kann. – ledneb

+0

mit POST_SET_DATA anstelle von POST_BIND hilft nicht? Ich fügte eine andere Möglichkeit in der Antwort hinzu - benutze einfach Validierungsgruppen. lesen Sie bitte. – nifr

+0

Validierung geschieht POST_BIND. Wenn ich also die Felder durch Entfernen der Vorvalidierung überspringen wollte, müsste ich sie erneut in POST_BIND hinzufügen, was nicht möglich ist. In Bezug auf Validierungsgruppen scheint es nützlich zu sein, aber ich sehe nicht, wie ich die zu validierenden Gruppen spezifizieren könnte. Wenn ich verschiedene Validierungsgruppen erstelle, sieht es für mich so aus, als ob das Formularsystem fest codiert ist, um nur die Gruppe "Standard" zu validieren?(Zeile 55 von Symfony \ Component \ Form \ Extension \ Validator \ EventListener \ ValidationListener) – ledneb