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

Vic*_*sky 4 php symfony-forms symfony doctrine-orm

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

我该怎么做?谢谢!

注意:我不能使用实体类型,因为Symfony只提供复选框,单选按钮选择它,但是我需要使用一个简单的文本字段.

red*_*rdo 5

要在表单中包含相关实体的字段,请为每个相关实体嵌入自定义表单类型.从理论上讲,可以在单个表单中显示和更新具有多个关系的复杂实体的所有数据.在实践中,为多个关系执行此操作可能会变得复杂,但对于一个关系来说却很简单.请参阅嵌入表单:在Symfony Forms文档中嵌入单个对象.

例如,在主实体的表单类型中:

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,
    ));
}
Run Code Online (Sandbox Code Playgroud)

然后在你的树枝上你可以添加你需要的字段,如下所示:

{{ form_widget(form.profile.surname) }}
{{ form_widget(form.country.name) }}
Run Code Online (Sandbox Code Playgroud)

假设您的ProfileType和CountryType在其表单中添加了其他字段,那么如果您在twig中使用"form_rest(form)",您将获得其他您不想要的字段,或者如果您不使用form_rest,则根据哪个symfony版本你正在使用你可能会得到错误.处理这个问题的方法不止一种.

我有时使用'form_widget(_token)'代替'form_rest(form)'来解决这个问题.但是,我不知道你是否可以依靠这种继续工作.您可以将"form_rest(form)"包装在隐藏的div中,因为它通常仅用于添加隐藏的"_token"字段,在这种情况下,您不希望看到其他"个人档案"和"国家/地区"字段.在这种情况下,隐藏的实体值仍然映射到表单并返回,具有任何相应的开销,但是值不能更改.

或者,您可以为"个人档案"和"国家/地区"实体提供多种表单类型,并使用相应的表单类型作为上下 我不知道你的表单是什么,但是,例如,你可能有EditThingProfileType和EditThingCountryType用于上面的buildForm()方法,每个只添加你在表单上需要的单个字段.