我构建了一个包含实体类型字段的表单:
/**
* Show account register form.
*
* @param FormBuilderInterface $builder Builder to modify
*/
protected function showAccountRegisterForm(FormBuilderInterface $builder)
{
$builder
->add('bank',
EntityType::class,
[
'class' => 'AdminBundle:Bank',
'choice_label' => 'name',
'required' => false,
'translation_domain' => 'form',
'placeholder' => 'Choose a bank',
]
)
;
}
我再添加一个选项供用户使用finishView函数选择“Other”调用:
public function finishView(FormView $view, FormInterface $form, array $options)
{
//new option
$other = new ChoiceView(array(), 'other', $this->translator->trans('bank.option.other'));
//adding the new option
$view->children['bank']->vars['choices'][] = $other;
}
一切正常,它为我呈现“其他”选项,但是当我选择“其他”选项并提交时,我在该实体上收到了表单错误。 有谁知道如何解决这个问题?谢谢
我认为这里的问题是因为价值是'其他'
这是一个字符串,我们的文件是一个EntityType,这就是为什么它导致ConstraintViolation错误。我已经搜索了几天,但可以找到正确的答案。
答案 0 :(得分:0)
您正在使用实体类型,并且您正在尝试提交不存在的实体。如果要使用实体类型,则需要在数据库中有实际的选择记录。
答案 1 :(得分:0)
好的,我终于通过删除' bank'从表单生成器到void表单验证并由我自己在控制器中验证,然后在控制器中通过银行模板并循环通过它来创建选择,最后从请求获取银行。
为了帮助某人节省时间,您需要使用带有Symfony表单的额外字段。在这里,我对EntityType和ChoiceType进行了测试,它们都需要在呈现表单时存在您发送的数据,如果您发送的数据不存在,将导致表单 ConstraintViolation错误。因此,如果您发送的数据是由js添加的新数据(选项),则会出错。与此类似的另一种情况,如果您使用EntityType并使用query_builder(与使用ChoiceType相同并从函数中选择),您添加的新数据(选项)最多可以通过您编写的查询获取。 例如:您的query_builder只会获得状态为true的银行,但您刚刚添加的新银行状态为false,这也会导致错误。
希望这会有所帮助:)