如何嵌入一组形式
编辑该页面警告:你浏览的文档欧宝官网下载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_level
PHP设置,使用手工或渲染每个表单字段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>”>
另请参阅
如果你想定制的HTML代码原型,明白了如何处理形式的主题。
提示
的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功能:
任务
实体: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_level
PHP设置,使用手工或渲染每个表单字段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>”>
另请参阅
如果你想定制的HTML代码原型,明白了如何处理形式的主题。
提示
的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功能:
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>”>
另请参阅
如果你想定制的HTML代码原型,明白了如何处理形式的主题。
提示
的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功能: