任务
对象到数据库是完全无关的主题形式。但是,如果你配置了任务
类通过教义被持久化(即你补充道映射元数据),然后坚持它在表单提交时可以做形式是有效的:
1 2 3 4 5 6 7
如果(美元形式- >isValid ()) {美元新兴市场=美元这- >getDoctrine ()- >getManager ();美元新兴市场- >persist (美元任务);美元新兴市场- >冲洗();返回美元这- >重定向(美元这- >generateUrl (“task_success”));}
如果出于某种原因,你没有访问你的原创美元的任务
对象,您可以获取它的形式:
1
美元任务=美元形式- >getData ();
有关更多信息,请参见教义ORM章。
关键的理解是,当表单绑定,提交的数据立即转移到底层对象。如果你想保存这些数据,你只需要持久化对象本身(已经包含提交的数据)。
ob娱乐下载Symfony使用模板来呈现每一种形式的一部分,等标签
标签,输入
标签,和其他所有错误消息。
在小枝,每个表单“片段”是由一块树枝。定制任何部分的形式呈现,你只需要覆盖适当的块。
在PHP中,每个表单呈现“片段”通过一个单独的模板文件。定制任何部分的形式呈现,你只需要覆盖现有的模板通过创建一个新的。
要理解这是如何工作的,定制的form_row
片段和添加一个类属性div
元素周围每一行。为此,创建一个新模板文件存储新的标记:
1 2 3 4 5 6 7 8 9 10
{# src / Acme / TaskBundle /资源/视图/形式/ fields.html。树枝#}{%块form_row %}{%没有余地的%}<div类=“form_row”>{{了form_label(形式)}}{{form_errors(形式)}}{{form_widget(形式)}}< /div>{%endspaceless%}{%endblockform_row %}
的form_row
表单片段是大多数字段通过渲染时使用form_row
函数。告诉组件使用你的新形式form_row
片段上面定义,添加以下的呈现形式的模板:
1 2 3 4 5 6
{# src / Acme / TaskBundle /资源/视图/ / new.html违约。树枝#}{%form_theme“AcmeTaskBundle:形式:fields.html形式。嫩枝' %}{%form_theme“AcmeTaskBundle:形式:fields.html形式。树枝“AcmeTaskBundle:形式:fields2.html。嫩枝' %}<形式…>
的form_theme
标签(嫩枝)“进口”定义的碎片在给定的模板,并使用它们在呈现表单。换句话说,当form_row
在这个模板函数被调用后,它将使用form_row
从自定义主题块(而不是默认的form_row
附带Symfony的块)。ob娱乐下载
自定义主题没有覆盖所有的块。在呈现一块不覆盖在您的自定义主题,主题引擎将回落到全球的主题(在包级别上定义)。
如果他们会提供了一些自定义主题搜索顺序列出之前回落全球主题。
定制表单的任何部分,你只需要覆盖适当的片段。知道哪些块或文件覆盖下一节的主题。
2.1
另一种理解语法form_theme
介绍了在2.1。它接受任何有效的树枝表达式(最明显的区别是使用数组在使用多个主题)。
1 2 3 4 5
{# src / Acme / TaskBundle /资源/视图/ / new.html违约。树枝#}{%form_theme形式与“AcmeTaskBundle:形式:fields.html。嫩枝' %}{%form_theme与[' AcmeTaskBundle:形式:fields.html形式。嫩枝”、“AcmeTaskBundle:形式:fields2.html。嫩枝']%}
更广泛的讨论,请参阅如何自定义形式呈现。
在PHP中,单个模板文件碎片。默认情况下它们位于资源/视图/形式
目录框架的包(GitHub观)。
每个片段名称遵循相同的基本模式分为两部分,由一个下划线字符(_
)。几个例子:
form_row
——使用form_row
呈现大多数字段;textarea_widget
——使用form_widget
呈现一个文本区域
字段类型;form_errors
——使用form_errors
为一个字段来呈现错误;每一个片段都遵循相同的基本模式:type_part
。的类型
部分对应的字段<新兴市场>类型新兴市场>(如被呈现。文本区域
,复选框
,日期
等)而部分
部分对应于<新兴市场>什么新兴市场>(如被呈现。标签
,小部件
,错误
等等)。默认情况下,可能有4<新兴市场>部分新兴市场>可呈现的形式:
标签 |
(如。了form_label )|显示字段的标签 |
|
小部件 |
(如。form_widget )|显示字段的HTML表示 |
|
错误 |
(如。form_errors )|显示字段的错误 |
|
行 |
(如。form_row )|渲染领域的整个行(标签、小部件和错误) |
请注意
实际上有3<新兴市场>部分新兴市场>- - - - - -- - - - - -- - - - - -- - - - - -- - - - - -- - - - - -行
,休息
,enctype
——但是你应该几乎从不需要担心覆盖它们。
通过了解字段类型(例如文本区域
),哪个部分你想定制(如。小部件
),您可以构建片段的名称需要覆盖(如。textarea_widget
)。
答案是:通过form_errors
片段。当Symfob娱乐下载ony呈现文本区域的错误类型,它看起来第一的textarea_errors
片段之前回下降form_errors
片段。每个字段类型都有<新兴市场>父新兴市场>类型(父类型的文本区域
是文本
,它的父形式
),Symfoob娱乐下载ny的片段使用父类型如果基本片段不存在。
因此,要覆盖的错误<新兴市场>只有新兴市场>文本区域
字段,复制form_errors
片段,重命名它textarea_errors
并定制它。覆盖默认的错误呈现<新兴市场>所有新兴市场>字段,复制和自定义form_errors
直接片段。
提示
“父”类型的每个字段类型是可用的表单类型引用每个字段类型。
好消息是,默认情况欧宝平台是合法的吗下,Symfony嵌入和验证CSRF令牌自动为你。ob娱乐下载这意味着您可以利用CSRF保护什么事情都不做。事实上,每个表单在本章利用CSRF保护!
CSRF保护是通过添加一个表单隐藏字段——调用_token
默认情况下,包含一个值,只有你和你的用户知道。这可以确保用户——而不是其他实体——提交给数据。ob娱乐下载Symfony自动验证这个令牌的存在和准确性。
的_token
字段是一个隐藏字段,如果包括会自动呈现form_rest ()
函数模板,它确保所有un-rendered字段输出。
CSRF令牌可以定制form-by-form基础上。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;类TaskType扩展AbstractType{/ /……公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“data_class”= >“Acme实体\ TaskBundle \ \任务”,“csrf_protection”= >真正的,“csrf_field_name”= >“_token”,/ /一个唯一键来帮助生成令牌的秘密“意图”= >“task_item”));}/ /……}
禁用CSRF保护,设置csrf_protection
选择错误的。也可以在您的项目在全球范围内的定制。有关更多信息,请参见形式配置参考部分。
请注意
的意图
选项是可选的但是,极大地增强了安全生成的令牌使它不同形式。
默认情况下,一种形式实际上假设您希望使用数组的数据,而不是一个对象。确切地说,有两种方法可以改变这一行为和领带表单对象而不是:
createFormBuilder
或第二个参数createForm
);data_class
选择表单。如果你<新兴市场>不新兴市场>做这两种,那么将返回一个数组的数据形式。在这个例子中,defaultData美元
不是一个对象(和没有data_class
选项设置),$形式- > getData ()
最终返回一个数组。
提示
您还可以访问后值(在本例中“名字”)直接通过请求对象,如下所示:
1
美元这- >get (“请求”)- >请求- >get (“名字”);
建议,然而,在大多数情况下使用getData()方法是一个更好的选择,因为它返回数据(通常是一个对象)在转换之后的形式框架。
data_class
选择表单或传递一个对象),这是几乎总是你想要使用的方法。看到验证为更多的细节。
但是如果你不绑定到一个对象,而不是检索一个简单的数组你提交的资料,如何约束添加到表单的数据吗?
答案是自己设置的约束,并附上个人领域。整体的方法是更多的覆盖验证章,但是这里有一个简单的例子:
2.1
的约束
选项,它接受一个单一的约束或一组约束(2.1之前,选择是validation_constraint
,只有接受一个约束)是Symfony 2.1新。ob娱乐下载
1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\验证器\约束\长度;使用ob娱乐下载\组件\验证器\约束\NotBlank;美元构建器- >add (“firstName”,“文本”,数组(“约束”= >新长度(数组(“最小值”= >3))))- >add (“姓”,“文本”,数组(“约束”= >数组(新NotBlank (),新长度(数组(“最小值”= >3)))));
提示
如果您使用的是验证组,需要引用默认的
集团在创建表单时,或一组正确的小组
你添加的约束。
1
新NotBlank (数组(“组织”= >数组(“创建”,“更新”))