2015-12-07 4 views
1

у меня есть объект SearchFieldType с ManyToMany к SearchOperator:Symonfy типа формы: ограничение сущности выбора поля для соответствующих значений

/** 
* @ORM\ManyToMany(targetEntity="SearchOperator", cascade={"persist", "remove"}) 
* @ORM\JoinTable(
*  joinColumns={@ORM\JoinColumn(name="type_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="operator_id", referencedColumnName="id")} 
*  ) 
**/ 
private $operators; 

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

/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $formFactory = $builder->getFormFactory(); 
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formFactory) 
    { 
     $form = $event->getForm(); 
     $data = $event->getData(); 

     if ($data != null) 
     { 
      $form 
       ->add($formFactory->createNamed('name', 'text', array('auto_initialize' => false))) 
       ->add($formFactory->createNamed('operators', 'entity', array('class' => 'AppBundle:SearchOperator', 
                'multiple' => false, 
                'expanded' => false, 
                'choices' => $data->getOperators()))) 
      ; 
     } 
     }); 
} 

Я получаю эту ошибку:

Automatic initialization is only supported on root forms. You should set the "auto_initialize" option to false on the field "name".

I попытался установить эту опцию в значение false в поле и в самой форме (setDefaultOptions) без результата.

Моя текущая версия Symfony является 2.7.6

+0

Я не уверен, что понимаю, что вы пытаетесь сделать. Вы хотите показать все доступные операторы для этого объекта. Какая организация? Затем в поле имени появляется ошибка, в которой говорится, что вы должны удалить автоматическую инициализацию. Для отношения «многие-многие» у вас должен быть тип коллекции, а не тип сущности. – anegrea

+0

Мне нужен выпадающий список, показывающий только существующие варианты (операторы) для каждого поля, а не список со всеми существующими операторами (глобально) –

+0

Возможный дубликат [Symfony: невозможно обработать запрос в форме] (http://stackoverflow.com/вопросы/34136594/Symfony-неспособен к ручке-запрос-в-формы) –

ответ

0

На $operators в SearchFieldType вы сопоставили многие ко многим отношений. Я предполагаю, что форма внизу находится для SearchFieldType.

Поскольку у вас есть отношения ManyToMany, это означает, что ваша форма ожидает иметь много значений во вводе для «операторов». Однако вы задаете тип поля «entity». Они несовместимы. Если, как вы сказали, вам нужен только выпадающий список, вы можете изменить отношение как ManyToOne. (Если вы хотите сохранить ManyToMany, вы должны установить тип формы в 'collection').

Другая ошибка у вас есть:

Automatic initialization is only supported on root forms. You should set the "auto_initialize" option to false on the field "name".

Будет решена путем удаления этой опции из «имя» поля, насколько я могу сказать: array('auto_initialize' => false

Затем, после того, как вы исправить отношения чтобы быть ManyToOne, вы можете передать экземпляр QueryBuilder с некоторыми фильтрами для запроса (я не понял даже формы комментариев, которые вы хотите фильтровать), используя опцию для типа поля «entity» (see here).

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