我的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!
我该怎么做才能实现我的目标?
答案 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,您可以在此处找到添加选项的方法。 附:抱歉我的英文)