具有非活动记录的实体表单字段

时间:2015-08-26 11:30:11

标签: php symfony symfony-forms

我有一个这样的表单定义(用于演示目的):

$builder->add('field', 'entity', [
    'class' => EntityA::class,
    'query_builder' => function($repo) {
        return $repo->createQueryBuilder('e')
            ->andWhere('e.active = 1');
    }
]);

这确保了在使用此表单时,只能在下拉字段中选择活动记录。

这导致了这种情况:当我使用上面的表单定义编辑实体,并将此实体指定为非活动EntityA时,它不会出现在下拉字段中。当我点击保存按钮时,它将获得分配的第一个活动(如果有)EntityA。此外,表单还会向用户建议分配的Entity与实际不同。

正确的方法是表单显示所有活动记录和当前分配的非活动记录。

我查看了Form事件监听器,但这看起来过于复杂。此外,扩展表单只是为了编辑可能是一件事,但对我来说似乎不是“正确的方法”。

如何解决此问题,最好不使用第三方捆绑包?

1 个答案:

答案 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');                          
              }  
          }
     ]);
});