Php 如果缺少,请将当前对象值添加到ChoiceType值
我目前正在将一个应用程序转换为Symfony 3.3,我对如何实现以下目标感到困惑 我有一个名为Php 如果缺少,请将当前对象值添加到ChoiceType值,php,symfony,events,symfony-3.3,Php,Symfony,Events,Symfony 3.3,我目前正在将一个应用程序转换为Symfony 3.3,我对如何实现以下目标感到困惑 我有一个名为Responsible(Stringvalues)的ChoiceType字段,它是从数据库视图填充的。我希望在进入编辑模式时看到Responsible字段已经填充,这是在记录Responsible值是Responsible字段值的一部分时进行的 但此后这些值发生了变化,因此当我开始编辑现有记录时,当该值不是已填充值的一部分时,它将显示为请选择 我的目标是将缺少的值添加到Responsible字段值中,
Responsible
(String
values)的ChoiceType
字段,它是从数据库视图填充的。我希望在进入编辑模式时看到Responsible
字段已经填充,这是在记录Responsible
值是Responsible
字段值的一部分时进行的
但此后这些值发生了变化,因此当我开始编辑现有记录时,当该值不是已填充值的一部分时,它将显示为请选择
我的目标是将缺少的值添加到Responsible
字段值中,以便预先选择它,但我还无法找到如何选择它
我试图查看选项类型
中是否有一个选项,但似乎我必须通过onPreSetData
事件来执行此操作,但即使在那里,我也只能找到如何动态添加字段,而不能向现有字段添加值
任何人都知道如何做到这一点,而哪一种是“正确”的方式
谢谢
编辑:多亏了@matval answer,如果当前值在选项中,则只缺少一些可查找的内容,因此我们没有重复的值,例如如果(!array_key_存在($entity->getResponsible(),$choices))
形式事件是正确的方法。它们是制作动态表单的最佳方式。如中所示,您应该在
PRE_SET_DATA
事件期间添加您的Responsible
字段
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$entity = $event->getData();
$choices = ... // populate from db
$choices[] = $entity->getResponsible();
$form = $event->getForm();
$form->add('responsible', ChoiceType::class, [
'choices' => $choices,
]);
});
如果您想在表单类型中保留动态字段责任
(可能重新用于创建操作),您仍然可以使用相同的事件。您所需要做的就是删除该字段并再次添加它
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$entity = $event->getData();
$choices = ... // populate from db
$choices[] = $entity->getResponsible();
$form = $event->getForm();
$form->add('responsible', ChoiceType::class, [
'choices' => $choices,
]);
});
你应该发布代码,告诉我们你在哪里。它就像一个符咒,谢谢!我看到我们可以从事件中添加表单字段,但正在寻找一种简单地添加值的方法。无论如何,这样做看起来太复杂了,所以我只需将
Responsible
字段保留在PreSet
事件中。注意:如果(!array_key_存在($entity->getResponsible(),$choices)),请使用类似的方法避免在选项字段中出现重复的值(如果该值没有丢失)。
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$entity = $event->getData();
$choices = ... // populate from db
$choices[] = $entity->getResponsible();
$form = $event->getForm();
$form->add('responsible', ChoiceType::class, [
'choices' => $choices,
]);
});