我有 2 个实体(A 和 B),它们之间存在多对一关系。
我使用 A 实体创建表单,并使用实体字段(下拉列表)来显示 B 实体中的行。我使用查询生成器来过滤它们。如果不更改列表中的值(即使用 ajax),一切正常。
但是,如果我动态更改下拉列表中的值,当我提交表单时,我会收到此错误“此值无效”
这是因为提交的值不包含在查询生成器返回的“数组”中。
似乎这个验证在 symfony 中对于实体字段是自动的(我没有在这个字段上使用任何断言)。我想摆脱这个。但是如何?
我有 2 个实体(A 和 B),它们之间存在多对一关系。
我使用 A 实体创建表单,并使用实体字段(下拉列表)来显示 B 实体中的行。我使用查询生成器来过滤它们。如果不更改列表中的值(即使用 ajax),一切正常。
但是,如果我动态更改下拉列表中的值,当我提交表单时,我会收到此错误“此值无效”
这是因为提交的值不包含在查询生成器返回的“数组”中。
似乎这个验证在 symfony 中对于实体字段是自动的(我没有在这个字段上使用任何断言)。我想摆脱这个。但是如何?
更明确地回答我的问题:
可以使用函数 BuildForm 中的事件侦听器重新定义 PRE_BIND 表单事件,如下例所示:
$factory = $builder->getFormFactory();
$builder->addEventListener(FormEvents::PRE_BIND, function($event) use ($factory) {
$form = $event->getForm();
$case = $event->getData();
$id = $case['id'];
if ($case) {
$form->remove('id');
$form->add($factory->createNamed('hidden', 'id',$id, array()));
}
});
对于 Symfony 2.3,您需要添加 auto_initialize = false 并更改参数的顺序:
$form->add($factory->createNamed('id', 'hidden', $id, array('auto_initialize' => false)));