如何嵌入一组形式

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

任务类,在相同的形式,你就可以编辑、创建和删除标签对象相关的任务。

我们首先创建一个任务实体:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31
/ / src /实体/ Task.php名称空间应用程序\实体;使用学说\常见的\集合\ArrayCollection;使用学说\常见的\集合\集合;任务{受保护的美元描述;受保护的美元标签;公共函数__construct(){美元- >标签=ArrayCollection ();}公共函数getDescription():字符串{返回美元- >描述;}公共函数setDescription(字符串美元描述):无效{美元- >描述=美元描述;}公共函数getTags():集合{返回美元- >标签;}}

请注意

ArrayCollection是特定于教条和类似于PHP数组,但提供了许多实用方法。

现在,创建一个标签类。正如您在上面看到的,任务可以有多个标签对象:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /实体/ Tag.php名称空间应用程序\实体;标签{私人美元的名字;公共函数getName():字符串{返回美元- >名称;}公共函数setName(字符串美元的名字):无效{美元- >name =美元的名字;}}

然后,创建一个类,这样一个形式标签对象由用户可以修改:

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

接下来,让我们创建一个表单任务实体,使用CollectionType领域的TagType形式。这将允许我们修改的所有标签的元素任务对在任务表单:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27日28
/ / src /形式/ TaskType.php名称空间应用程序\形式;使用应用程序\实体\任务;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\扩展\核心\类型\CollectionType;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;TaskType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项):无效{美元构建器- >add (“描述”);美元构建器- >add (“标签”,CollectionType::类,“entry_type”= > TagType::类,“entry_options”= > [“标签”= >)));}公共函数configureOptions(OptionsResolver美元解析器):无效{美元解析器- >setDefaults ([“data_class”= >任务::类,]);}}

在控制器中,您将创建一个新形式的TaskType:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39
/ / src /控制器/ TaskController.php名称空间应用程序\控制器;使用应用程序\实体\标签;使用应用程序\实体\任务;使用应用程序\形式\TaskType;使用ob娱乐下载\\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;TaskController扩展AbstractController{公共函数(请求美元请求):响应{美元任务=任务();/ /伪代码-一些示例标记添加到任务/ /(否则,模板将呈现一个空列表的标签)美元标签1=标签();美元标签1- >setName (“标签1”);美元任务- >getTags ()- >add (美元标签1);美元标签2=标签();美元标签2- >setName (标签2的);美元任务- >getTags ()- >add (美元标签2);/ /结束伪代码美元形式=美元- >createForm (TaskType::类,美元任务);美元形式- >handleRequest (美元请求);如果(美元形式- >isSubmitted () & &美元形式- >isValid ()) {/ /……表单处理、喜欢拯救任务和标签实体吗}返回美元- >呈现(“任务/ new.html.twig”,(“形式”= >美元形式- >createView ()));}}

模板中,您现在可以遍历的存在TagType形式呈现:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
{/任务/ new.html #模板。树枝#}{#……#}{{form_start(形式)}}{{form_row (form.description)}}<h3>标签< /h3><ul=“标签”>{%标签的形式。标签%}<>{{form_row (tag.name)}}< />{%endfor%}< /ul>{{form_end(形式)}}{#……#}

当用户提交表单时,提交的数据标签字段是用来构造一个ArrayCollection标签对象。然后设置集合标签场的任务并可以通过访问$任务- > getTags ()

到目前为止,这工作不错,但只有编辑现有的标签。它不允许我们添加新标签或删除现有的。

谨慎

你可以嵌入嵌套你喜欢收集尽可能多的水平下降。然而,如果您使用Xdebug,你可以收到“100”达到的最大函数嵌套级,流产!错误。为了解决这个问题,增加了xdebug.max_nesting_levelPHP设置,使用手工或渲染每个表单字段form_row ()而不是渲染整个形式(如form_widget(形式))。

allow_add选择:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /形式/ TaskType.php/ /……公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项):无效{/ /……美元构建器- >add (“标签”,CollectionType::类,“entry_type”= > TagType::类,“entry_options”= > [“标签”= >),“allow_add”= >真正的]);}

allow_add选择也让原型变量可用。这个“原型”有点“模板”,其中包含所需的所有HTML JavaScript动态创建任何新的“标签”形式。呈现的原型,添加以下data-prototype属性到现有的< ul >在你的模板:

1
<ul=“标签”data-prototype={{form_widget (form.tags.vars.prototype) | e (html_attr)}}>< /ul>

现在添加一个按钮的旁边< ul >动态添加一个新的标签:

1
<按钮类型=“按钮”=“add_item_link”data-collection-holder-class=“标签”>添加一个标签< /按钮>

在呈现页面,结果是这样的:

1
<ul=“标签”data-prototype=<< /span>div>< /span><< /span>标签类="< /span>要求"< /span>>< /span>__name__<< /span>/标签>< /span><< /span>div id ="< /span>task_tags___name__"< /span>>< /span><< /span>div>< /span><< /span>标签="< /span>task_tags___name___name"< /span>类="< /span>要求"< /span>>< /span>的名字<< /span>/标签>< /span><< /span>输入类型="< /span>文本"< /span>id ="< /span>task_tags___name___name"< /span>name ="< /span>任务[标记][__name__][名称]"< /span>要求="< /span>要求"< /span>最大长度="< /span>255年"< /span>/>< /span><< /span>/ div>< /span><< /span>/ div>< /span><< /span>/ div>< /span>”>

提示

form.tags.vars.prototype是一个表单元素,外观和感觉就像个人吗form_widget(标签)元素在你循环。这意味着您可以调用form_widget (),form_row ()了form_label ()在上面。你甚至可以选择只显示字段(例如的名字字段):

1
{{form_widget (form.tags.vars.prototype.name) | e}}

请注意

如果你使你的整个“标签”sub-form(如。form_row (form.tags)),data-prototype属性是自动添加到包含div,你需要相应地调整以下JavaScript。

现在添加一些JavaScript来读这个属性和动态添加新的标签形式当用户单击“添加一个标签”链接。这个示例使用jQuery并假设您已包括在您的页面(如使用Symfony的ob娱乐下载Webpack安可)。

添加一个<脚本>标签页面上的某个地方,包括所需的JavaScript功能: