Symfony2:包含空数据的初始化实体类型字段



我的FormBuilder中有一个字段(EntityType =>在视图中选择(,我希望它用空数据初始化,以便之后可以通过 ajax 在视图中填充它。
所以我阅读了symfony关于EntityType的文档,我找到了接收数据数组的choices属性,所以我给了它一个空的'choices' => array(),它做到了。
现在的问题是,当我提交表单时,symfony不再知道字段的类型并给我null
这是构建器:

$buidler->add('supplier', EntityType::class, array(
                'class' => 'SBCTiersBundleEntitySupplier',
                'attr' => array(
                    'class' => 'uk-select uk-select-supplier'
                ),
                'choices' => array(),
            ))

如您所见,该字段的类型SBCTiersBundleEntitySupplier但是提交后symfony给了我null!
我应该怎么做才能实现我的目标?

好的,这是解决方案:
首先,我需要将EntityManager传递给我的表单,为此,我创建了一个服务:

services:
    payment.supplier.form:
        class: SBCPaymentBundleFormPaymentSupplierType
        tags:
            - { name: form.type, alias: form_em }
        arguments: ["@doctrine.orm.entity_manager"]

然后在 __construct 函数中调用 EntityManager

 private $em;
 private $supplier;
 function __construct(EntityManager $em)
 {
    $this->em = $em;
 }

其次,我需要在表单中添加两个事件:
PRE_SUBMIT(获取供应商代码并使用实体管理器创建供应商对象(:

$builder->addEventListener(
            FormEvents::PRE_SUBMIT,
            function(FormEvent $event){
                $data = $event->getData();
                $code = $data['supplier'];
                $this->supplier = $this->em->getRepository('TiersBundle:Supplier')->find($code);
            }
        );

最后,使用 POST_SUBMIT 事件在提交的数据中设置供应商对象:

$builder->addEventListener(
            FormEvents::POST_SUBMIT,
            function(FormEvent $event){
                $object = $event->getData();
                $object->setSupplier($this->supplier);
                $event->setData($object);
            }
        );

感谢 Виталий Бойко 谁给了我关于表格事件的提示。
这就是我用我的知识所做的,如果您有更好的解决方案,请与我们分享。

默认情况下,Symfony对表单使用安全性,因此,如果您在表单生成器中没有选择,则无法在仅通过javascript渲染后将自定义选项传递给表单,因为您获得的表单无效。您需要为表单创建事件侦听器。查看此链接以获取更多信息在此处输入链接说明,在这里您可以找到如何添加选项。附言对不起我的英语(

相关内容

最新更新