Symfony 未映射的实体表单字段没有数据
Symfony unmapped entity form field not having data
在 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'
]
]
);
这允许用户正确地 select MyEntity 的项目或将其留空。据此,如果有任何值被 selected,我将添加一个 EventSubscriber 来修改 preSubmitted 数据,如果没有做出选择,则保持原样。
这是事件订阅者:
/**
* {@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 )
;
}
如果用户 select 的选择不是空白,当我调试 preSubmitData 函数时:
- $event->getForm()->get('entity')->getData() 给出 null
- $event->getData() 给出一个数组,该数组具有作为 'entity' 键的 selected 实体 ID(只是标量值)
我的问题是:
- $event->getForm()->get('entity')->getData() 不应该有 selected 实体吗?
- 如果 $event->getData() 中至少有实体 ID,为什么 $event->getForm()->get('entity')->getData() 给出 null?
- 有没有什么方法可以在不必调用实体管理器并通过其 ID 查询实体的情况下在此处获取实体(就像映射实体一样)?
提前致谢!
编辑
为了全局,在我的全局表单中(此处未描述的其他字段)我有 2 个依赖字段:
- A select A (此处未描述)以及树中的一些选项。此选项作为 属性.
确实存在于全局表单实体中
- 第二个 B select 名为 myEntity(此处描述)。它不作为 属性 的全局表单实体存在,因此 mapped = false。如果在这里做出任何选择,那么第一个 select (A) 的选项将被这个选项覆盖。否则首选仍然是实体 属性 值。
希望现在更清晰了。
好的,它给出了 null,因为我们在 preSubmit 事件中,这里发送的数据还没有映射到一个实体中。
将事件更改为 提交 根据需要提供映射实体。
在 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'
]
]
);
这允许用户正确地 select MyEntity 的项目或将其留空。据此,如果有任何值被 selected,我将添加一个 EventSubscriber 来修改 preSubmitted 数据,如果没有做出选择,则保持原样。
这是事件订阅者:
/**
* {@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 )
;
}
如果用户 select 的选择不是空白,当我调试 preSubmitData 函数时:
- $event->getForm()->get('entity')->getData() 给出 null
- $event->getData() 给出一个数组,该数组具有作为 'entity' 键的 selected 实体 ID(只是标量值)
我的问题是:
- $event->getForm()->get('entity')->getData() 不应该有 selected 实体吗?
- 如果 $event->getData() 中至少有实体 ID,为什么 $event->getForm()->get('entity')->getData() 给出 null?
- 有没有什么方法可以在不必调用实体管理器并通过其 ID 查询实体的情况下在此处获取实体(就像映射实体一样)?
提前致谢!
编辑
为了全局,在我的全局表单中(此处未描述的其他字段)我有 2 个依赖字段:
- A select A (此处未描述)以及树中的一些选项。此选项作为 属性. 确实存在于全局表单实体中
- 第二个 B select 名为 myEntity(此处描述)。它不作为 属性 的全局表单实体存在,因此 mapped = false。如果在这里做出任何选择,那么第一个 select (A) 的选项将被这个选项覆盖。否则首选仍然是实体 属性 值。
希望现在更清晰了。
好的,它给出了 null,因为我们在 preSubmit 事件中,这里发送的数据还没有映射到一个实体中。
将事件更改为 提交 根据需要提供映射实体。