如何嵌入表单

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.1,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

如何嵌入表单

通常,您会希望构建一个包含来自许多不同对象的字段的表单。例如,注册表单可以包含属于用户对象以及许多地址对象。幸运的是,这可以通过Form组件实现。

嵌入单个对象

假设每一个任务属于类别对象。首先创建类别对象:

12 3 4 5 6 7 8 9 10 11 12
/ / src /实体/ Category.php名称空间应用程序实体使用欧宝娱乐app下载地址组件验证器约束作为断言类别/ * * *@Assert\ NotBlank * /公共的名字;}

接下来,添加一个new类别属性任务类:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/ /……任务/ /……/ * * *@Assert\ \类型(Type = " App \实体类别”)*@Assert有效\ * /受保护的类别/ /……公共函数getCategory():哦?类别返回->类别;}公共函数setCategory(?类别类别->类别=类别;}}

提示

有效的约束已添加到属性类别.这将验证级联到相应的实体。如果省略此约束,则不会验证子实体。

现在您的应用程序已经被更新以反映新的需求,创建一个表单类以便a类别对象可以被用户修改:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
/ / src /形式/ CategoryType.php名称空间应用程序形式使用应用程序实体类别使用欧宝娱乐app下载地址组件形式AbstractType使用欧宝娱乐app下载地址组件形式FormBuilderInterface使用欧宝娱乐app下载地址组件OptionsResolverOptionsResolverCategoryType扩展AbstractType公共函数buildForm(FormBuilderInterface构建器数组,选项无效构建器->add (“名字”);}公共函数configureOptions(OptionsResolver解析器无效解析器->setDefaults ([“data_class”= >类别::类,]);}}

最终目标是允许类别任务在任务表单本身内部进行修改。要完成此操作,请添加类别字段到TaskType对象,其类型为new的实例CategoryType类:

1 2 3 4 5 6 7 8 9
使用应用程序形式CategoryType使用欧宝娱乐app下载地址组件形式FormBuilderInterface公共函数buildForm(FormBuilderInterface构建器数组,选项无效/ /……构建器->add (“类别”, CategoryType::类);}

田野从CategoryType现在可以和那些来自TaskType类。

呈现类别与原字段相同任务字段:

1 2 3 4 5 6 7 8
{#……#}<h3>类别h3><div“类别”>{{form_row(form.category.name)}}div>{#……#}

当用户提交表单时,提交的数据为类别字段用于构造的实例类别,然后设置在类别字段任务实例。

类别实例可以通过任务- > getCategory ()并且可以持久化到数据库中,或者根据需要任意使用。

嵌入一个表单集合

您还可以将一组表单嵌入到一个表单中(想象一个类别Form with many产品体)。这是通过使用集合字段类型。

有关更多信息,请参阅如何嵌入一个集合的形式文章和CollectionType参考。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。