我有一个这样的表单定义(用于演示目的):
$builder->add('field', 'entity', [
'class' => EntityA::class,
'query_builder' => function($repo) {
return $repo->createQueryBuilder('e')
->andWhere('e.active = 1');
}
]);
这确保了在使用此表单时,只能在下拉字段中选择活动记录。
这导致了这种情况:当我使用上面的表单定义编辑实体,并将此实体指定为非活动EntityA
时,它不会出现在下拉字段中。当我点击保存按钮时,它将获得分配的第一个活动(如果有)EntityA
。此外,表单还会向用户建议分配的Entity
与实际不同。
正确的方法是表单显示所有活动记录和当前分配的非活动记录。
我查看了Form事件监听器,但这看起来过于复杂。此外,扩展表单只是为了编辑可能是一件事,但对我来说似乎不是“正确的方法”。
如何解决此问题,最好不使用第三方捆绑包?
答案 0 :(得分:0)
获取对象并将不同的数据加载到下拉列表中,具体取决于操作类型:edit / create:
$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
$form ->add('field', 'entity', [
'class' => EntityA::class,
'query_builder' => function($repo) use ($data) {
if ($data->getId()) {
// Edit mode: append the pre-selected record to dropdown
return $repo->createQueryBuilder('e')
->andWhere('e.active = 1')
->orWhere('e.id = :id')
->setParameter('id', $data->getId());
} else {
// Display only active records
return $repo->createQueryBuilder('e')->andWhere('e.active = 1');
}
}
]);
});