Forms Symfony2嵌入式表单+;动态表单更新

Forms Symfony2嵌入式表单+;动态表单更新,forms,symfony,symfony-2.2,Forms,Symfony,Symfony 2.2,我的表单中有一个下拉菜单,表单结构取决于它的值。我已经设法用事件订阅者/监听器类解决了“表单更新问题”,我正在尝试根据下拉列表的值更新主表单 主要问题是,我必须根据数据库中保留的值修改表单。 我的数据库模式: 我有4个表:模型,模型类别,模型类别,模型参数 模型类别1--n模型1--m模型参数 ModelCategory 1--n ModelCategoryKey ModelCategoryKey 1--n ModelParameter 在用户从表单的(基于模型实体的表单)下拉列表中选择模型

我的表单中有一个下拉菜单,表单结构取决于它的值。我已经设法用事件订阅者/监听器类解决了“表单更新问题”,我正在尝试根据下拉列表的值更新主表单

主要问题是,我必须根据数据库中保留的值修改表单。 我的数据库模式:

我有4个表:模型模型类别模型类别模型参数

  • 模型类别1--n模型1--m模型参数
  • ModelCategory 1--n ModelCategoryKey
  • ModelCategoryKey 1--n ModelParameter
在用户从表单的(基于模型实体的表单)下拉列表中选择模型类别后,我必须使用ModelParameter行更新表单,但它的数量和默认值取决于ModelCategory 1--n ModelCategoryKey Assocation

在PRE_BIND事件期间,我尝试将新的ModelParameter实体附加到主模型实体(还设置了它们的默认值),它似乎工作正常,但当我将带有“collection”类型元素的“parameters”添加到表单时,我会遇到下一个错误:

必须管理传递到选项字段的实体。也许可以将它们保存在实体管理器中

显然,我的实体此时不能(也不应该)持久化

欢迎提出任何意见

更新: 在预提交/预绑定后修改表单:

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

其中“factory”属性是FormFactoryInterface。错误消息是相同的

更新2:

进一步的调查证明,如果我不在Association中添加“默认”实体。然后它就可以正常工作了

以下是我的表单修改方法的来源:

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
                ))
    );

}
似乎是由
我刚刚注释掉了$param->setModel($entity);这条线看起来很好用。如果它真的有效,我将进一步解决这个问题,并与大家分享经验。

choice
字段只接受托管实体,因为该值在提交后设置为实体,而表单只发布实体ID,因此必须事先保存

您不需要选择字段-您需要参数子窗体的集合

$formBuilder
    ->add('category', 'category_select')
    ->add('parameters', 'collection', array('type' => 'parameter'))
;
这里我假设
category\u select
是带有类别的选择字段,
parameter
是带有自身值的子表单,具体取决于您的参数结构


当您的控制器中有类别时,您可以将新创建的实体与添加的参数实体及其
集绑定,具体取决于ModelCategoryKey。

我已经设法解决了我的问题,因此我发现:

  • 通过反向侧的加法器函数添加新创建的对象就足够了。我不需要打电话给对方的二传手
  • 必须修改反向边加法器函数,即它调用拥有方的setter
  • 反向边加法器函数必须检查对象是否已不在集合中
  • 创建表单时,会发生预设置数据事件。(因此在新实体中为空,在旧实体中为填充)

我试图用集合显示新创建的实体,而不是用选择类型字段。我不知道为什么错误消息告诉我这是一个选择字段:)
$formBuilder
    ->add('category', 'category_select')
    ->add('parameters', 'collection', array('type' => 'parameter'))
;