首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2嵌入式表单+动态表单更新

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

Stack Overflow用户
提问于 2013-09-06 16:00:03
回答 2查看 1.5K关注 0票数 2

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

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

我有四张桌子:ModelCategoryModelCategoryKeyModelParameter.,Model

  • ModelCategory 1--n型1--m ModelParameter
  • ModelCategory 1--n ModelCategoryKey
  • ModelCategoryKey 1--n ModelParameter

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

在ModelParameter事件期间,我尝试将新的PRE_BIND实体附加到main Model实体(也设置了它们的默认值),这似乎很好,但是当我将带有“集合”类型化元素的“参数”添加到表单时,我得到了下一个错误:

传递给选择字段的实体必须被管理。或者将它们保存在实体管理器中?

显然,我的实体在这个时候不能(也不应该)持久化。

所有的想法都欢迎!

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

代码语言:javascript
复制
$form->add('parameters','collection',array(
    'type' => new ModelParameterType(),         
));

代码语言:javascript
复制
$form->add(
            $this->factory->createNamed('parameters','collection',null,
                array(
                    'type' => new ModelParameterType()
                    ))
        );

其中的“工厂”属性是一个FormFactoryInterface。错误消息是相同的。

UPDATE2:

进一步的调查证明,如果我不添加“默认”实体的位置。那么它就不会出错。

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

代码语言:javascript
复制
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);行,它似乎运行得很好。我会更多地解决这个问题,如果它真的有效的话,我会分享它的经验。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-08 20:47:11

我已经解决了我的问题,所以我发现:

  • 通过逆侧加法器函数来增加新创建的对象就足够了。我不需要打电话给老板的策划人。
  • 逆方加法器函数必须修改,它调用拥有方的设置器。
  • 反侧加法器函数必须检查对象是否已经在集合中。
  • 创建表单时,会发生PRE_SET_DATA事件。(因此,在新的实体中,它是空的,而在旧的实体中,它是填充的)
票数 0
EN

Stack Overflow用户

发布于 2013-09-06 21:16:56

choice字段只接受托管实体,因为该值在提交后被设置为实体,并且只形成posts实体ID,因此必须事先保存它。

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

代码语言:javascript
复制
$formBuilder
    ->add('category', 'category_select')
    ->add('parameters', 'collection', array('type' => 'parameter'))
;

这里我假设category_select是带有类别的选择字段,而parameter是具有自己的值的子表单,这取决于您的参数结构。

当控制器中有类别时,可以根据key将新创建的实体与添加的参数实体及其ModelCategoryKey集绑定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18661881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档