2016-10-09 5 views
1

Ich habe drei Dokumente in meinem Projekt: Event, OrganizerProfile und User.Symfony3: validierte verschachtelte (optionale) Formulare

Benutzer können mehrere OrganizerProfile (es ist wie "Seiten" auf Facebook) und Ereignisse haben.

Wenn ein Benutzer ein Ereignis erstellt, kann er dem Ereignis ein "OrganizerProfile" zuweisen (Benutzer Alberto erstellt ein Ereignis für "Firma A", das "Ereignis X" genannt wird).

Um dies zu erreichen, habe ich diese Formen erstellt:

OrganizerProfileType.php

class OrganizerProfileType extends AbstractType{ 
    public function buildForm(FormBuilderInterface $builder, array $options){ 
     $builder 
      ->add('email', EmailType::class) 
      ->add('name', TextType::class) 
      ->add('description', TextType::class, ['required' => false]) 
... 

EventType.php

class EventType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $profileChoices = ... //List of existing profiles 

     $builder 
      ->add('profile_list', ChoiceType::class, [ 
       'choices' => $profileChoices, 
       'required' => false, 
       'mapped' => false, 
      ]) 
      ->add('profile', OrganizerProfileType::class, [ 
       'required' => true, 
      ]) 
      ->add('title', TextType::class, ['required' => false]) 
      ->add('description', TextType::class, ['required' => false]) 
... 

Im Feld "profile_list" Benutzer kann ihre vorhandenen OrganizerProfiles finden. Benutzer können einen davon auswählen und ihn dem Ereignis zuweisen. ABER wenn der Benutzer kein vorhandenes Profil auswählt, muss er Informationen in das Formular "Profil" einfügen.

Ich möchte "optional" das Profilformular machen und machen es nur erforderlich, wenn die Benutzer nicht ein vorhandenes Profil auswählen.

Wie kann ich das tun? Danke

+1

Sie können [Validierungsgruppen basierend auf den übermittelten Daten auswählen] (http://symfony.com/doc/current/form/data_based_validation.html) – Matteo

Antwort

0

Sie können durch Validation Groups Based on the Submitted Data implementieren.

So sollte Ihre Formtype wie folgt sein:

class EventType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $profileChoices = [...]; 

     $builder 
      ->add('profile_list', ChoiceType::class, [ 
       'choices' => $profileChoices, 
       'required' => false, 
       'mapped' => false, 
      ]) 
      ->add('profile', OrganizerProfileType::class, [ 
       'constraints' => [ 
        new Valid() 
       ] 
      ]) 
      ->add('title', TextType::class, ['required' => false]) 
      ->add('description', TextType::class, ['required' => false]); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'validation_groups' => function (FormInterface $form) { 

       if (null === $form->get('profile_list')->getData()) { 
        return ['without_profile']; 
       } 

       return ['with_profile']; // Or simply 'Default' 
      }, 
     ]); 
    } 

} 

UPDATE: die Validierung Gruppe in der anderen Formtype Verwenden Sie auch

Dann müssen Sie die Validierung des Unterformulars mit der Validierungsgruppe zu handhaben als Beispiel:

class OrganizerProfileType extends AbstractType{ 

    public function buildForm(FormBuilderInterface $builder, array $options){ 
     $builder 
      ->add('email', EmailType::class, [ 
        'constraints' => [ 
         new NotNull(
          [ 
           'groups' => ['without_profile', 'with_profile'] 
          ] 
         ) 
      ]]) 
      ->add('name', TextType::class, [ 
        'constraints' => [ 
         new NotNull(
          [ 
           'groups' => ['without_profile', 'with_profile'] 
          ] 
         ) 
      ]]) 
      ->add('description', TextType::class, ['required' => false]) 

Hoffnung diese Hilfe

+0

danke, ich werde Ihre Lösung morgen versuchen! Wenn es klappt, biete ich Ihnen beim SymfonyDay ein Bier an (wenn Sie dort sein werden;)) –

+0

Wenn ich Validierungsgruppen in das Dokument "Event" lege, wenn ich die Methode "$ form-> isValid()" erreiche Es stoppt ordnungsgemäß, aber er überspringt die Validierung von OrganizerProfile-Formularen völlig und ignoriert die Validierungsgruppe. Ich habe auch versucht mit 'cascade_validation', aber es funktioniert immer noch nicht. Es funktioniert nur mit einer "manuellen Validierung" (mit dem Validierungsdienst und Validieren des OrganizerProfile Formulars mit der richtigen Gruppe). Gibt es eine Möglichkeit, alle Formulare (und Unterformen) mit der Standardmethode "$ form-> isValid()" zu validieren? –

+0

hi @AlbertoFecchi, sollten Sie die Validierungsgruppe auch in dem anderen FormType verwenden. Überprüfen Sie mein Update. Hoffentlich sehen wir euch auch am nächsten Tag :) – Matteo

Verwandte Themen