【发布时间】:2019-05-19 13:36:55
【问题描述】:
在 symfony 4 表单中,我需要使用类似 query_builder 的选项,该选项在 EntityType 上可用,但来自 CollectionType。有一个类似的问题here 没有很好的答案。
在我的项目中,每个Site 实体都有很多Goal。每个Goal 都有一个数字目标和一个特定日期。我只想编辑特定日期的网站目标。问题是 CollectionType 表单会拉出 all 目标以显示在表单中,但我只想拉出给定日期的目标。如何?在CollectionType 上没有query_builder,就像在EntityType 上一样。我可以更改 Site 实体中的 getter,但我不知道如何将所需的日期传递给我的 getter。
目前我的解决方法是渲染整个表单(包含给定站点的所有相关目标),然后使用一些 javascript 隐藏所有目标,除了那些带有编辑日期的目标。这行得通,但对于在多个日期范围内有很多目标的网站来说,这是一个糟糕的解决方案。
我的Site 实体(仅显示相关代码):
class Site
{
public function __construct()
{
$this->goals = new ArrayCollection();
}
/** @ORM\OneToMany(targetEntity="App\Entity\Goal", mappedBy="site") */
private $goals;
public function getGoals()
{
return $this->goals;
}
}
和我相关的Goal实体:
class Goal
{
/** @ORM\Column(type="date") */
private $goalDate;
/** @ORM\Column(type="integer") */
private $goal;
/** @ORM\ManyToOne(targetEntity="App\Entity\Site", inversedBy="goals") */
private $site;
// ...
}
我的表格:
class SiteGoalsAdminForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('goals', CollectionType::class, [
'entry_type' => GoalsEmbeddedForm::class,
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Site::class
]);
}
}
以及个人目标形式:
class GoalsEmbeddedForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('goal', IntegerType::class)
->add('goalDate', DateType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Goal::class,
]);
}
}
【问题讨论】:
-
我相信
CollectionType的allow_addandallow_delete选项暗示提交的表单数据属于集合中的所有实体。在特定日期范围内仅编辑Goals 可能最好在CollectionType之外进行。 -
我可能完全错了,实际上!如果编辑(不是删除或添加新的)是路由中这些
Goals 的唯一关注点,那么最好使用form events 完成基于日期范围呈现的过滤! -
谢谢@CameronHurd。你是对的,我不需要在这个应用程序中添加/删除目标,我只需要编辑现有的目标。表单事件的想法很有趣,但很难看到如何应用于整个实体数组和相关参数。