2016-08-11 6 views
1

Ich benutze Synfony3. Ich habe 3 Entitäten genannt "Kategorie", "Dienste", "Profil" und die Beziehung zwischen ist 1 C-< 1-n> S < 1-n> P. Mit anderen Worten, 1 Kategorie kann mehrere Dienste haben, 1 Dienst kann mehrere Profile.symfony kaskadierte Dropdown-Liste

Wenn ich das Formular an, ein Profil Hydrat würde ich 1 Drop-Down mit allen Dienstleistungen und 1 Drop-Down-Liste mit allen Kategorien

zu haben, dies zu tun, ich habe die Dienste Dropdownlist wie folgt

in Profilen setzen

Wie kann ich die Kategorie hinzufügen, da keine direkte Verbindung zwischen Kategorie und Pr besteht? ofile

Vielen Dank im Voraus für Ihre Hilfe

+1

Sind Sie auf der Suche nach so etwas? https://symfony.com/doc/current/form/dynamic_form_modification.html#dynamic-generation-for-submitted-forms – dbrumann

Antwort

0

Auf der Grundlage der Antwort auf Elsässer und Dbrumann, baue ich ein paar Beispiele mit kurzem Erklärung here

0

Sie können anpassen die Beispiele zur Verfügung gestellt, um mit Entitäten zu behandeln (setzen Sie den Hörer in einem separaten Service und die EntityManger injizieren die Auswahl zu laden ...):

Wie wählen Sie Felder

Dies ist ein Beispiel Kaskade zu zeigen, wie die zulässigen Entscheidungen auf einer Unterkategorie auswählen Feld auf dem Wert der Kategorie Auswahlfeldes in Abhängigkeit zu ändern. Um dies zu tun, müssen Sie Ihre Unterkategorie-Auswahl für Client- und Server-Seite dynamisch machen.

  1. Machen Sie das Formular auf der Client-Seite dynamisch zur Anzeige Beispiel für Client-Seite dynamischer Form (mit Javascript/JQuery):

    $('#category').change(function(){ 
        switch($(this).val()){ 
         case '1': // If category == '1' 
          var choice = { 
           'choice1_1':'1_1', 
           'choice1_2':'1_2', 
           'choice1_3':'1_3', 
          }; 
         break; 
         case '2': // If category == '2' 
          var choice = { 
           'choice2_1':'2_1', 
           'choice2_2':'2_2', 
           'choice2_3':'2_3', 
          }; 
         break; 
         case '3': // If category == '3' 
          var choice = { 
           'choice3_1':'3_1', 
           'choice3_2':'3_2', 
           'choice3_3':'3_3', 
          };   
         break; 
        } 
    
        var $subCategorySelect = $('#subCategory'); 
    
        $subCategorySelect.empty(); 
        $.each(choice, function(key, value) { 
         $subCategorySelect.append($('<option></option>')).attr('value',value).text(key); 
        }); 
    }); 
    

    Natürlich können Sie die Auswahl von einem AJAX-Aufruf zu bekommen. Das ist nicht der Zweck dieses Beispiels.

  2. Machen Sie das Formular dynamisch auf der Serverseite zur Initialisierung und Validierung Beispiele für serverseitige dynamische Form:

    namespace AppBundle\Form; 
    
    use Symfony\Component\Form\AbstractType; 
    use Symfony\Component\Form\FormBuilderInterface; 
    
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
    
    use Symfony\Component\Form\FormEvent; 
    use Symfony\Component\Form\FormEvents; 
    
    class MyBaseFormType extends AbstractType 
    { 
        /** 
        * @param FormBuilderInterface $builder 
        * @param array $options 
        */ 
        public function buildForm(FormBuilderInterface $builder, array $options) 
        { 
         $builder 
          ->add('category',ChoiceType::class,array('choices'=>array(
            'choice1'=>'1', 
            'choice2'=>'2', 
            'choice3'=>'3', 
           ))) 
         ; 
    
         $addSubCategoryListener = function(FormEvent $event){ 
          $form = $event->getForm(); 
          $data = $event->getData(); 
    
          switch($data['category']){ 
           case '1': // If category == '1' 
            $choices = array(
             'choice1_1'=>'1_1', 
             'choice1_2'=>'1_2', 
             'choice1_3'=>'1_3', 
            ); 
           break; 
           case '2': // If category == '2' 
            $choices = array(
             'choice2_1'=>'2_1', 
             'choice2_2'=>'2_2', 
             'choice2_3'=>'2_3', 
            );       
           break; 
           case '3': // If category == '3' 
            $choices = array(
             'choice3_1'=>'3_1', 
             'choice3_2'=>'3_2', 
             'choice3_3'=>'3_3', 
            );       
           break; 
          } 
    
          $form->add('subCategory',ChoiceType::class,array('choices'=>$choices)); 
         }; 
    
         // This listener will adapt the form with the data passed to the form during construction : 
         $builder->addEventListener(FormEvents::PRE_SET_DATA, $addSubCategoryListener); 
    
         // This listener will adapt the form with the submitted data : 
         $builder->addEventListener(FormEvents::PRE_SUBMIT, $addSubCategoryListener); 
        } 
    }