dongyihao9887 2017-02-14 09:10
浏览 59
已采纳

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

I have a field (EntityType => select in the view) in my FormBuilder that I want it to be in initialized with empty data so I can fill it after that in the view via ajax.
So I have read symfony's documentation about EntityType and I found the choices attribute that receives an array of data, so I gave it an empty one 'choices' => array() and it did the trick.
Now the problem is when I submit the form, symfony don't know anymore the type of the field and give me null.
This is the builder:

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

As you can see the the type of the field is SBC\TiersBundle\Entity\Supplier but after submit symfony gives me null !
What should I do to achieve my goal?

  • 写回答

2条回答 默认 最新

  • doupeng3501 2017-02-14 13:02
    关注

    All right, this is the solution:
    First, I need to pass the EntityManager to my form, and to do this I have created a service:

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

    Then call the EntityManager in the __construct function:

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

    Second, I need to add two events to the form:
    PRE_SUBMIT (to get supplier's code and create Supplier object using the EntityManager):

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

    And finally, use the POST_SUBMIT event to set the supplier object in the submitted data:

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

    Thanx to Виталий Бойко who gave me a hint about the form events.
    So this is what I did with my knowledge and if you have a better solution please share it with us.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)