具有非活动记录的实体表单字段
Entity form field with inactive records
我有一个这样的表单定义(用于演示目的):
$builder->add('field', 'entity', [
'class' => EntityA::class,
'query_builder' => function($repo) {
return $repo->createQueryBuilder('e')
->andWhere('e.active = 1');
}
]);
这确保在使用此表单时只能在下拉字段中选择活动记录。
这导致了这种情况:当我使用上面的表单定义编辑一个实体时,该实体作为非活动 EntityA
分配,它不会出现在下拉字段中。当我点击保存按钮时,它将获得第一个活动(如果有)EntityA
分配。此外,该表单将向用户建议分配了与实际不同的 Entity
。
正确的方法是表格显示所有活动记录和当前分配的一个非活动记录。
我查看了表单事件侦听器,但这似乎过于复杂。另外,扩展表单只是为了编辑可能是一回事,但对我来说似乎不是 "the right way"。
如何解决这个问题,最好不使用第 3 方捆绑包?
获取对象并将不同的数据加载到下拉列表中,具体取决于操作类型: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');
}
}
]);
});
我有一个这样的表单定义(用于演示目的):
$builder->add('field', 'entity', [
'class' => EntityA::class,
'query_builder' => function($repo) {
return $repo->createQueryBuilder('e')
->andWhere('e.active = 1');
}
]);
这确保在使用此表单时只能在下拉字段中选择活动记录。
这导致了这种情况:当我使用上面的表单定义编辑一个实体时,该实体作为非活动 EntityA
分配,它不会出现在下拉字段中。当我点击保存按钮时,它将获得第一个活动(如果有)EntityA
分配。此外,该表单将向用户建议分配了与实际不同的 Entity
。
正确的方法是表格显示所有活动记录和当前分配的一个非活动记录。
我查看了表单事件侦听器,但这似乎过于复杂。另外,扩展表单只是为了编辑可能是一回事,但对我来说似乎不是 "the right way"。
如何解决这个问题,最好不使用第 3 方捆绑包?
获取对象并将不同的数据加载到下拉列表中,具体取决于操作类型: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');
}
}
]);
});