第十章——形式
在编写模板时,开发人员的大部分时间致力于形式。尽管如此,形式一般设计不良。自从关注需要处理的默认值,格式,验证,重新群体,并形成处理一般来说,一些开发人员倾向于浏览过程中一些重要的细节。因此,symfony将特别ob娱乐下载关注这个话题。本章描述了自动化的工具,许多这些要求而加速发展形式:
- 助手形式提供一种更快的方式写在模板表单输入,特别是对于复杂的元素,如日期、下拉列表、富文本。
- 当一种致力于编辑对象的属性、使用对象形式的模板可以进一步加速帮手。
- YAML文件便于表单验证和重新验证。
- 验证器包所需的代码来验证输入。ob娱乐下载Symfony包验证器最常见的需求,很容易添加自定义验证器。
形式助手
模板的HTML标记的表单元素经常混有PHP代码。形式助手symfony旨在简化这ob娱乐下载个任务,避免开放< ? php回声
标签中反复<输入>
标签。
主要形式标记
如前一章解释,你必须使用form_tag ()
助手创建一个表单,因为它将行动作为一个参数转换成URL路由。第二个参数可以支持更多的选项——例如,改变默认的方法
改变默认的enctype
,或者指定其他属性。清单1显示了示例。
清单10 - 1 -form_tag ()
助手
< ? php回声form_tag(“测试/保存”)? >= = > <形式方法“职位”action =“/道路/ /保存”>< ? php回声form_tag(“测试/保存”,的方法=得到多部分= true类= simpleForm ')? >= = > <形式方法“获得”enctype =“多部分/格式”类=“simpleForm”action =“/道路/ /保存”>
因为没有需要关闭辅助形式,您应该使用HTML> < /形式
标签,即使它不好看你的源代码。
标准的表单元素
与帮手,每个元素的形式给出一个id属性推导出从其名称默认属性。这不是唯一有用的约定。参见清单10 - 2标准形式的完整列表助手和他们的选择。
清单10 -标准形式助手语法
/ /文本框(输入)< ? php回声input_tag(“名字”,“默认值”)? >= > < input type =“文本”name =“名称”id =“名称”值=“默认值”/ >/ /所有形式助手接受额外的选项参数/ /它允许您自定义属性添加到生成的标签< ? php回声input_tag(“名字”,“默认值”,的最大长度= 20)? >= > < input type =“文本”name =“名称”id =“名称”值=“默认值”最大长度=“20”/ >/ /长文本字段(文本区域)< ? php回声textarea_tag(“名字”,“默认内容”,的大小= 10 x20的”)? >textarea name = = > <“名称”id =“名称”关口=“10”行=“20”>默认的内容textarea > < // /复选框< ? php回声checkbox_tag(“单一”,1,真正的)? >< ? php回声checkbox_tag(“driverslicense”,“B”,假)? >= > < input type =“复选框”name =“单身”id =“单身”值=“1”检查=“检查”/ > < input type =“复选框”name =“driverslicense”id =“driverslicense”值=“B”/ >/ /单选按钮< ? php回声radiobutton_tag(“身份”[],“value1”,真正的)? >< ? php回声radiobutton_tag(“身份”[],“value2”,假)? >= > < input type =“广播”name =“[]”状态id =“status_value1”值=“value1”检查=“检查”/ > < input type =“广播”name =“[]”状态id =“status_value2”值=“value2”/ >/ /下拉列表(选择)< ? php回声select_tag(“付款”,' <选项选择= "选择" > < /选项> <选项>欧洲信用卡签证< /选项> <选项>万事达> < /选项”)? >= = > <选择名称“付款”id =“付款”=,> <选项被选中“选择”签证< / >选项> <选项>欧洲信用卡< /选项> <选项>万事达< /选项> < /选择>/ /选择标记的选项列表< ? php回声options_for_select(数组(“签证”,“欧洲信用卡”,“万事达”),0)? >= = > <期权价值“0”选择=“选择”> < /选项> <选项值=签证“1”>欧洲信用卡< /选项> <选项值=“2”>万事达< /选项>/ /下拉辅助结合选项的列表< ? php回声select_tag(“付款”,options_for_select(数组(“签证”,“欧洲信用卡”,“万事达”),0))? >= = > <选择名称“付款”id =“付款”> <选项值=“0”选择=“选择”> < /选项> <选项值=签证“1”>欧洲信用卡< /选项> <选项值=“2”万事达卡< / >选项> < /选择>/ /指定选项名称,使用一个关联数组中< ? php回声select_tag(“名字”,options_for_select(数组(“史蒂夫。”= >“史蒂夫。”,“鲍勃”= >“鲍勃”,“阿尔伯特”= >“阿尔伯特”,“伊恩”= >“伊恩”,“巴克”= >“巴克”),“伊恩”))? >= = > <选择名称“名称”id =“名称”> <选项值=“史蒂夫。”>史蒂夫。< /选项> <选项值=“Bob”鲍勃< / >选项> <选项值=“阿尔伯特”艾伯特> < /选项> <选项值=“伊恩”选择=“选择”Ian < / >选项> <选项值=“巴克”巴克> < /选项> < /选择>/ /下拉列表中有多个选择(选择的值可以是一个数组)< ? php回声select_tag(“付款”,options_for_select(数组(“签证”= >“签证”,“欧洲信用卡”= >“欧洲信用卡”,“万事达”= >“万事达”),数组(“签证”,“万事达”),),数组(“多”= >真正的)))? >= = > <选择名称“[]”付款id =“付款”多个=“多”> <选项值=“签证”选择=“选择”> < /选项> <选项值=签证“欧洲信用卡”>欧洲信用卡< /选项> <选项值=“万事达”万事达卡< / >选项> < /选择>/ /下拉列表中有多个选择(选择的值可以是一个数组)< ? php回声select_tag(“付款”,options_for_select(数组(“签证”= >“签证”,“欧洲信用卡”= >“欧洲信用卡”,“万事达”= >“万事达”),数组(“签证”,“万事达”)),“多=多”)? >= = > <选择名称“[]”付款id =“付款”多个=“多”> <选项值=“签证”选择=“选择”> < /选项> <选项值=签证“欧洲信用卡”>欧洲信用卡< /选项> <选项值=“万事达”选择=“选择”万事达卡< / >选项> < /选择>/ /上传文件< ? php回声input_file_tag(“名字”)? >= > < input type =“文件”name =“名称”id =“名称”值=”“/ >/ /密码字段< ? php回声input_password_tag(“名字”,“价值”)? >= > < input type =“密码”name =“名称”id =“名称”值=“价值”/ >/ /隐藏字段< ? php回声input_hidden_tag(“名字”,“价值”)? >= > < input type =“隐藏”name =“名称”id =“名称”值=“价值”/ >/ /提交按钮(文本)< ? php回声submit_tag(“保存”)? >= > < input type =“提交”name =“提交”值=“保存”/ >/ /提交按钮(如图片)< ? php回声submit_image_tag(“submit_img”)? >= > < input type =“图像”name =“提交”src =“遗产/图片/ submit_img.png”/ >
的submit_image_tag ()
辅助使用相同的语法和相同的优势image_tag ()
。
请注意
对于单选按钮,id
属性没有设置默认的值的名字
属性,但名称和值的组合。那是因为你需要几个单选按钮标签具有相同名称的获取自动”切换时,前一个项目选择另一个“功能,以及id =名称
大会将意味着有几个相同的HTML标记id
在页面属性,这是严格禁止的。
侧边栏
处理表单提交
你如何检索用户通过表单提交的数据吗?它可以在请求参数,所以只需要调用的动作$ this - > getRequestParameter (elementName美元)
得到的值。
一个良好的实践是使用相同的操作来显示和处理形式。根据请求方法(GET或POST),调用表单模板或表单处理和请求重定向到另一个动作。
/ /在mymodule里/动作/ actions.class.php公共函数executeEditAuthor(){如果(这个美元- >getRequest()- >getMethod()! = sfRequest::帖子){/ /显示表单返回sfView::成功;}其他的{/ /处理表单提交美元的名字=这个美元- >getRequestParameter(“名字”);…这个美元- >重定向(“mymodule里/ anotheraction”);}}
为此,目标必须是相同的动作形式显示。
/ / / editAuthorSuccess.php mymodule里/模板< ? php回声form_tag(“mymodule里/ editAuthor”)? >…
ob娱乐下载Symfony提供了特殊形式在后台异步请求帮助。下一章,重点是Ajax,提供更多的细节。
日期输入小部件
表单通常用于检索日期。日期错了格式的表单提交失败的主要原因。的input_date_tag ()
助手可以帮助用户输入一个日期与交互式JavaScript日历,如果你设置丰富的
选项真正的
,如图1所示。
图10 - 1——丰富的日期输入标签
如果丰富的
选择是省略了,三个助手的回声<选择>
标签填充的月、日、年。您可以显示出这些菜单分别通过调用他们的助手(select_day_tag ()
,select_month_tag ()
,select_year_tag ()
)。这些元素的默认值是当前天,月,年。清单三显示了输入日期的帮手。
清单三-输入日期的帮手
< ? php回声input_date_tag(“dateofbirth”,“2005-05-03”,“富= true”)? >= >文本输入标签一起日历小部件/ /下面的助手要求DateForm助手组< ? phpuse_helper(“DateForm”)? >< ? php回声select_day_tag(“天”,1,“include_custom =选择一天')? >= = > <选择名称“天”id =“天”> <选项值=”“>选择一天< /选项> <选项值=“1”选择=“选择”>01< /选项> <选项值=“2”>02< /选项>…<选项值=“31”>31日< /选项> < /选择>< ? php回声select_month_tag(“月”,1,“include_custom =一个月选择use_short_month = true”)? >= = > <选择名称“月”id =“月”> <选项值=”“> < /选项> <选项值选择一个月=“1”选择=“选择”Jan < / >选项> <选项值=“2”> < /选项> 2月…<选项值=“12”> < /选项> < /选择> 12月< ? php回声select_year_tag(“年”,2007年,“include_custom =一年选择year_end = 2010”)? >= = > <选择名称“年”id =“年”> <选项值=”“>选择< /选项> <选项值=“2006”>2006年< /选项> <选项值=“2007”选择=“选择”>2007年< /选项>…< /选择>
接受日期值input_date_tag ()
助手是认可的strtotime ()
PHP函数。清单身手显示格式可以使用,尤其和清单已经显示了必须避免的。
清单身手——尤其接受日期格式的日期帮手
/ /正常工作< ? php回声input_date_tag(“测试”,“2006-04-01”,“富= true”)? >< ? php回声input_date_tag(“测试”,1143884373,“富= true”)? >< ? php回声input_date_tag(“测试”,“现在”,“富= true”)? >< ? php回声input_date_tag(“测试”,2005年10月23日的,“富= true”)? >< ? php回声input_date_tag(“测试”,下周二的,“富= true”)? >< ? php回声input_date_tag(“测试”,“1周2天4小时2秒”,“富= true”)? >/ /返回null< ? php回声input_date_tag(“测试”,零,“富= true”)? >< ? php回声input_date_tag(“测试”,”,“富= true”)? >
清单已经-不正确的日期格式的日期帮手
/ / 0 = 01/01/1970日期< ? php回声input_date_tag(“测试”,0,“富= true”)? >/ /非英语日期格式不工作< ? php回声input_date_tag(“测试”,“01/04/2006”,“富= true”)? >
富文本编辑
富文本编辑也是可能的textarea > <
标签,由于TinyMCE的集成和FCKEditor的小部件。他们提供一个word-processor-like界面按钮格式文本加粗,斜体,和其他风格,如图10所示。
图10 - 2 -富文本编辑
小部件都需要手动安装。两个小部件的过程是一样的,只有这里描述的TinyMCE富文本编辑。你需要下载编辑从项目网站(http://tinymce.moxiecode.com/),打开它在一个临时文件夹中。复制tinymce / jscript / tiny_mce /
目录到您的项目web / js /
目录,并定义库的路径settings.yml
如清单10 - 6所示。
清单10 - 6 -设置TinyMCE库路径
:.settings: rich_text_js_dir: js / tiny_mce
一旦做出了选择,切换使用富文本编辑的文本区域添加有钱= true
选择。您还可以指定自定义选项使用JavaScript编辑器tinymce_options
选择。清单10 - 7显示结果示例。
清单10 - 7,结果富文本区域
< ? php回声textarea_tag(“名字”,“默认内容”,有钱= = 10 x20的真实规模的)? >= >一个富文本编辑区由TinyMCE< ? php回声textarea_tag(“名字”,“默认内容”,“富= = 10 x20的tinymce_options真实规模=语言:“fr”, theme_advanced_buttons2:“分隔符”)? >= >一个富文本编辑区由TinyMCE使用自定义参数
国家和语言选择
你可能需要显示一个国家选择字段。但由于国家名字在所有语言中是不一样的,一个国家下拉列表的选项应根据用户不同文化(参见第13章关于文化的更多信息)。见清单可达的select_country_tag ()
助手为你做这一切:它国际化的国家名称和使用的标准ISO国家代码值。
清单可达-标记辅助选择的国家
< ? php回声select_country_tag(“国家”,“基地”)? >= = > <选择名称“国家”id =“国家”> <选项值=“对焦”阿富汗> < /选项> <选项值=“基地”选择=“选择”阿尔巴尼亚> < /选项> < =选项值“DZ”阿尔及利亚< / >选项> <选项值=”为“>美属萨摩亚< /选项>…
类似于select_country_tag ()
助手,select_language_tag ()
辅助显示语言的列表,如清单9所示。
清单9 -标记辅助选择语言
< ? php回声select_language_tag(“语言”,“en”)? >= = > <选择名称“语言”id =“语言”>……<选项值=“elx”>埃兰人< /选项> <选项值=“en”选择=“选择”> < /选项> <选项值=英语“运用”>英语,中间(1100年-1500年)< /选项> <选项值=“和”>英语,老(ca之中-1100年)< /选项> <选项值=“myv”> Erzya < /选项> <选项值=“光电”>世界语< /选项>…
形式帮助的对象
当表单元素被用来编辑对象的属性,标准链接助手可以成为乏味的写。例如,编辑电话
属性的客户
对象,你会写这个:
< ? php回声input_tag(“电话”,美元的客户- >getTelephone())? >= > < input type =“文本”name =“电话”id =“电话”值=“0123456789”/ >
为了避免重复属性名称,symfony提供了另一种对象形式为每个表单辅助帮手。ob娱乐下载辅助对象形式推导出一个表单元素的名称和默认值从一个对象和方法名称。前面的input_tag ()
等价于:
< ? php回声object_input_tag(美元的客户,“getTelephone”)? >= > < input type =“文本”name =“电话”id =“电话”值=“0123456789”/ >
经济可能不会显得至关重要object_input_tag ()
。然而,每一个标准形式的助手都有相应的辅助对象形式,他们都共享相同的语法。它使一代的形式非常简单。这就是为什么助手对象形式广泛用于生成的脚手架和政府(见第14章)。清单的真空度列出对象形式的帮手。
清单的真空度-助手对象形式语法
< ? php回声object_input_tag(美元的对象,美元的方法,选择美元)? >< ? php回声object_input_date_tag(美元的对象,美元的方法,选择美元)? >< ? php回声object_input_hidden_tag(美元的对象,美元的方法,选择美元)? >< ? php回声object_textarea_tag(美元的对象,美元的方法,选择美元)? >< ? php回声object_checkbox_tag(美元的对象,美元的方法,选择美元)? >< ? php回声object_select_tag(美元的对象,美元的方法,选择美元)? >< ? php回声object_select_country_tag(美元的对象,美元的方法,选择美元)? >< ? php回声object_select_language_tag(美元的对象,美元的方法,选择美元)? >
没有object_password_tag ()
助手,因为它是一个糟糕的做法给密码标记一个默认值,基于用户之前输入的东西。
谨慎
与常规形式助手,只有当你声明对象形式助手可以显式地使用对象
辅助组织在你的模板use_helper(对象)
。
最有趣的所有对象形式的帮手objects_for_select ()
和object_select_tag ()
关注下拉列表。
填充下拉列表对象
的options_for_select ()
助手,前面描述的与其他标准的帮手,将一个PHP关联数组转换成一个选项列表,如清单10 - 11所示。
清单10 - 11 -基于数组创建一个选项列表options_for_select ()
< ? php回声options_for_select(数组(' 1 '= >“史蒂夫。”,' 2 '= >“鲍勃”,“3”= >“阿尔伯特”,“4”= >“伊恩”,“5”= >“巴克”),4)? >= = > <期权价值“1”>史蒂夫。< /选项> <选项值=“2”鲍勃< / >选项> <选项值=“3”艾伯特> < /选项> <选项值=“4”选择=“选择”Ian < / >选项> <选项值=“5”巴克> < /选项>
假设您已经有一个对象数组的类作者
查询,结果从一个推动。如果你想建立一个基于这个数组列表的选项,您将需要循环检索id
和的名字
每个对象,如清单10 - 12所示。
清单10 - 12 -创建一个选项列表基于一个对象数组options_for_select ()
/ /在行动选择美元=数组();foreach(美元的作者作为美元的作者){选择美元(美元的作者- >getId()]=美元的作者- >getName();}这个美元- >选项=选择美元;/ /模板中< ? php回声options_for_select(选择美元,4)? >
这种处理经常发生,symfony辅助自动化:ob娱乐下载objects_for_select ()
,创建一个选项列表直接基于一个对象数组。助手需要两个额外的参数:检索使用的方法名称价值
的文本内容<选项>
标签生成。所以清单10 - 12相当于这个简单的形式:
< ? php回声objects_for_select(美元的作者,“getId”,getName的,4)? >
这是智能和快速,但symfony走进一步,当你处理外键ob娱乐下载列。
基于外键列创建一个下拉列表
一个外键列的值可以是外国表记录的主键值。例如,如果文章
表有一个author_id
的外键列作者
表,本专栏的可能值id
所有的记录作者
表。基本上,一个下拉列表编辑一篇文章的作者将如清单13所示。
清单10 - 13 -创建一个选项列表基于外键objects_for_select ()
< ? php回声select_tag(“author_id”,objects_for_select(AuthorPeer::doSelect(新标准()),“getId”,“__toString”,美元的文章- >getAuthorId()))? >= = > <选择名称“author_id”id =“author_id”> <选项值=“1”>史蒂夫。< /选项> <选项值=“2”鲍勃< / >选项> <选项值=“3”艾伯特> < /选项> <选项值=“4”选择=“选择”Ian < / >选项> <选项值=“5”巴克> < /选项> < /选择>
的object_select_tag ()
所有这本身。它显示一个下拉列表填充的名称可能的外国表的记录。助手可以猜到的外国和外国列的表模式,所以它的语法非常简洁。清单13是相当于:
< ? php回声object_select_tag(美元的文章,“getAuthorId”)? >
的object_select_tag ()
辅助猜测相关同行类名(AuthorPeer
在示例中)根据方法名作为参数传递。不过,您可以指定您自己的类通过设置related_class
第三个参数的选择。的文本内容<选项>
标签是记录名称,它的结果__toString ()
(如果方法的对象类$ - > __toString作者()
方法定义,使用主键)。此外,从doSelect选项列表中建立()方法和一个空的标准价值;它返回所有记录命令创建日期。如果你喜欢只显示与特定的顺序记录的一个子集,在同行类创建一个方法返回这个选择一个对象数组,并设置它的peer_method
选择。最后,您可以添加一个空白选项或一个自定义选项下拉列表的顶部通过设置include_blank和include_custom选项。清单10 - 14演示了这些不同的选项object_select_tag ()
帮手。
清单10 - 14 -选项的object_select_tag ()
助手
/ /基本语法< ? php回声object_select_tag(美元的文章,“getAuthorId”)? >/ /构建列表从AuthorPeer: doSelect(新标准())/ /改变同行类用于检索可能值< ? php回声object_select_tag(美元的文章,“getAuthorId”,“related_class = Foobar”)? >/ /构建列表从FoobarPeer: doSelect(新标准())/ /改变对等方法用于检索可能值< ? php回声object_select_tag(美元的文章,“getAuthorId”,“peer_method = getMostFamousAuthors”)? >/ /构建列表从AuthorPeer: getMostFamousAuthors(新标准())// Add an at the top of the list< ? php回声object_select_tag(美元的文章,“getAuthorId”,“include_blank = true”)? >/ /添加一个<选项值= " " > < /选项>作者选择一个列表的顶部< ? php回声object_select_tag(美元的文章,“getAuthorId”,“include_custom =选择作者”)? >
更新对象
形式完全致力于编辑对象属性通过使用对象帮手更容易处理的行动。例如,如果你有一个类的对象作者
与的名字
,年龄
,地址
属性表单可以被编码为清单10 - 15所示。
清单10 - 15 -只有一种形式对象帮手
< ? php回声form_tag(“作者/更新”)? >< ? php回声object_input_hidden_tag(美元的作者,“getId”)? >名称:< ? php回声object_input_tag(美元的作者,getName的)? > < br / >年龄:< ? php回声object_input_tag(美元的作者,“getAge”)? > < br / >地址:< br / >< ? php回声object_textarea_tag(美元的作者,“getAddress”)? >> < /形式
的更新
行动的作者
模块,在表单提交时调用,可以简单地更新的对象fromArray ()
推动生成的修饰符,如清单10到16所示。
清单10到16 -处理表单提交基于对象形式的帮手
公共函数executeUpdate(){美元的作者= AuthorPeer::retrieveByPk(这个美元- >getRequestParameter(“id”));这个美元- >forward404Unless(美元的作者);美元的作者- >fromArray(这个美元- >getRequest()- >getParameterHolder()- >getAll(),BasePeer::TYPE_FIELDNAME);美元的作者- >保存();返回这个美元- >重定向(“/作者/显示? id =”。美元的作者- >getId());}
表单验证
第六章解释了如何使用validateXXX ()
action类中的方法来验证请求参数。然而,如果你使用这种技术来验证表单提交,您将编写同样的部分代码。ob娱乐下载Symfony提供了一种替代方法表单验证技术,仅依靠YAML文件,而不是操作类的PHP代码。
展示表单验证特性,我们首先考虑清单- 17中所示的示例表单。它是一个典型的接触形式,的名字
,电子邮件
,年龄
,消息
字段。
清单- 17 -样品接触形式,模块/ /模板/ indexSuccess.php联系
< ? php回声form_tag(“接触/发送”)? >名称:< ? php回声input_tag(“名字”)? > < br / >电子邮件:< ? php回声input_tag(“电子邮件”)? > < br / >年龄:< ? php回声input_tag(“年龄”)? > < br / >信息:< ? php回声textarea_tag(“消息”)? > < br / >< ? php回声submit_tag()? >> < /形式
表单验证的原则是,如果一个用户输入无效的数据和提交表单,下一个页面应该显示一条错误消息。让我们定义有效数据示例形式,应该是用浅显的英语:
- 的
的名字
字段是必需的。它必须是一个文本输入2到100个字符。 - 的
电子邮件
字段是必需的。它必须是一个文本输入2到100个字符,并且必须是一个有效的电子邮件地址。 - 的
年龄
字段是必需的。它必须是一个0到120之间的整数。 - 的
消息
字段是必需的。
你可以联系表单定义更复杂的验证规则,但这些只是好示范验证的可能性。
请注意
表单验证可以发生在服务器端或在客户端。服务器端验证是强制性的,以避免损坏数据库错误数据。客户端验证是可选的,尽管它大大提高了用户体验。客户端验证是要做定制的JavaScript。
验证器
你可以看到的名字
和电子邮件
领域共同验证规则的例子。一些验证规则经常出现在web表单,symfony包PHP代码实现验证器。ob娱乐下载一个验证器是提供了一个简单的类execute ()
方法。这种方法将一个字段的值作为参数,并返回真正的
如果该值是有效的假
否则。
ob娱乐下载Symfony附带几个验证器(“标准Symfony验证器”一节中描述的在本章后面),但是让我们关注sfStringValidator
现在。这个验证器检查输入一个字符串,它的大小是在两个指定的字符数量(当调用定义初始化()
方法)。这正是需要验证的名字
字段。清单10 - 18显示了如何使用这个验证器验证方法。
清单10 - 18 -验证请求参数与可重用的验证器,模块/ /行动/ actions.class.php联系
公共函数validateSend(){美元的名字=这个美元- >getRequestParameter(“名字”);/ / name字段是必需的如果(!美元的名字){这个美元- >getRequest()- >setError(“名字”,‘name字段不能留空);返回假;}/ / name字段必须是文本输入2到100个字符myValidator美元=新sfStringValidator();myValidator美元- >初始化(这个美元- >getContext(),数组(“最小值”= >2,“min_error”= >这名字太短(2字符最低)”,“马克斯”= >One hundred.,“max_error”= >”这个名字太长了。(最大100个字符),));如果(!myValidator美元- >执行(美元的名字,美元的错误)){返回假;}返回真正的;}
如果用户提交表单清单- 17与价值一个
在的名字
场,execute ()
的方法sfStringValidator
将返回假
(因为字符串长度小于最小的两个字符)。的validateSend ()
方法将失败,handleErrorSend ()
方法将调用的executeSend ()
方法。
提示
的setError ()
的方法sfRequest
类提供信息模板,以便它可以显示一个错误消息(如前所”形式显示错误消息“在本章后面的一节)。验证器内部设置错误,所以您可以定义不同的错误nonvalidation的不同情况。的目的min_error
和max_error
初始化参数sfStringValidator
。
所有的规则中定义的例子可以转化为验证器:
的名字
:sfStringValidator
(min = 2
,max = 100
)电子邮件
:sfStringValidator
(min = 2
,max = 100
),sfEmailValidator
年龄
:sfNumberValidator
(最小值= 0
,max = 120
)
一个字段是必需的,并不是由一个验证器。
验证文件
您可以很容易地实现与验证器联系表单的验证validateSend ()
方法,但这意味着重复大量的代码。ob娱乐下载Symfony提供了另一种方式来定义验证规则形式,它包括YAML。例如,清单10 - 19所示的翻译名称字段验证规则,和它的结果是等价的清单10 - 18。
清单10 - 19,验证文件模块/ /验证/ send.yml联系
字段:名称:要求:味精:name字段不能留空sfStringValidator:分钟:2 min_error:这个名字太短(2字符最低)马克斯:100 max_error:这个名字太长了。(最大100个字符)
验证文件,字段
标题列表的字段需要确认,如果他们需要,应该测试的验证器的时候存在一个值。每一个验证器的参数是一样的那些您将使用手动初始化验证器。一个字段可以被尽可能多的验证器验证的必要。
请注意
验证过程并不能阻止当一个验证器失败。ob娱乐下载Symfony测试所有的验证器和声明验证失败如果至少有一个人失败了。即使一些验证规则文件失败,symfony仍将寻找一个ob娱乐下载validateXXX ()
方法和执行它。所以两个验证技术是互补的。的优势是,在形式与多个失败,显示所有的错误消息。
验证文件位于模块验证/
目录和命名的行动必须验证。例如,清单10 - 19必须存储在一个文件中验证/ send.yml
。
重新显示表单
默认情况下,symfonob娱乐下载y查找handleErrorSend ()
方法在action类时验证过程失败,或显示sendError.php
如果这个方法不存在的模板。
通常的方式通知用户验证失败再次显示形式与一条错误消息。这个目的,你需要覆盖handleErrorSend ()
方法和结束它重定向到行动显示表单(在这个例子中,模块/索引
),如清单20所示。
清单10 - 20 -显示形式,模块/联系/动作/ actions.class.php
类ContactActions扩展sfActions{公共函数executeIndex(){/ /显示表单}公共函数handleErrorSend(){这个美元- >向前(“接触”,“指数”);}公共函数executeSend(){/ /处理表单提交}}
如果您选择使用相同的操作来显示表单并处理表单提交,然后handleErrorSend ()
方法可以返回sfView:成功
重新显示表单sendSuccess.php
,见清单10-21。
清单10-21 -一个行动来显示和处理形式,模块/联系/动作/ actions.class.php
类ContactActions扩展sfActions{公共函数executeSend(){如果(这个美元- >getRequest()- >getMethod()! = sfRequest::帖子){/ /准备数据模板/ /显示表单返回sfView::成功;}其他的{/ /处理表单提交…这个美元- >重定向(“mymodule里/ anotheraction”);}}公共函数handleErrorSend(){/ /准备数据模板/ /显示表单返回sfView::成功;}}
准备所需的逻辑数据可以重构操作类的保护方法,以避免重复它executeSend ()
和handleErrorSend ()
方法。
用这个新配置,当用户输入一个无效的名字,再次显示形式,但输入的数据丢失和错误消息解释了失败的原因。为了解决最后一个问题,你必须修改模板显示表单,插入错误消息接近于故障现场。
显示错误消息的形式
错误消息定义为验证器参数添加到请求当一个字段验证失败(正如您可以手动添加一个错误setError ()
方法,如清单10 - 18所示)。的sfRequest
对象提供了两种有用的方法来检索错误信息:hasError ()
和getError ()
,每一个期望一个字段名作为参数。除此之外,你可以显示一个警告的形式关注这样一个事实:一个或多个字段包含无效数据的hasErrors ()
方法。清单10-22和10-23演示如何使用这些方法。
清单10-22 -顶部的形式,显示错误信息模板/ indexSuccess.php
< ? php如果(sf_request美元- >hasErrors()):? >< p >输入的数据似乎是不正确的。请纠正以下错误并重新提交:< / p > < ul >< ? phpforeach(sf_request美元- >getErrors()作为美元的名字= >美元的错误):? ><李> < ? php回声美元的名字? >:< ? php回声美元的错误李? > < / >< ? phpendforeach;? >< / ul >< ? phpendif;? >
身体内部的清单10-23 -显示错误消息,模板/ indexSuccess.php
< ? php回声form_tag(“接触/发送”)? >< ? php如果(sf_request美元- >hasError(“名字”)):? >< ? php回声sf_request美元- >getError(“名字”)? >< br / >< ? phpendif;? >名称:< ? php回声input_tag(“名字”)? > < br / >…< ? php回声submit_tag()? >> < /形式
有条件使用的getError ()
方法在清单10-23写长了一点。这就是为什么symfoob娱乐下载ny提供了form_error ()
助手来取代它,只要你利用其辅助集团宣布验证
。清单10 - 24替换清单10-23通过使用这个帮手。
清单10 - 24 -显示错误消息在形式,短的方法
< ? phpuse_helper(“验证”)? >< ? php回声form_tag(“接触/发送”)? >< ? php回声form_error(“名字”)? > < br / >名称:< ? php回声input_tag(“名字”)? > < br / >…< ? php回声submit_tag()? >> < /形式
的form_error ()
辅助添加一个特殊字符之前和之后的每一个错误消息使消息更明显。默认情况下,这个角色是一个箭头指向下面(对应↓
实体),但是你可以改变它的settings.yml
文件:
:.settings: validation_error_prefix:“达;,”validation_error_suffix:”,达;
表单验证失败,现在显示正确错误,但用户输入的数据将丢失。你需要重新填充形式使它很友好。
重新繁衍的形式
错误处理是通过的转发()
方法(见清单20),仍然可以访问原始请求,由用户输入的数据在请求参数。所以你可以重新填充形式通过添加每个字段的默认值,如清单10到25所示。
清单10到25 -设置默认值,以重新填充表单验证失败时,模板/ indexSuccess.php
< ? phpuse_helper(“验证”)? >< ? php回声form_tag(“接触/发送”)? >< ? php回声form_error(“名字”)? > < br / >名称:< ? php回声input_tag(“名字”,sf_params美元- >得到(“名字”))? > < br / >< ? php回声form_error(“电子邮件”)? > < br / >电子邮件:< ? php回声input_tag(“电子邮件”,sf_params美元- >得到(“电子邮件”))? > < br / >< ? php回声form_error(“年龄”)? > < br / >年龄:< ? php回声input_tag(“年龄”,sf_params美元- >得到(“年龄”))? > < br / >< ? php回声form_error(“消息”)? > < br / >信息:< ? php回声textarea_tag(“消息”,sf_params美元- >得到(“消息”))? > < br / >< ? php回声submit_tag()? >> < /形式
但再一次,这是相当乏味的写。ob娱乐下载Symfony提供了一种替代的方式触发重新对所有领域的一种形式,直接在YAML验证文件,而不改变元素的默认值。只是使fillin:
表单的功能,语法描述清单选手。
清单选手-激活fillin
在验证失败,重新填充表单验证/ send.yml
fillin:启用:真正的#启用表单重新参数:名称:测试#表单名称,不需要页面中如果只有一个表单skip_fields:【邮件】#不重新填充这些字段exclude_types:【隐藏、密码】#不重新填充这些字段类型check_types:[文本、复选框、单选、选择隐藏]#重新填充这些content_type: html # html是宽容的违约。其他选项是xml和xhtml (xml一样但没有xml序言)
默认情况下,自动重新为文本输入工作,复选框、单选按钮、文本区域,并选择组件(简单和多个),但这并不使人重新住入密码或隐藏标记。的fillin
功能不工作文件标签。
请注意
的fillin
功能是通过解析XML响应内容之前发送给用户。默认情况下fillin
将输出HTML。
如果你想要fillin
输出XHTML你必须设置参数:content_type: xml
。如果响应并不是一个严格有效的XHTML文档fillin
将不会工作。第三个可用content_type
是xhtml
这是一样的吗xml
但它从响应中删除xml序言在IE6导致怪异模式。
您可能想要将用户输入的值之前写在表单输入。逃避,URL重写,特殊字符转换为实体,和所有其他的转换,可以通过调用一个函数可以应用的领域如果您定义下的变换形式转换器:
键,如清单10-27所示。
清单10-27 -转换输入之前fillin
,在验证/ send.yml
fillin:启用:真正的参数:名称:测试转换器:#转换器应用htmlentities: [first_name、评论]::【评论】
标准Symfonyob娱乐下载验证器
ob娱乐下载Symfony包含一些标准验证器可用于表单:
sfStringValidator
sfNumberValidator
sfEmailValidator
sfUrlValidator
sfRegexValidator
sfCompareValidator
sfPropelUniqueValidator
sfDoctrineUniqueValidator
sfFileValidator
sfCallbackValidator
sfDateValidator
各有一组默认的参数和错误消息,但是你可以很容易地通过覆盖它们初始化()
validator方法或在YAML文件中。以下部分描述验证器和显示用法示例。
字符串验证器
sfStringValidator
允许你与字符串相关的应用约束参数。
sfStringValidator:价值观:(foo, bar) values_error: foo和bar唯一接受的值不敏感:假#如果这是真的,与价值观是不分大小写分钟:2 min_error:请输入至少2人物马克斯:100 max_error:请输入小于100个字符
数字验证器
sfNumberValidator
验证如果一个参数是一个数量,允许您应用规模约束。
sfNumberValidator: nan_error:请输入一个整数分钟:0 min_error:价值必须至少零马克斯:100 max_error:值必须小于或等于100
电子邮件验证器
sfEmailValidator
验证参数是否包含一个值为一个电子邮件地址。
sfEmailValidator:严格的:真正的email_error:此邮件地址是无效的
根据RFC822定义以电子邮件地址的格式。然而,宽容比普遍接受的格式。例如,me@localhost
根据RFC是一个有效的电子邮件地址,但是你可能不想接受它。当严格的
参数设置为真正的
(默认值),只有电子邮件地址匹配的模式name@domain.extension
是有效的。当设置为假
,根据RFC822作为以规则。
URL验证器
sfUrlValidator
检查字段是否正确的URL。
sfUrlValidator: url_error:这个URL是无效的
正则表达式验证器
sfRegexValidator
允许您对perl的正则表达式模式匹配一个值。
sfRegexValidator:匹配:没有match_error:文章包含不止一个URL被认为是垃圾邮件模式:http / si / http。*
的匹配
参数确定如果请求参数必须匹配模式是有效的(值是的
)或匹配模式无效(价值没有
)。
比较验证器
sfCompareValidator
检查的平等两个不同的请求参数。它是非常有用的密码检查。
字段:密码:要求:味精:请输入一个密码2:要求:味精:请重新输入密码sfCompareValidator:检查:compare_error密码:两个密码不匹配
的检查
参数包含字段当前字段的名称必须匹配是有效的。
推动/主义独特的验证器
sfPropelUniqueValidator
验证请求参数的值在数据库中不存在。独特的索引是非常有用的。
字段:昵称:sfPropelUniqueValidator:类:用户列:登录unique_error:登录已经存在。请选择另一个。
在这个例子中,验证器将在数据库中寻找类的记录用户
在哪里登录
列具有相同的值的字段验证。
谨慎
sfPropelUniqueValidator容易竞态条件。虽然不太可能,在多用户环境中,结果可能会改变即时它返回。你还应该准备好处理重复插入错误。
请注意如果你有使教义ORM为您的项目,您还可以使用sfDoctrineUniqueValidator
以同样的方式推动如上所述。
文件验证器
sfFileValidator
应用格式(mime类型的数组)和尺寸约束文件上传字段。
领域:形象:文件:真正的要求:味精:请上传图像文件sfFileValidator: mime_types:——“图像/ jpeg”——“图像/ png”——“图像/ x-png”-“图像/ pjpeg”mime_types_error:只允许png和jpeg图像max_size: 512000 max_size_error:马克斯大小为512 kb
请注意,文件
属性必须设置为真正的
场,模板必须声明形式多部分。
回调确认器
sfCallbackValidator
代表第三方的验证可调用的方法或函数进行验证。可调用的方法或函数必须返回真正的
或假
。
字段:account_number: sfCallbackValidator:回调:is_numeric invalid_error:请输入一个数字。credit_card_number: sfCallbackValidator:回调:[myTools validateCreditCard] invalid_error:请输入有效的信用卡号码。
回调方法或函数接收价值被认可作为第一个参数。这是非常有用的,当你想重用现有方法的函数,而不是创建一个完整的验证器类。
日期验证器
sfDateValidator
检查提交的日期是有效的和/或在某些简单的范围内
sfDateValidator: date_error:你进入了一个无效的日期比较:“2007-05-01”接线员:“> = " #默认为“= =”如果不是提供compare_error:“输入一个日期迟于2007年5月1日”
提示
您也可以编写自己的验证器,“创建一个定制的验证器”一节中描述的在本章后面。
指定验证器
如果你发现你需要重复确认器类及其设置,你可以包下一个验证器。例子的接触形式,电子邮件字段需要sfStringValidator参数相同的名字
字段。所以你可以创建一个myStringValidator
两次指定验证器以避免重复相同的设置。为此,添加一个myStringValidator
标签下的验证器:
头,并设置类
和参数
键和指定验证器的细节你想包。然后,您可以使用指定的验证器就像一个普通的字段
部分,如清单28所示。
清单28 -重用指定验证器验证文件,验证/ send.yml
验证器:myStringValidator:类:sfStringValidator参数:最小值:2 min_error:这个领域太短(2字符最低)马克斯:100 max_error:这个领域太长(最大100个字符)字段:名称:要求:味精:name字段不能留空myStringValidator:电子邮件:要求:味精:电子邮件字段不能留空myStringValidator: sfEmailValidator: email_error:这个电子邮件地址是无效的
限制验证方法
默认情况下,运行验证器验证文件中设置与POST方法调用动作时。您可以覆盖该设置或者字段的字段通过指定一个值方法
键,允许不同的验证不同的方法,如清单10-29所示。
清单10-29 -定义测试领域时,验证/ send.yml
方法:[文章]#这是默认设置字段:名称:要求:味精:name字段不能留空myStringValidator:电子邮件:方法:(post、get) #覆盖全球的方法设置要求:味精:电子邮件字段不能留空myStringValidator: sfEmailValidator: email_error:这个电子邮件地址是无效的
验证文件是什么样子?
到目前为止,您已经看到了只有片段的验证文件。当你把一切放在一起时,验证规则在YAML找到一个明确的翻译。清单10 - 30显示了完整的验证文件样本接触形式,对应于早些时候章定义的所有规则。
清单10 - 30 -样本完整的验证文件
fillin:启用:真正的验证器:myStringValidator:类:sfStringValidator参数:最小值:2 min_error:这个领域太短(2字符最低)马克斯:100 max_error:这个领域太长(最大100个字符)字段:名称:要求:味精:name字段不能留空myStringValidator:电子邮件:要求:味精:电子邮件字段不能留空myStringValidator: sfEmailValidator: email_error:这个电子邮件地址是无效的年龄:sfNumberValidator: nan_error:请输入一个整数分钟:0 min_error:“你还未出生的。你想如何发送消息?”马克斯:120 max_error:“嘿,奶奶,你不是太老,网上冲浪?”信息:要求:味精:消息字段不能留空吗
复杂的验证
验证文件满足大多数需求,但是当验证是非常复杂的,它可能是不充分的。在这种情况下,您仍然可以返回validateXXX ()
方法在行动,或在以下部分中找到你的问题的解决方案。
创建一个定制的验证器
每一个验证器是一个类,它扩展了sfValidator
类。如果验证器类附带symfony不适合您的需要,您可以轻松地创建一个新的,在任ob娱乐下载何的lib /
目录,它可以自动装载。语法很简单:execute ()
方法验证器的调用时执行验证器。您还可以定义默认设置初始化()
方法。
的execute ()
方法接收验证作为第一个参数值和错误消息将作为第二个参数。都是通过引用,所以您可以修改错误信息的方法。
的初始化()
方法接收上下文singleton和从YAML文件参数的数组。它必须首先调用初始化()
母公司的方法sfValidator
类,然后设置默认值。
持有者可以访问每一个验证器都有一个参数$ this - > getParameterHolder ()
。
例如,如果你想建立一个sfSpamValidator
检查字符串是否不是垃圾邮件,将清单10-31中所示的代码添加到一个sfSpamValidator.class.php
文件。它会检查,如果美元的价值
包含多max_url
次的字符串“http”
。
清单10-31 -创建一个定制的验证器lib / sfSpamValidator.class.php
类sfSpamValidator扩展sfValidator{公共函数执行(&美元的价值,&美元的错误){/ / max_url = 2, regexp是http / http。* /是美元=' / '。内爆(”。*’,array_fill(0,这个美元- >getParameter(“max_url”)+1,“http”))。“是”;如果(preg_match(是美元,美元的价值)){美元的错误=这个美元- >getParameter(“spam_error”);返回假;}返回真正的;}公共函数初始化(美元的上下文,美元的参数=零){/ /初始化父类父::初始化(美元的上下文);/ /设置默认参数值这个美元- >setParameter(“max_url”,2);这个美元- >setParameter(“spam_error”,这是垃圾邮件);/ /设置参数这个美元- >getParameterHolder()- >添加(美元的参数);返回真正的;}}
一旦验证器添加到一个autoloadable目录(缓存清除),您可以使用它在你的验证文件,见清单10-32。
清单10-32 -使用一个定制的验证器验证/ send.yml
领域:信息:要求:味精:消息字段不能留空sfSpamValidator: max_url: 3 spam_error:立即离开这个网站,你肮脏的垃圾信息散布者!
使用数组语法表单字段
PHP允许您使用数组语法的表单字段。编写自己的形式,或在使用时产生的的推动政府(见第14章),你可能最终与HTML代码清单10-33看起来像。
清单10-33 -使用数组语法形式
<标签为=“story_title”>标题:< /标签> < input type =“文本”name =“故事[标题]”id =“story_title”值=“默认值”大小=“45”/ >
使用输入名称(括号)在验证文件将抛出一个parsed-induced错误。这里的解决方案是更换方括号[]
用花括号{}
在字段
节中,见清单10-34,symfony会照顾的转换之后的名字发送到验证器。ob娱乐下载
清单10-34——验证文件使用数组语法形式
领域:故事{标题}:要求:是的
执行一个验证器在空字段
你可能需要执行一个验证器不需要的字段,在一个空值。例如,这发生在一个表单,用户可以改变他们的密码(但可能不希望),在这种情况下,一个确认密码必须输入。参见清单10 - 35中的示例。
清单10 - 35 -示例验证文件的形式有两个密码字段
领域::密码2:sfCompareValidator:检查:compare_error密码:两个密码不匹配
执行验证过程如下:
如果
密码
= =零
和2 = =零
:- 的
要求
测试通过。 - 验证器不运行。
- 形式是有效的。
- 的
如果
2 = =零
而密码
不是零
:- 的
要求
测试通过。 - 验证器不运行。
- 形式是有效的。
- 的
你可能想要执行2
验证器如果密码
是非空
。幸运的是,symfony验证器处理ob娱乐下载这种情况下,感谢集团
参数。字段是在一组时,验证器就会执行如果不是空的,如果其中一个字段的同一组不是空的。
如果你改变配置清单10-36所示,正确验证过程的行为。
清单10-36——示例验证文件表单字段和一群有两个密码
字段:密码:组:password_group 2:组:password_group sfCompareValidator:检查:compare_error密码:两个密码不匹配
现在的验证过程执行如下:
如果
密码= =零
和2 = =零
:- 的
要求
测试通过。 - 验证器不运行。
- 形式是有效的。
- 的
如果
密码= =零
和2 = =“foo”
:- 的
要求
测试通过。 2
是非空
,所以它的执行验证器,它失败了。- 抛出一个错误消息
2
。
- 的
如果
密码= =“foo”
和2 = =零
:- 的
要求
测试通过。 密码
是非空
,所以验证器2
在同一组,执行,它失败了。- 抛出一个错误消息
2
。
- 的
如果
密码= =“foo”
和2 = =“foo”
:- 的
要求
测试通过。 2
是非空
,所以它的执行验证器,并且它通过。- 形式是有效的。
- 的
总结
写作形式在symfony的模板由标ob娱乐下载准形式促进助手和他们聪明的选择。当你设计一个表单来编辑的属性对象,该对象的形式帮助简化任务。验证文件,验证助手和重新特性减少必要的工作来构建一个健壮的和用户友好的服务器控制字段的值。甚至可以处理最复杂的验证需求,通过编写一个定制的验证器或通过创建一个validateXXX ()
方法在action类。
这项工作是GFDL许可执照。