我想在一种形式中使用来自少数实体的字段,我可以这样做吗?例如,我想从surname
类型添加一个表单ProfileType
字段,从name
添加CountryType
字段。此字段必须是简单字符串(text
)。
我该怎么办?谢谢!
注意:我无法使用entity类型,因为Symfony仅提供复选框,单选按钮和选择,但我需要使用一个简单的文本字段。
答案 0 :(得分:5)
要在表单中包含相关实体的字段,请为每个相关实体嵌入自定义表单类型。从理论上讲,可以在单个表单中显示和更新具有多个关系的复杂实体的所有数据。在实践中,为多个关系执行此操作可能会变得复杂,但对于一个关系来说却很简单。请参阅Symfony Forms文档中的Embedded Forms: Embedding a single object。
例如,在主要实体的表单类型中:
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)”,您将获得其他您不想要的字段,或者如果您不使用form_rest则依赖于您使用的symfony版本可能会出错。处理这个问题的方法不止一种。
我有时使用'form_widget(_token)'代替'form_rest(form)'来解决这个问题。但是我不知道你是否可以依赖这个继续工作。您可以将“form_rest(form)”包装在隐藏的div中,因为它通常仅用于添加隐藏的“_token”字段,在这种情况下,您不希望看到其他“个人档案”和“国家/地区”字段。在这种情况下,隐藏的实体值仍然映射到表单并返回,具有任何相应的开销,但是值不能更改。
或者,您可以为“个人档案”和“国家/地区”实体提供多种表单类型,并使用相应的表单类型作为上下文。我不知道你的表单是什么,但是,例如,你可能有EditThingProfileType和EditThingCountryType用于上面的buildForm()方法,每个只添加你在表单上需要的单个字段。