我的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渲染后将自定义选项传递给表单,因为您获得的表单无效。您需要为表单创建事件侦听器。查看此链接以获取更多信息在此处输入链接说明,在这里您可以找到如何添加选项。附言对不起我的英语(