2017-02-14 3 views
0

После нескольких поисков и попыток я не знаю, как решить мою проблему.Symfony2 набор вариантов выбора для каждого элемента

Я нашел это: Symfony2 Form Collection Field with Different Choices, но решение не было предоставлено только поисковым тропам, и я не нашел, как адаптировать решение в моем случае.

У меня есть много разных отношений между локализацией и регионом, между многими отношениями между ЛОКАЛИЗАЦИЕЙ и Департаментом и многими-многими отношениями между Локализацией и Сити.

Чтобы создать локализацию я иметь такую ​​форму:

class LocalizationType extends AbstractType{ 


private $manager; 

public function __construct(ObjectManager $manager) 
{ 
    $this->manager = $manager; 
} 

public function buildForm(FormBuilderInterface $builder, array $options){ 


    $builder->add('regions', CollectionType::class, array('entry_type' => ChoiceType::class, 
                  'allow_add' => true, 
                  'allow_delete' => true, 
                  'required' => false, 
                  'entry_options' => array(
                   'choices' => (array_key_exists('regions', $options['localization_value']) ? $options['localization_value']['regions'] : array('' => '')), 
                   'multiple' => false, 
                   'expanded' => false, 
                   'attr' => array('class' => 'region input'), 

                   ), 
                  'data' => (array_key_exists('regions', $options['localization_data']) ? $options['localization_data']['regions'] : null), 
                  )) 
      ->add('departments', CollectionType::class, array('entry_type' => ChoiceType::class, 
                   'allow_add' => true, 
                   'allow_delete' => true, 
                   'required' => false, 
                   'entry_options' => array(
                   'choices' => (array_key_exists('departments', $options['localization_value']) ? $options['localization_value']['departments'] : array('' => '')), 
                    'multiple' => false, 
                    'expanded' => false, 
                    'attr' => array('class' => 'department input') 
                    ), 
                   'data' => (array_key_exists('departments', $options['localization_data']) ? $options['localization_data']['departments'] : null), 
                   )) 
      ->add('cities', CollectionType::class, array('entry_type' => ChoiceType::class, 
                  'allow_add' => true, 
                  'allow_delete' => true, 
                  'required' => false, 
                  'entry_options' => array(
                   'choices' => (array_key_exists('cities', $options['localization_value']) ? $options['localization_value']['regions'] : array('' => '')), 
                   'multiple' => false, 
                   'expanded' => false, 
                   'attr' => array('class' => 'city input') 
                   ), 
                  'data' => (array_key_exists('cities', $options['localization_data']) ? $options['localization_data']['cities'] : null), 
                  )) 
    ; 

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event){ 

     $data = $event->getData(); 

     if(!empty($data['regions']) && is_array($data['regions'])){ 

      $regions = array(); 

      foreach($data['regions'] as $region){ 

       $regions[] = $region; 

      } 

      $data['regions'] = $this->manager->getRepository('LocalizationBundle:Region')->findRegionsForCreateEntity($regions); 

     } 

     if(!empty($data['departments']) && is_array($data['departments'])){ 

      $departments = array(); 

      foreach($data['departments'] as $department){ 

       $departments[] = $department; 

      } 

      $data['departments'] = $this->manager->getRepository('LocalizationBundle:Departments')->findDepartmentsForCreateEntity($departments); 

     } 

     if(!empty($data['cities']) && is_array($data['cities'])){ 

      $cities = array(); 

      foreach($data['cities'] as $city){ 

       $cities[] = $city; 

      } 

      $data['cities'] = $this->manager->getRepository('LocalizationBundle:City')->findCitiesForCreateEntity($cities); 

     } 

     $form = $event->getForm(); 

     $form->add('regions', CollectionType::class, array('entry_type' => ChoiceType::class, 
                  'allow_add' => true, 
                  'allow_delete' => true, 
                  'required' => false, 
                  'entry_options' => array(
                   'choices' => $data['regions'], 
                   'multiple' => false, 
                   'expanded' => false, 
                   'attr' => array('class' => 'region input') 
                   ) 
                  )); 


       $form->add('departments', CollectionType::class, array('entry_type' => ChoiceType::class, 
                    'allow_add' => true, 
                    'allow_delete' => true, 
                    'required' => false, 
                    'entry_options' => array(
                     'choices' => $data['departments'], 
                     'multiple' => false, 
                     'expanded' => false, 
                     'attr' => array('class' => 'department input') 
                     ) 
                    )) 
       ->add('cities', CollectionType::class, array('entry_type' => ChoiceType::class, 
                   'allow_add' => true, 
                   'allow_delete' => true, 
                   'required' => false, 
                   'entry_options' => array(
                    'choices' => $data['cities'], 
                    'multiple' => false, 
                    'expanded' => false, 
                    'attr' => array('class' => 'city input') 
                    ) 
                   )) 
    ; 


    }); 

} 

public function configureOptions(OptionsResolver $resolver){ 

    $resolver->setDefaults(array(
     'data_class' => Localization::class, 
     'localization_data' => array('regions' => '', 'departments' => '', 'cities' => ''), 
     'localization_value' => array('regions' => '', 'departments' => '', 'cities' => ''), 
    )); 

} 

Я выбираю ChoiceType пустой, потому что у меня есть несколько Город, например (более 25k), поэтому я предпочитаю нагрузки некоторые из них с помощью AJAX на мой взгляд, и сделать их в select2, он работает для добавления действия, но для действия редактирования У меня проблема, я хочу, чтобы каждое поле моих коллекций имело другое значение.

Для того, чтобы проиллюстрировать свою историю, я хочу этот результат:

<label>Region n°1</label> 
<select id="" name=""> 
    <option value="foo1">bar1</option> 
</select> 

<label>Region n°2</label> 
<select id="" name=""> 
    <option value="foo2">bar2</option> 
</select> 

И результат у меня есть на данный момент:

<label>0</label> 
<select id="" name=""> 
    <option value="foo1" selected="selected">bar1</option> 
    <option value="foo2">bar2</option> 
</select> 

<label>1</label> 
<select id="" name=""> 
    <option value="foo1">bar1</option> 
    <option value="foo2" selected="selected">bar2</option> 
</select> 

Чтобы изменить метку, если я понимаю, что нужно создать свой собственный template, ok, но для отображения только выбранной опции, а не для других, мне кажется, что мне нужен FormEventListener в PRE_SET_DATA, но я не вижу, как это реализовать. Поэтому, если у кого-то есть решение, я возьму его.

ответ

0

Я отвечаю на свой вопрос, после попытки с помощью FormEventListener на PRE_SET_DATA, на POST_SET_DATA или с помощью choice_loader, похоже, невозможно сделать то, что я хочу, с помощью метода Symfony, но я не очень понимаю, почему. Я чувствую себя снова Jquery образом, чтобы удалить вариант, не выбранный со следующим кодом, я не нравится, но я не вижу другие решения:

<script type="text/javascript"> 

    $.each($('.region'), function(i, val){ 

     $(val).find('option:not(:selected)').remove(); 

    }) 

    $.each($('.department'), function(i, val){ 

     $(val).find('option:not(:selected)').remove(); 

    }) 

    $.each($('.city'), function(i, val){ 

     $(val).find('option:not(:selected)').remove(); 

    }) 
</script> 

Я не миновать эту тему, как решается в случае, если я ошибаюсь

 Смежные вопросы

  • Нет связанных вопросов^_^