sfForm
sfWidget
像隐藏表单的字段输入,文本输入,选择框,复选框。这一章向您介绍创建表单和管理表单字段使用symfony的形式框架。ob娱乐下载
ob娱乐下载Symfony 1.1需要遵循这本书的章节。您还需要创建一个项目和一个前端应用程序继续。有关更多信息,请参阅介绍在symfony项目创建。ob娱乐下载
前端
我们将开始通过添加一个联系人表单symfony应用程序。ob娱乐下载
图1 - 1显示了接触形式所看到的用户想要传达一个信息。
图1 - 1 -接触形式
这张表格,我们将创建三个字段:用户的名称,用户的电子邮件,用户想要发送的消息。我们将简单地显示信息为目的的形式提交这个练习如图1 - 2所示。
图1 - 2 -谢谢页面
图1 - 3 -应用程序和用户之间的交互
用户输入信息字段组成形式。在syob娱乐下载mfony中,是一个对象继承的一种形式sfForm类。在我们的示例中,我们将创建一个ContactForm类的继承sfForm类。
ContactForm
请注意
sfForm是所有形式的基类和便于管理表单的配置和生命周期。
你可以通过添加配置形式小部件使用配置()方法。
配置()
一个小部件代表一个表单字段。对于我们的形式的例子,我们需要添加三个小部件代表我们三个字段:的名字,电子邮件,消息。清单1显示了第一个实施ContactForm类。
的名字
电子邮件
消息
清单1 - 1 -ContactForm类三个字段
/ / lib /形式/ ContactForm.class.php类ContactForm扩展标识{公共函数配置(){这个美元- >setWidgets(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInputText(),“消息”= >新sfWidgetFormTextarea(),));}}
在这本书中,我们从来没有显示< ? php声明的代码示例中,只包含纯PHP代码优化空间和节省一些树木。显然你应该记得要把它当你创建一个新的PHP文件。
< ? php
小部件的定义配置()方法。自动调用此方法sfForm类的构造函数。
的setWidgets ()方法是用来定义小部件中使用的形式。的setWidgets ()方法接受一个关联数组的键字段名称和值是小部件对象。每个小部件是一个对象的继承sfWidget类。在这个例子中,我们使用两种类型的部件:
setWidgets ()
sfWidgetFormInputText
输入
sfWidgetFormTextarea
文本区域
作为一个惯例,我们存储表单类lib /形式/目录中。你可以将它们存储在任何目录管理的symfony半自动的机制,但稍后我们将看到,symfony使用ob娱乐下载lib /形式/从模型对象目录生成形式。
lib /形式/
我们现在已经准备好被使用的形式。我们现在可以创建一个symfony模块显ob娱乐下载示形式:
$ cd ~ /道路/ php symfony生成:美元/ /项目ob娱乐下载模块前端接触
在联系模块,让我们修改指数行动将表单实例传递给模板,如清单2所示。
联系
指数
清单1 - 2 -动作类的联系模块
/ /应用程序/前端/模块/ /行动/ actions.class.php联系类contactActions扩展sfActions{公共函数executeIndex(){这个美元- >形式=新ContactForm();}}
当创建一个表单,配置()方法,定义之前,将自动被称为。
我们现在只需要创建一个模板来显示表单,如清单3所示。
清单1 - 3 -模板显示表单
/ /应用程序/前端/模块/ /模板/ indexSuccess.php联系<表单动作=“< ?php echo url_for(“接触/提交”)? > "方法=“职位”> <表>< ? php回声美元的形式? >< tr > < td colspan =“2”> < input type =“提交”/ > < / td > < / tr > < /表> > < /形式
syob娱乐下载mfony的形式只处理小部件显示信息给用户。在indexSuccess模板,< ? php回声美元的形式? >行只显示三个字段。等其他元素形式标签和submit按钮需要由开发人员补充道。这看起来可能不明显,但在后面,我们将看到如果有用的和容易嵌入形式。
indexSuccess
< ? php回声美元的形式? >
形式
使用建设< ? php回声美元的形式? >当创建原型和定义形式是非常有用的。它允许开发人员能够专注于业务逻辑,而不用担心视觉方面。第三章将解释如何个性化模板和表单布局。
当显示一个对象使用< ? php回声美元的形式? >,PHP引擎会显示的文本表示美元的形式对象。将对象转换为一个字符串,PHP试图执行魔术方法__toString ()。每个小部件实现这个魔术方法将对象转换为HTML代码。调用< ? php回声美元的形式? >就相当于调用吗< ? php回声美元的形式- >__toString() ?>。
美元的形式
__toString ()
< ? php回声美元的形式- >__toString() ?>
我们可以看到在浏览器中表单(图1 - 4)和检查结果通过输入的地址行动联系/索引(/ frontend_dev.php /联系)。
联系/索引
/ frontend_dev.php /联系
图1 - 4,生成的联系形式
清单1 - 4显示了所生成的代码模板。
<形式行动=“/ frontend_dev.php /联系/提交”方法=“职位”><表>< !- - - - - -- - - - - -Beginning of generated code by - - >< tr >< th ><标签为=“名称”>的名字< / >标签< / th >< td ><输入类型=“文本”的名字=“名称”id=“名称”/>< / td >< / tr >< tr >< th ><标签为=“电子邮件”>电子邮件< / >标签< / th >< td ><输入类型=“文本”的名字=“电子邮件”id=“电子邮件”/>< / td >< / tr >< tr >< th ><标签为=“消息”>消息< / >标签< / th >< td ><文本区域行=“4”关口=“30”的名字=“消息”id=“消息”>textarea > < /< / td >< / tr >< !- - - - - -- - - - - -End of generated code by - - >< tr >< tdcolspan=“2”><输入类型=“提交”/>< / td >< / tr >< /表>> < /形式
我们可以看到,显示有三个< tr >行一个HTML表格。这就是为什么我们必须附上它<表>标签。每一行包含一个<标识>标签和标记(一种形式<输入>或textarea > <)。
< tr >
<表>
<标识>
<输入>
textarea > <
每个字段是自动生成的标签。默认情况下,标签是字段名称的转换后,后两个规则:一个大写首字母和下划线被空间所取代。如果字段的名称以“_id”后缀删除标签。
例子:
这个美元- >setWidgets(数组(“first_name”= >新sfWidgetFormInputText(),/ /生成标签:“名字”“last_name”= >新sfWidgetFormInputText(),/ /生成标签:“姓”“author_id”= >新sfWidgetFormInputText(),/ /生成标签:“作者”));
即使自动生成标签是非常有用的,该框架允许您定义个性化的标签setLabels ()方法:
setLabels ()
这个美元- >widgetSchema- >setLabels(数组(“名字”= >“你的名字”,“电子邮件”= >你的电子邮件地址的,“消息”= >你的信息的,));
你也可以只修改一个标签使用setLabel ()方法:
setLabel ()
这个美元- >widgetSchema- >setLabel(“电子邮件”,你的电子邮件地址的);
最后,我们将在第三章看到,您可以扩展标签从模板进一步定制表单。
侧边栏
小部件的模式
当我们使用setWidgets ()方法,symfoob娱乐下载ny创建一个sfWidgetFormSchema对象。这个对象是一个小部件,它允许你代表了一组小部件。在我们的ContactForm形式,我们称为方法setWidgets ()。它相当于以下代码:
sfWidgetFormSchema
这个美元- >setWidgetSchema(新sfWidgetFormSchema(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInputText(),“消息”= >新sfWidgetFormTextarea(),)));/ /几乎相当于:这个美元- >widgetSchema=新sfWidgetFormSchema(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInputText(),“消息”= >新sfWidgetFormTextarea(),));
的setLabels ()方法应用于一组小部件中widgetSchema对象。
widgetSchema
第五章中我们将看到“模式部件”概念更易于管理嵌入形式。
即使表单显示默认一个HTML表,可以改变布局格式。这些不同类型的布局格式定义在类继承sfWidgetFormSchemaFormatter。默认情况下,使用一种形式表中定义的格式sfWidgetFormSchemaFormatterTable类。您还可以使用列表格式:
sfWidgetFormSchemaFormatter
表
sfWidgetFormSchemaFormatterTable
列表
类ContactForm扩展标识{公共函数配置(){这个美元- >setWidgets(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInputText(),“消息”= >新sfWidgetFormTextarea(),));这个美元- >widgetSchema- >setFormFormatterName(“列表”);}}
这两种格式在默认情况下,在第五章我们将看到如何创建您自己的格式类。现在,我们知道如何显示一个表单,让我们看看如何管理提交。
当我们创建一个模板来显示一个表单,我们使用内部URL联系/提交在形式标签提交表单。我们现在需要添加提交行动联系模块。清单1 - 5展示了一个动作可以从用户和重定向到的信息谢谢你!页面,我们只显示该信息返回给用户。
联系/提交
提交
谢谢你!
清单1 - 5 -使用的提交行动联系模块
公共函数executeSubmit(美元的请求){这个美元- >forward404Unless(美元的请求- >isMethod(“职位”));美元的参数=数组(“名字”= >美元的请求- >getParameter(“名字”),“电子邮件”= >美元的请求- >getParameter(“电子邮件”),“消息”= >美元的请求- >getParameter(“消息”),);这个美元- >重定向(“接触/谢谢吗?”.http_build_query(美元的参数));}公共函数executeThankyou(){}/ /应用程序/前端/模块/ /模板/ thankyouSuccess.php联系< ul > <李>名称:< ? php回声sf_params美元- >得到(“名字”)李李? > < / > < >电子邮件:< ? php回声sf_params美元- >得到(“电子邮件”)李李? > < / > < >信息:< ? php回声sf_params美元- >得到(“消息”)李? > < / > < / ul >
http_build_query是一个内置的PHP函数,生成一个url编码的查询字符串数组的参数。
http_build_query
executeSubmit ()方法执行三个操作:
executeSubmit ()
出于安全原因,我们检查页面已提交使用HTTP方法帖子。如果不使用发送帖子方法的用户重定向到一个404页面。在indexSuccess模板,我们宣布提交方法帖子(<形式…方法= " POST " >):
帖子
<形式…方法= " POST " >
这个美元- >forward404Unless(美元的请求- >isMethod(“职位”));
接下来,我们得到用户输入的值来存储它们参数个数表:
参数个数
美元的参数=数组(“名字”= >美元的请求- >getParameter(“名字”),“电子邮件”= >美元的请求- >getParameter(“电子邮件”),“消息”= >美元的请求- >getParameter(“消息”),);
最后,我们将用户重定向到谢谢你页面(联系/谢谢)来显示他的信息:
联系/谢谢
这个美元- >重定向(“接触/谢谢吗?”.http_build_query(美元的参数));
将用户重定向到另一个页面,我们可以创建一个submitSuccess.php模板。虽然它是可能的,它是更好的实践总是重定向用户请求后帖子方法:
submitSuccess.php
这防止表单被提交如果用户重新加载页面谢谢。
用户也可以点击后退按钮不弹出再次提交表单。
提示
您可能已经注意到这一点executeSubmit ()不同于executeIndex ()。当调用这些方法symfony通过电流ob娱乐下载sfRequest对象作为第一个参数executeXXX ()方法。使用PHP,您不必收集所有参数,这就是为什么我们没有定义请求变量executeIndex ()因为我们不需要它。
executeIndex ()
sfRequest
executeXXX ()
请求
图1 - 5显示了工作流的方法来与用户进行交互。
图1 - 5 -工作流的方法
当重新显示用户输入的模板,我们运行的风险XSS攻击(跨站点脚本)。你可以找到更多的信息关于如何防止XSS风险通过实现一个逃避策略在视图层章“symfony的指南》的书。ob娱乐下载
提交表单后您现在应该看到从图1 - 6所示的页面。
图1 - 6页提交表单后显示
而不是创建参数个数数组,它将更容易获得信息从用户直接在一个数组。清单1 - 6修改的名字从窗口小部件的HTML属性存储的字段值联系数组中。
清单1 - 6 -修改的的名字从窗口小部件的HTML属性
类ContactForm扩展标识{公共函数配置(){这个美元- >setWidgets(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInputText(),“消息”= >新sfWidgetFormTextarea(),));这个美元- >widgetSchema- >setNameFormat(“接触(% s)”);}}
调用setNameFormat ()让我们修改的名字所有小部件的HTML属性。% s将自动取代了在生成表单的名称字段。例如,的名字属性将被联系(邮件)为电子邮件字段。PHP会自动创建一个数组的值包括请求联系(邮件)格式。通过这种方式,将可用的字段值联系数组中。
setNameFormat ()
% s
联系(邮件)
我们现在可以直接得到联系数组的请求对象,如清单1 - 7所示。
清单1 - 7 -新格式的的名字动作小部件的属性
公共函数executeSubmit(美元的请求){这个美元- >forward404Unless(美元的请求- >isMethod(“职位”));这个美元- >重定向(“接触/谢谢吗?”.http_build_query(美元的请求- >getParameter(“接触”)));}
当显示表单的HTML源代码,您可以看到,symfony已经产生了ob娱乐下载的名字属性不仅依赖字段名称和格式,但也是一个id属性。的id属性是自动创建的的名字属性由取代禁止字符下划线(_):
id
_
在这个例子中,我们使用两个动作管理形式:指数显示,提交提交。因为的形式显示得到方法和提交帖子方法,我们也可以合并的两个方法指数方法如清单1 - 8所示。
得到
清单1 - 8 -合并的两个动作中使用的形式
类contactActions扩展sfActions{公共函数executeIndex(美元的请求){这个美元- >形式=新ContactForm();如果(美元的请求- >isMethod(“职位”)){这个美元- >重定向(“接触/谢谢吗?”.http_build_query(美元的请求- >getParameter(“接触”)));}}}
你还需要改变形式行动属性indexSuccess.php模板:
行动
indexSuccess.php
<表单动作=“< ?php echo url_for(“接触/指数”)? > "方法=“职位”>
稍后我们将看到,我们更喜欢使用这个语法,因为它是短,使代码更连贯的和可以理解的。
如果一个网站是由几个站长,我们当然想添加一个下拉列表,主题以重定向消息据是什么要求(图1 - 7)。清单1 - 9增加了主题使用下拉列表sfWidgetFormSelect小部件。
主题
sfWidgetFormSelect
图1 - 7——添加一个主题表单字段
subject Field to the Form">
清单1 - 9——添加一个主题表单字段
类ContactForm扩展标识{受保护的静态美元的科目=数组(“主题”,“B”主题,“C”主题);公共函数配置(){这个美元- >setWidgets(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInputText(),“主题”= >新sfWidgetFormSelect(数组(“选择”= > self::美元的科目)),“消息”= >新sfWidgetFormTextarea(),));这个美元- >widgetSchema- >setNameFormat(“接触(% s)”);}}
的选择选择的sfWidgetFormSelect小部件
选择
PHP不作任何区别一个数组和一个关联数组,数组我们用于主题列表下面的代码是相同的:
美元的科目=数组(0= >“主题”,1= >“B”主题,2= >“C”主题);
以数组键为生成的小部件价值的属性选项标签,和相关的价值标签内容:
价值
选项
<选择name =“联系(主题)”id =“contact_subject”> <选项值=“0”> < /选项> <主题选项值=“1”>主题B < /选项> <选项值=“2”>主题C < /选项> < /选择>
为了改变价值属性,我们必须定义数组键:
美元的科目=数组(“一个”= >“主题”,“B”= >“B”主题,“C”= >“C”主题);
生成HTML模板:
<选择name =“联系(主题)”id =“contact_subject”> <选项值=“一个”> < /选项> <主题选项值=“B”>主题B < /选项> <选项值=“C”>主题C < /选项> < /选择>
的sfWidgetFormSelect小部件,像所有小部件,将选项列表作为第一个参数。一个选项可以强制或可选的。的sfWidgetFormSelect部件有一个强制性的选项,选择。这里有小部件我们已经使用的可用选项:
sfWidgetFormInput
类型
文本
is_hidden
假
多个
如果你想知道所有的选择一个小部件,您可以参考网上完整的API文档(欧宝官网下载app/ api / 1 _2 /)。所有的选项都是解释,以及附加选项的默认值。例如,所有的选项sfWidgetFormSelect这里是可用的:/ api / 1 _2 / sfWidgetFormSelect)。
每个小部件还需要一个列表的HTML属性作为第二个可选参数。这是非常有助于定义默认的HTML属性生成的表单标签。清单1显示了如何添加一个类属性的电子邮件字段。
类
清单1 - 10 -定义小部件的属性
emailWidget美元=新sfWidgetFormInputText(数组(),数组(“类”= >“电子邮件”));/ /生成的HTML< input type =“文本”name =“联系(邮件)”类=“电子邮件”id =“contact_email”/ >
HTML属性还允许我们覆盖自动生成的标识符,如清单1 - 11所示。
清单1 - 11 -覆盖id属性
emailWidget美元=新sfWidgetFormInputText(数组(),数组(“类”= >“电子邮件”,“id”= >“电子邮件”));/ /生成的HTML< input type =“文本”name =“联系(邮件)”类=“电子邮件”id =“电子邮件”/ >
甚至可以设置默认值使用的字段价值属性如清单1 - 12所示。
清单1 - 12 -通过HTML小部件的默认值的属性
emailWidget美元=新sfWidgetFormInputText(数组(),数组(“价值”= >“你的邮件在这里”));/ /生成的HTML< input type =“文本”name =“联系(邮件)”值=“你的邮件在这里”id =“contact_email”/ >
这个选项适用于输入小部件,但很难完成复选框或广播小部件,甚至是不可能的文本区域小部件。的sfForm类提供了特定的方法来定义每个字段的默认值为任何类型的部件以统一的方式。
复选框
广播
我们建议在模板定义的HTML属性而不是形式本身(即使是可能的)保护层分离,我们会在第三章。
通常是有用的为每个字段定义一个默认值。例如,当我们在字段显示帮助消息消失当用户关注的领域。清单1-13显示了如何通过定义默认值setDefault ()和setDefaults ()方法。
setDefault ()
setDefaults ()
清单1-13 -默认值的小部件通过setDefault ()和setDefaults ()方法
类ContactForm扩展标识{公共函数配置(){/ /……这个美元- >setDefault(“电子邮件”,“你的邮件在这里”);这个美元- >setDefaults(数组(“电子邮件”= >“你的邮件在这里”,“名字”= >“你的名字在这里”));}}
的setDefault ()和setDefaults ()方法是非常有用的定义相同的默认值相同的形式类的每个实例。如果我们想要使用一种修改现有对象,默认值取决于实例,因此他们必须是动态的。清单1 - 14显示了sfForm构造函数的第一个参数动态地设置默认值。
清单1 - 14 -小部件的默认值的构造函数sfForm
公共函数executeIndex(美元的请求){这个美元- >形式=新ContactForm(数组(“电子邮件”= >“你的邮件在这里”,“名字”= >“你的名字在这里”));/ /……}
保护XSS(跨站点脚本)
当设置为小部件的HTML属性,或定义默认值sfForm对XSS攻击类自动保护这些值在生成的HTML代码。这种保护并不依赖于escaping_strategy的配置settings.yml文件。如果内容已经被保护的另一种方法,保护将不会再被应用。
escaping_strategy
settings.yml
它也保护了”和”字符可能使生成的HTML。
”
这是一个例子的保护:
emailWidget美元=新sfWidgetFormInputText(数组(),数组(“价值”= >“你好“世界!”,“类”= >' <脚本> alert (" foo ") > < /脚本的,));/ /生成的HTML<输入值=“你好,世界!“”类=“& lt; script>警报(“foo") & lt; / script>”类型=“文本”name =“联系(邮件)”id =“contact_email”/ >
这项工作在Creative Commons许可Attribution-Share都3.0 Unported许可执照。