2013-09-06 9 views
2

У меня есть раскрывающееся меню в моей форме, и структура формы зависит от ее стоимости. Мне удалось решить «form-update-issue» с классом подписчика/слушателя событий, где я пытаюсь обновить основную форму в соответствии со значением раскрывающегося списка.Встраиваемые формы Symfony2 + обновление динамической формы

Основная проблема заключается в том, что мне нужно изменить форму из значений, которые сохраняются в базе данных. Моя DB схема:

У меня есть 4 таблицы: Модель, ModelCategory, ModelCategoryKey, ModelParameter.

  • ModelCategory 1 - п Модель 1 - м ModelParameter
  • ModelCategory 1 - п ModelCategoryKey
  • ModelCategoryKey 1 - п ModelParameter

После того как пользователь выбрать ModelCategory из формы-х (форма, основанная на объекте Model). Я должен обновить форму с помощью строк ModelParamater, но это число и значения по умолчанию зависят от ModelCategory 1 - n ModelCategoryKey assocaiton.

Я попытался привязать новые объекты ModelParameter к основному объекту модели во время события PRE_BIND (также задал свои значения по умолчанию), и кажется, что он работает нормально, но когда я добавляю «параметры» с помощью типизированного элемента коллекции в форме я получаю следующую ошибку:

Entities passed to the choice field must be managed. Maybe persist them in the entity manager?

Очевидно, мои объекты не могут быть (и не должно быть) сохранялось в это время.

Все идеи приветствуются!

UPDATE: Изменение формы после preSubmit/preBind:

$form->add('parameters','collection',array(
    'type' => new ModelParameterType(),   
)); 

ИЛИ

$form->add(
      $this->factory->createNamed('parameters','collection',null, 
       array(
        'type' => new ModelParameterType() 
        )) 
     ); 

где атрибут 'завод' является FormFactoryInterface. Сообщение об ошибке одно и то же.

UPDATE2:

Дальнейшие исследования доказали, что если я не добавить "по умолчанию" сущности к Assocation. Затем он работает без ошибок.

Вот источник моего метода формы модифицирующего:

public function preSubmit(FormEvent $event) { 
    $form = $event->getForm(); 
    $id = $event->getData()['modelCategory'];  
    $entity = $form->getData(); 
    $categoryKeys = $this->em->getRepository('MyBundle:ModelCategoryKey')->findByModelCategory(
     $this->em->getReference('MyBundle:modelCategory',$id) 
    );  
    foreach ($categoryKeys as $key) { 
     $param = new ModelParameter(); 
     $param->setModel($entity); 
     $param->setKey($key); 
     $entity->addParameter($param); 
    } 

    $form->add(
     $this->factory->createNamed('parameters','collection',null, 
      array(
       'type' => new ModelParameterType(), 
       'allow_add' => true, 
       'cascade_validation' => true 
       )) 
    ); 

} 

КАЖЕТСЯ, решаемые Я только закомментировал $ парамет-> setModel ($ объект); и он работает нормально. Я буду работать над этим больше и поделится опытом, если он действительно работает.

ответ

0

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

  • Достаточно добавить вновь созданный объект с помощью функции сумматора обратной стороны. Мне не нужно называть сеттера владельца.
  • Функция обратного бокового сумматора должна быть изменена, чтобы она вызывала сеттер владельца.
  • Функция обратного бокового сумматора должна проверить, нет ли объекта в коллекции уже.
  • Событие PRE_SET_DATA происходит, когда форма создана. (так что в новых объектах он пуст, а в старых он заполнен)
0

choice Поле принимает только управляемые объекты, так как значение присваивается сущности после отправки и формирует только идентификаторы объектов, поэтому их необходимо сохранить заранее.

Вам не нужно поле выбора - вам нужна коллекция подформ.

$formBuilder 
    ->add('category', 'category_select') 
    ->add('parameters', 'collection', array('type' => 'parameter')) 
; 

Я здесь в предположении, что category_select является выбор поля с категориями и parameter является подчиненной с его собственными значениями, в зависимости от структуры параметров.

Когда у вас есть категория в контроллере, вы можете связать вновь созданный объект с добавленными объектами параметров с их набором key, в зависимости от ModelCategoryKey.

+0

Я пытаюсь показать вновь созданные объекты с коллекцией, а не с выбором типизированного поля. Я понятия не имею, почему сообщение об ошибке говорит, что это поле выбора :) – nothingam

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