我想在一个表单中使用几个实体的字段,我能做到吗?例如,我想在一个表单中添加ProfileType
类型中的surname
字段和CountryType
类型中的name
字段。该字段必须是一个简单的字符串(text
)。
我该怎么做?谢谢!
注意:我不能使用实体类型,因为Symfony只提供复选框, 单选按钮和选择为它,但是我需要使用一个简单的文本字段。
要在表单中包含来自相关实体的字段,您可以为每个相关实体嵌入自定义表单类型。从理论上讲,在单个表单中显示和更新具有许多关系的复杂实体的所有数据是可能的。在实践中,对许多关系这样做可能会变得复杂,但对toOne关系来说很简单。请参阅嵌入表单:在Symfony表单文档中嵌入单个对象。
例如,在主实体的表单类型中:
public function buildForm(FormBuilderInterface $builder, array $options)
{
...
$builder->add('profile', new ProfileType());
$builder->add('country', new CountryType());
...
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
...,
'cascade_validation' => true,
));
}
然后你可以在你的分支中添加你需要的字段,像这样:
{{ form_widget(form.profile.surname) }}
{{ form_widget(form.country.name) }}
假设你的ProfileType和CountryType添加其他字段到他们的表单,然后如果你使用"form_rest(表单)"在你的分支你会得到你不想要的其他字段,或者如果你不使用form_rest那么取决于哪个symfony版本你正在使用你可能会得到错误。处理这件事的方法不止一种。
我有时使用'form_widget(_token)'来代替'form_rest(form)'来解决这个问题。然而,我不知道你是否可以依靠它在未来继续工作。你可以在一个隐藏的div中包装"form_rest(form)",因为它通常只用于添加隐藏的"_token"字段,在这种情况下,你不想看到其他配置文件和国家字段。在这种情况下,隐藏的实体值仍然映射到表单并返回,有任何相应的开销,但是这些值不能更改。
或者,您可以为您的Profile和Country实体拥有多个表单类型,并为上下文使用适当的表单类型。我不知道你的表单是什么,但是,例如,你可能有EditThingProfileType和EditThingCountryType在上面的buildForm()方法中使用,每个只添加你需要在你的表单上的单个字段。