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

没事

我的表单中有一个下拉菜单,并且表单结构取决于其值。我设法通过事件订阅者/侦听器类解决了“ form-update-issue”问题,在该类中,我试图根据下拉列表的值更新主表单。

主要问题是我必须根据数据库中保留的值来修改表单。我的数据库架构:

我有4个表:ModelModelCategoryModelCategoryKeyModelParameter

  • 模型类别1-n模型1-m模型参数
  • ModelCategory 1-n ModelCategoryKey
  • ModelCategoryKey 1-n ModelParameter

在用户从表单(基于模型实体的表单)下拉列表中选择ModelCategory之后,我必须使用ModelParamater行更新表单,但是其数量和默认值取决于ModelCategory 1 – n ModelCategoryKey组合。

我试图在PRE_BIND事件期间将NEW ModelParameter实体附加到主Model实体(还设置其默认值),并且看起来工作正常,但是当我将带有“ collection”类型元素的“ parameters”添加到表单i时,得到下一个错误:

传递给选择字段的实体必须进行管理。也许将它们保留在实体经理中?

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

欢迎所有想法!

更新:在preSubmit / preBind之后修改表单:

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

或者

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

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

UPDATE2:

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

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

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);。行,它似乎工作正常。如果确实可行,我将做更多的工作并分享经验。

没事

我已经设法解决了我的问题,所以这就是我发现的内容:

  • 通过反面的加法器功能添加新创建的对象就足够了。我不必致电所有者的二传手。
  • 反面加法器函数必须进行修改,它调用拥有方的setter。
  • 反向加法器函数必须检查对象是否尚未在集合中。
  • 创建表单时,发生PRE_SET_DATA事件。(因此在新实体中为空,而在旧实体中为空)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章