2016-08-11 2 views
1

Я использую Synfony3. У меня есть 3 объекта, называемые «категория», «сервисы», «профиль», а отношение между ними - это C < 1-n> S < 1-n> P. В другом терминале 1 категория может иметь несколько сервисов, 1 услуга может иметь несколько профили.symfony каскадный выпадающий список

Когда я отображение формы гидратов профиля Я бы иметь 1 выпадающий список со всеми услугами и 1 выпадающего список со всеми категориями

чтобы сделать это, я положил в Profiletype услуги DropDownList следующие

class ProfileType extends AbstractType { 
     //... 
     ->add('service',  EntityType::class, array(
      'class'  => 'xxxBundle:Service', 
      'choice_label' => 'name', 
      'multiple'  => false, 
     )) 

Как добавить категорию, так как нет прямой связи между категорией и Pr OFILE

Заранее спасибо за вашу помощь

+1

Вы ищете что-то в этом роде? https://symfony.com/doc/current/form/dynamic_form_modification.html#dynamic-generation-for-submitted-forms – dbrumann

ответ

0

На основе ответа на овчарку и Dbrumann, я построить несколько примеров с коротким описание here

0

Вы можете адаптировать приведенные примеры, чтобы быть в состоянии иметь дело с юридическими лицами (ставят слушатель в отделенной службе и впрыснуть EntityManger, чтобы загрузить выбор ...):

Как каскад выбрать поля

Это пример, чтобы показать, как изменить разрешенный выбор на поле выбора ПОДКАТЕГОРИИ в зависимости от значения категории поля выбора. Чтобы сделать это, вы должны сделать выбор своей подкатегории динамичным как для клиента, так и для сервера.

  1. сделать вид динамическим на стороне клиента для отображения Примера стороны клиента динамической формы (с помощью 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); 
        }); 
    }); 
    

    Конечно, вы могли бы получить выбор от вызова AJAX. Это не цель этого примера.

  2. сделать форму динамической на стороне сервера для инициализации и проверок примера на стороне сервера динамической формы:

    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); 
        } 
    } 
    
Смежные вопросы