问题描述
我有一个带有自定义 ChoiceType 的 Symfony 表单,它需要根据另一个字段的值(同一表单中的同级表单类型)过滤可用选项。
我使用的 EasyAdmin CMS 不允许其字段将额外的动态 type_options
传递给它们的表单类型 because of it YAML configuration。我希望自定义 ChoiceFormType 封装有关如何解决其自身选项的逻辑。
但是根据其他表单数据修改选项似乎是不可能的。
- 表单数据在
NULL
里面是buildForm()
;我只能从FormEvents
访问它。 - 在
FormEvents::PRE_SET_DATA
中,我无法将当前类型替换为具有修改选项的类型。
public function buildForm(FormBuilderInterface $builder,array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA,function (FormEvent $event) use ($builder,$options) {
$parent = $event->getForm()->getParent();
$parent_data = $parent-getData();
$other_field_value = $parent_data->getotherFieldValue();
$filtered_choices = array_filter(fn($choice) => $choice !== $other_field_value);
$options['choices'] = $filtered_choices;
$parent->add($form,get_class($this),$options); // THIS FAILS
}
尝试设置基于表单数据动态解析的选项失败:
检测到一个循环。 PRE_SET_DATA 事件的侦听器不得调用 setData()。您应该改为在 FormEvent 对象上调用 setData()。
但 $event->setData()
仅适用于当前 FormType,而不适用于整个表单。
让 FormType 根据同级表单类型的值动态设置自己的选项的模式是什么?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)