Php 具有非活动记录的实体表单字段
我有这样一个表单定义(用于演示): 这样可以确保在使用此表单时,只能在下拉字段中选择活动记录 这导致了这种情况:当我使用上面的表单定义编辑一个实体,并且该实体作为非活动Php 具有非活动记录的实体表单字段,php,symfony,symfony-forms,Php,Symfony,Symfony Forms,我有这样一个表单定义(用于演示): 这样可以确保在使用此表单时,只能在下拉字段中选择活动记录 这导致了这种情况:当我使用上面的表单定义编辑一个实体,并且该实体作为非活动EntityA分配时,它不会出现在下拉字段中。当我点击save按钮时,它将获得分配的第一个活动(如果有)EntityA。此外,表单还将向用户建议分配的实体与实际分配的实体不同 正确的方法是表单显示所有活动记录和当前分配的非活动记录 我查看了表单事件侦听器,但这似乎过于复杂。此外,仅仅为了编辑而扩展表单可能是一件事,但对我来说这似乎
EntityA
分配时,它不会出现在下拉字段中。当我点击save按钮时,它将获得分配的第一个活动(如果有)EntityA
。此外,表单还将向用户建议分配的实体与实际分配的实体不同
正确的方法是表单显示所有活动记录和当前分配的非活动记录
我查看了表单事件侦听器,但这似乎过于复杂。此外,仅仅为了编辑而扩展表单可能是一件事,但对我来说这似乎不是“正确的方式”
如何解决此问题,最好不使用第三方捆绑包?获取对象并将不同的数据加载到下拉列表中,具体取决于操作类型:编辑/创建:
$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');
}
}
]);
});
如果我将此代码放入buildForm
方法中,则对于$object
,我总是得到null
。此时执行时间太早。请在触发FormEvents::POST_SET_DATA Event事件时添加该字段(),谢谢。我结合使用了PRE\u SET\u DATA
和自定义字段类型来扫描我的表单并更改query\u builder
。
$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');
}
}
]);
});