如何在实体表单中包含来自另一个实体的某些字段?

时间:2014-03-25 16:36:24

标签: php symfony doctrine-orm symfony-forms

我想在一种形式中使用来自少数实体的字段,我可以这样做吗?例如,我想从surname类型添加一个表单ProfileType字段,从name添加CountryType字段。此字段必须是简单字符串(text)。

我该怎么办?谢谢!

注意:我无法使用entity类型,因为Symfony仅提供复选框单选按钮选择,但我需要使用一个简单的文本字段。

1 个答案:

答案 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()方法,每个只添加你在表单上需要的单个字段。