Symfony2:init EntityType字段,包含空数据

时间:2017-02-14 09:10:10

标签: php forms symfony

我的EntityType中有一个字段(FormBuilder =>选择)我希望它用空数据初始化,所以我可以在视图中填写后通过阿贾克斯。
我已阅读EntityType关于choices的内容,我找到了接收数据数组的 'choices' => array() 属性,因此我给了它一个空的{{1}这就是诀窍 现在的问题是当我提交表单时,symfony不再知道该字段的类型并给我null
这是建设者:

$buidler->add('supplier', EntityType::class, array(
                'class' => 'SBC\TiersBundle\Entity\Supplier',
                'attr' => array(
                    'class' => 'uk-select uk-select-supplier'
                ),
                'choices' => array(),
            ))

正如您所看到的那样,字段的类型为SBC\TiersBundle\Entity\Supplier,但在提交后,symfony会给我null! 我该怎么做才能实现我的目标?

2 个答案:

答案 0 :(得分:3)

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

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

然后拨打EntityManager功能中的__construct

 private $em;
 private $supplier;

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

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

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

            }
        );

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

答案 1 :(得分:0)

默认情况下,Symfony使用表单的安全性,因此如果您在表单构建器中没有选择,则只能通过javascript进行渲染后才能将自定义选项传递给表单,因为您的表单无效。您需要为表单创建eventlistener。查看此链接以获取更多信息enter link description here,您可以在此处找到添加选项的方法。 附:抱歉我的英文)