在Symfony 2.6中,我使用的是未映射的实体表单类型:
$form
->add(
'myEntity', // Form field name
'entity',
[
'mapped' => false, // Not mapped
'class' => 'MyVendor\MyBundle\Entity\MyEntity',
'choices' => $MyEntityCollection, // list of MyEntity
'property' => 'name',
'empty_value' => 'Please select MyEntity',
'empty_data' => null,
'attr' => [
'label' => 'My label'
]
]
);
这允许用户正确选择MyEntity项或将其留空 . 根据这一点,我添加了一个EventSubscriber来修改preSubmitted数据,如果选择了任何值,并保留原样,如果没有选择 .
这是eventSubscriber:
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return [
FormEvents::PRE_SUBMIT => 'preSubmitData'
];
}
/**
* @param FormEvent $event
*/
public function preSubmitData(FormEvent $event)
{
if( null === ($entity = $event->getForm()->get( 'myEntity' )->getData() ) ){
return;
}
// Set value if field has been defined
$event
->getForm()
->setData( $entity )
;
}
如果用户选择空白以外的选项,则在调试preSubmitData函数时:
-
$event->getForm()->get('entity')->getData() 给 null
-
$event->getData() 给出一个数组,其中包含'entity'键所选的 entity ID (只是标量值)
我的问题是:
-
Shouldn 't $event->getForm()->get(' entity') - > getData()有选定的实体吗?
-
为什么$ event-> getForm() - > get('entity') - > getData()如果$ event-> getData()至少包含实体ID,则给出null?
-
有没有办法在这里获取实体(与映射实体一样),而无需调用实体管理器并通过其ID查询实体?
提前致谢!
Edit
总体而言,在我的全球形式(此处未描述的其他领域)中,我有2个依赖字段:
-
使用树中的一些选项选择 A (此处未描述) . 此选项在全局表单实体中作为属性存在 .
-
第二个 B 选择名为 myEntity (此处描述) . 它不作为属性的全局表单实体存在,因此mapped = false . 如果在此处做出任何选择,则第一个选择( A )的选项将被此选项覆盖 . 否则,第一选择仍然是实体属性值 .
希望现在更清楚了 .
1 回答
好吧,它给出了null,因为我们在 preSubmit 事件上,并且此处发送的数据尚未映射到实体中 .
将事件更改为 submit 会根据需要提供映射的实体 .