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条)

报告相同问题?

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。