第十章——形式
处理表单输入的显示,验证表单提交,所有形式的特殊情况下是web开发中最复杂的任务之一。幸运的是,symfob娱乐下载ony提供了一个简单的接口,一个非常强大的sub-framework形式,并帮助你设计和处理各种复杂形式的几行代码。
显示一个表单
一个简单的联系表单名称、电子邮件,主题和消息字段通常呈现如下:
在syob娱乐下载mfony中,形式是一个对象并传递到模板中定义的行动。为了显示一个表单,您必须首先定义它所包含的字段——symfony使用术语“部件”。ob娱乐下载最简单的方法是创建一个新的sfForm
对象的操作方法。
/ /模块/ foo /行动/ actions.class.php公共函数executeContact(美元的请求){这个美元- >形式=新sfForm();这个美元- >形式- >setWidgets(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInputText(数组(“默认”= >“me@example.com”)),“主题”= >新sfWidgetFormChoice(数组(“选择”= >数组(“主题”,“B”主题,“C”主题))),“消息”= >新sfWidgetFormTextarea(),));}
sfForm: setWidgets ()
预计小部件名称/小部件对象的关联数组。sfWidgetFormInputText
,sfWidgetFormChoice
,sfWidgetFormTextarea
是一些symfony提供的大量的窗口小部件类;ob娱乐下载你会发现在本章进一步完整列表。
前面的示例显示了两个小部件选项可以使用:默认的
设置部件值,并对所有小部件可用。选择
是一个选择的选择
小部件(显示为一个下拉列表):它定义了可用的选项,用户可以选择。
因此,foo /联系
操作定义一个表单对象,然后处理它contactSuccess
模板中美元的形式
变量。模板可以使用这个对象呈现在HTML表单的各个部分。最简单的方法是调用echo $形式
,这将使所有字段的表单控件和标签。您还可以使用表单对象生成表单标签:
/ /模块/ foo /模板/ contactSuccess.php< ? php回声美元的形式- >renderFormTag(“foo /接触”)吗?><表>< ? php回声美元的形式吗?>< tr > < td colspan =“2”> < input type =“提交”/ > < / td > < / tr > < /表> > < /形式
传入的参数setWidgets ()
,sob娱乐下载ymfony有足够的信息来显示正确的形式。由此产生的HTML呈现就像上面的截图中,与底层代码:
<表单动作=“/ frontend_dev.php / foo /接触”方法=“职位”表> > < < tr > < th > <标签为=“名称”标签名称> < / > < / th > < td > < input type =“文本”name =“名称”id =“名称”/ > < / td > < / tr > < tr > < th > <标签为=“电子邮件”>邮件< /标签> < / th > < td > < input type =“文本”name =“电子邮件”id =“电子邮件”值=“me@example.com”/ > < / td > < / tr > < tr > < th > <标签为=“主题”> < /标签> < / th >主题< td > <选择name =“主题”id =“主题”> <选项值=“0”> < /选项> <主题选项值=“1”>主题B < /选项> <选项值=“2”>主题C < /选项> < /选择> < / td > < / tr > < tr > < th > <标签为=“消息”消息> < /标签> < / th > < td > < textarea行=“4”关口=“30”name =“消息”id =“消息”> < / textarea > < / td > < / tr > < tr > < td colspan =“2”> < input type =“提交”/ > < / td > < / tr > < /表> > < /形式
每个小部件的结果包含一个表中的行<标识>
标签和一个表单输入标签。ob娱乐下载Symfony演绎的标签名称的部件名称(大写化它主题
部件名称给“主题”的标签)。对于输入的标签,这取决于小部件类型。ob娱乐下载Symfony添加了一个id
每个小部件属性,基于它的名字。最后,表单的呈现总是xhtml。
定制的形式显示
使用echo $形式
原型是伟大的,但你可能想要控制生成的HTML代码。表单对象包含字段的数组,调用echo $形式
会遍历字段和使他们一个接一个。获得更多的控制,手动可以遍历字段,并调用renderRow ()
在每个字段。下面的清单产生相同的HTML代码之前,但模板分别回应每个字段:
/ /模块/ foo /模板/ contactSuccess.php< ? php回声美元的形式- >renderFormTag(“foo /接触”)吗?><表>< ? php回声美元的形式(“名字”]- >renderRow()吗?>< ? php回声美元的形式(“电子邮件”]- >renderRow()吗?>< ? php回声美元的形式(“主题”]- >renderRow()吗?>< ? php回声美元的形式(“消息”]- >renderRow()吗?>< tr > < td colspan =“2”> < input type =“提交”/ > < / td > < / tr > < /表> > < /形式
渲染字段允许您更改一个接一个的顺序显示,并定制自己的外表。renderRow ()
预计一个列表的HTML属性作为第一个参数,你可以定义一个自定义类
,id
例如,或JavaScript事件处理程序。第二个参数的renderRow ()
是一个可选标签覆盖了一个推导出小部件的名称。下面是一个示例联系人表单的定制:
/ /模块/ foo /模板/ contactSuccess.php< ? php回声美元的形式- >renderFormTag(“foo /接触”)吗?><表>< ? php回声美元的形式(“名字”]- >renderRow(数组(“大小”= >25,“类”= >“foo”),“你的名字”)吗?>< ? php回声美元的形式(“电子邮件”]- >renderRow(数组(“onclick”= >“这。值= " ";“),“电子邮件”)吗?>< ? php回声美元的形式(“消息”]- >renderRow()吗?>< tr > < td colspan =“2”> < input type =“提交”/ > < / td > < / tr > < /表> > < /形式
但也许你需要每个字段的标签和输入输出<李>
标签而不是一个< tr >
标签。一个字段“行”是由一个标签,一个可选错误消息(添加验证系统,在本章后面解释),帮助文本和小部件(注意,小部件可以由多个表单控件)。正如您可以输出的各领域形成一个接一个,你也可以独立呈现表单的各个部分。而不是使用renderRow ()
,使用任何呈现()
(小部件),renderError ()
,renderLabel ()
,renderHelp ()
。例如,如果你想使整个形式<李>
标签,写模板如下:
/ /模块/ foo /模板/ contactSuccess.php< ? php回声美元的形式- >renderFormTag(“foo /接触”)吗?>< ul >< ? phpforeach(美元的形式作为美元的领域):吗?><李>< ? php回声美元的领域- >renderLabel()吗?>< ? php回声美元的领域- >渲染()吗?>李< / >< ? phpendforeach;吗?><李> < input type =“提交”李/ > < / > < / ul > < /形式>
这呈现HTML如下:
<表单动作=“/ frontend_dev.php / foo /接触”方法=“职位”> < ul > <李> <标签为=“名称”> < /标签> < input type =“文本”name =“名称”id =“名称”李李/ > < / > < > <标签为=“电子邮件”>邮件< /标签> < input type =“文本”name =“电子邮件”id =“电子邮件”李李/ > < / > < > <标签为=“主题”> < /标签> <选择name =“主题”id =“主题”> <选项值=“0”> < /选项> <主题选项值=“1”>主题B < /选项> <选项值=“2”>主题C < /选项> < /选择> < /李> <李> <标签为=“消息”消息> < /标签> < textarea行=“4”关口=“30”name =“消息”id =“消息”李> < / textarea > < / > <李> < input type =“提交”李/ > < / > < / ul > < /形式>
提示
一个字段行是一个表单字段的所有元素的表示(标签,错误消息,帮助文本形式输入)格式化程序。默认情况下,symfonob娱乐下载y使用表
格式化程序,这是为什么renderRow ()
返回一组< tr >
,< th >
和< td >
标签。另外,您也可以获得相同的HTML代码只需指定一个替代列表
格式化程序的形式,如下:
/ /模块/ foo /模板/ contactSuccess.php< ? php回声美元的形式- >renderFormTag(“foo /接触”)吗?>< ul >< ? php回声美元的形式- >renderUsing(“列表”)吗?><李> < input type =“提交”李/ > < / > < / ul > < /形式>
提示
检查的API文档欧宝官网下载appsfWidgetFormSchemaFormatter
类来学习如何创建自己的格式化程序。
表单组件
有许多可用的表单组件的构成形式。所有小部件接受至少默认的
选择。
您还可以定义小部件的标签,甚至它的HTML属性,当您创建表单:
这个美元- >形式=新sfForm();这个美元- >形式- >setWidgets(数组(“名字”= >新sfWidgetFormInput(数组(“标签”= >“你的名字”),数组(“大小”= >25,“类”= >“foo”)),“电子邮件”= >新sfWidgetFormInput(数组(“默认”= >“me@example.com”,“标签”= >“电子邮件”),数组(“onclick”= >“这。值= " ";“)),“主题”= >新sfWidgetFormChoice(数组(“选择”= >数组(“主题”,“B”主题,“C”主题))),“消息”= >新sfWidgetFormTextarea(数组(),数组(“行”= >“20”,“关口”= >5)),));
ob娱乐下载Symfony使用这些参数来显示小部件,您仍然可以通过自定义参数覆盖它们renderRow ()
模板中。
提示
作为一种替代方法调用setWidgets ()
使用关联数组,您可以调用setWidget(名称、部件美元)
方法几次。
标准部件
这是可用的小部件列表类型,以及它们是如何转化为HTML(通过renderRow ()
):
/ /文本输入美元的形式- >setWidget(“full_name”,新sfWidgetFormInput(数组(“默认”= >“John Doe”)));<标签为=“full_name”>全名< /标签> < input type =“文本”name =“full_name”id =“full_name”值=“John Doe”/ >/ /文本区域美元的形式- >setWidget(“地址”,新sfWidgetFormTextarea(数组(“默认”= >在这里输入你的地址的),数组(“关口”= >20.,“行”= >5)));<标签为=“地址”< / >地址标签> < name =文本区域“地址”id =“地址”关口=“20”行=“5”>在这里输入你的地址textarea > < // /密码输入/ /注意,“密码”输入小部件不要默认的参数,是为了安全起见美元的形式- >setWidget(“pwd”,新sfWidgetFormInputPassword());<标签为=“pwd”> Pwd < /标签> < input type =“密码”name =“pwd”id =“pwd”/ >/ /隐藏输入美元的形式- >setWidget(“id”,新sfWidgetFormInputHidden(数组(“默认”= >1234年)));< input type =“隐藏”name =“id”id =“id”值=“1234”/ >/ /复选框美元的形式- >setWidget(“单一”,新sfWidgetFormInputCheckbox(数组(“value_attribute_value”= >“单一”,“默认”= >真正的)));<标签为=“单身”> < /标签> < input type =“复选框”name =“单身”id =“单身”值=“真正的”检查=“检查”/ >
有更多的选择比这里暴露的每个小部件。检查部件API文档的每个小部件的完整描述期欧宝官网下载app望以及它如何呈现。
列表小部件
每当用户必须做出选择的值列表,以及他们是否可以在这个列表选择一个或多个选项,单个部件回答所有的需求:选择
小部件。根据两个可选参数(多个
和扩大
),这个小部件呈现方式不同:
|多= false |多= true |(默认)| - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - -扩展= false | |下拉列表下拉框(默认)|(<选择>)|(“<选择多个>”)- - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - -扩展= true | Radiobuttons列表|复选框列表| |
的选择
小部件预计至少选择
与一个关联数组参数,定义每个选项的值和文本。这是一个每个语法的例子:
/ /下拉列表(选择)美元的形式- >setWidget(“国家”,新sfWidgetFormChoice(数组(“选择”= >数组(”= >“从列表中选择”,“我们”= >“美国”,“ca”= >“加拿大”,“英国”= >“英国”,“其他”),“默认”= >“英国”)));/ /ob娱乐下载 symfony呈现小部件的HTML<标签为=“国家”> < /标签> <选择id =“国家”name =“国家”> <选项值=”“>选择从列表中选择< / > <选项值=“我们”美国> < /选项> <选项值=“ca”加拿大> < /选项> <选项值=“英国”选择=“选择”英国< / >选项> <选项值=“0”其他< / >选项> < /选择>/ /下拉列表中有多个选择美元的形式- >setWidget(“语言”,新sfWidgetFormChoice(数组(“多”= >“真正的”,“选择”= >数组(“en”= >“英语”,“fr”= >“法国”,“其他”),“默认”= >数组(“en”,0))));/ /ob娱乐下载 symfony呈现小部件的HTML<标签为=“语言”> < /标签> <语言选择id =“语言”多个=“多”name =“语言[]”> <选项值=“en”选择=“选择”> < /选项> <选项值=英语“fr”法国< / >选项> <选项值=“0”选择=“选择”其他< / >选项> < /选择>/ /单选按钮列表美元的形式- >setWidget(“性别”,新sfWidgetFormChoice(数组(“扩展”= >真正的,“选择”= >数组(“米”= >“男”,“f”= >“女”),“类”= >“gender_list”)));/ /ob娱乐下载 symfony呈现小部件的HTML<标签为=“性别”性别> < /标签> < ul类=“gender_list”> <李> < input type =“广播”name =“性别”id =“gender_m”值=“m”> <标签为=“gender_m”李男性> < /标签> < / > <李> < input type =“广播”name =“性别”id =“gender_f”值=“f”> <标签为=“gender_f”李女< / >标签> < / > < / ul >/ /复选框的列表美元的形式- >setWidget(“利益”,新sfWidgetFormChoice(数组(“多”= >“真正的”,“扩展”= >真正的,“选择”= >数组(“编程”,“其他”))));/ /ob娱乐下载 symfony呈现小部件的HTML<标签为=“利益”> < /标签> < ul利益类=“interests_list”> <李> < input type =“复选框”name =“[]”id =“interests_0”值=“0”> <标签为=“interests_0”李>编程< /标签> < / > <李> < input type =“复选框”name =“[]”id =“interests_1”值=“1”> <标签为=“interests_1”李>其他> < /标签< / > < / ul >
提示
你可能注意到,symfony自动定义一个ob娱乐下载id
为每个表单输入属性,基于一个小部件的名称和值的组合。你可以覆盖id
属性窗口小部件的部件,或者设置一个全球整个规则的形式setIdFormat ()
的方法sfWidgetForm
类:
/ /模块/ foo /行动/ actions.class.php这个美元- >形式=新sfForm();这个美元- >形式- >getWidgetSchema()- >setIdFormat(“my_form_ % s”);
外键部件
在编辑模型对象通过表单时,一个特定的列表选择总是出现:对象的列表,可以与当前有关。这发生在模型相关的多对一的关系,或者多对多。幸运的是,sfPropelPlugin
与symfony提供了一个ob娱乐下载绑定sfWidgetFormPropelChoice
专为这些情况下(和小部件sfDoctrinePlugin
提供了一个类似的sfWidgetFormDoctrineChoice
小部件)。
例如,如果一个部分
有很多文章
,你应该能够选择部分现有的列表中编辑一篇文章。这样做,一个ArticleForm
应该使用sfWidgetFormPropelChoice
部件:
articleForm美元=新sfForm();articleForm美元- >setWidgets(数组(“id”= > sfWidgetFormInputHidden(),“标题”= > sfWidgetFormInputText(),“section_id”= > sfWidgetFormPropelChoice(数组(“模型”= >“节”,“列”= >“名字”))));
这将显示一个列出现有的部分……如果你定义了一个__toString ()
方法部分
模型类。因为symfony首先检索可用ob娱乐下载部分
对象,和填充选择
小部件通过回声
每个对象。因此,部分
模型应该至少功能下面的方法:
/ / lib /模型/ Section.php公共函数__toString(){返回这个美元- >getName();}
的sfWidgetFormPropelChoice
小部件是一个扩展的sfWidgetFormChoice
小部件,所以您可以使用多个
选项来处理多对多关系,扩大
选择改变小部件呈现的方式。
如果你想订单的列表选择一种特殊的方式,或过滤,以便只显示部分可用的选择,使用标准
选择通过标准
对象的小部件。理论支持同样的定制:你可以通过Doctrine_Query
对象的小部件查询
选择。
日期窗口小部件
日期和时间窗口小部件输出一组下拉列表,填充可用的值一天,月,年,小时或分钟。
/ /日期美元的年=范围(1950年,1990年);美元的形式- >setWidget(“强加于人”,新sfWidgetFormDate(数组(“标签”= >“出生日期”,“默认”= >“01/01/1950”,/ /可以时间戳或字符串可以理解strtotime ()“年”= >合二为一(美元的年,美元的年))));/ /ob娱乐下载 symfony呈现小部件的HTML<标签为=“强加于人”>出生日期< /标签> <选择id =“dob_month”name =“罗伯特(月)”> <选项值=”“/ > <选项选择=“选择”值=“1”>01< /选项> <选项值=“2”>02< /选项>…<选项值=“12”>12< /选项> < /选择> / <选择id =“dob_day”name =“罗伯特(天)”> <选项值=”“/ > <选项选择=“选择”值=“1”>01< /选项> <选项值=“2”>02< /选项>…<选项值=“31”>31日< /选项> < /选择> / <选择id =“dob_year”name =“罗伯特(年)”> <选项值=”“/ > <选项选择=“选择”值=“1950”>1950年< /选项> <选项值=“1951”>1951年< /选项>…<选项值=“1990”>1990年< /选项> < /选择>/ /时间美元的形式- >setWidget(“开始”,新sfWidgetFormTime(数组(“默认”= >“12”)));/ /ob娱乐下载 symfony呈现小部件的HTML<标签为=“开始”> < /标签> <开始选择id =“start_hour”name =“开始”(小时)> <选项值=”“/ > <选项值=“0”>00< /选项>…<选项选择=“选择”值=“12”>12< /选项>…<选项值=“23”>23< /选项> < /选择>:<选择id =“start_minute”name =“开始”(分钟)> <选项值=”“/ > <选项选择=“选择”值=“0”>00< /选项> <选项值=“1”>01< /选项>…<选项值=“59”>59< /选项> < /选择>/ /日期和时间美元的形式- >setWidget(“结束”,新sfWidgetFormDateTime(数组(“默认”= >“01/01/2008 12点”)));/ /ob娱乐下载 symfony呈现小部件在HTML 5下拉列表的一个月,一天,一年,小时,分钟
当然,您可以自定义日期格式
,显示它在欧洲风格而不是国际风格(%天% / %月% % %
而不是%月% / %天% % %
),您可以切换到每天2 x12小时而不是24小时,您可以定义自定义值的第一个选项的下拉框,你可以定义限制可能的值。再一次,检查API文档的更多细节关于日期和时间的选择欧宝官网下载app小部件。
日期控件是一个很好的例子部件在symfony的力量。ob娱乐下载一个小部件并不是一个简单的表单输入。它可以结合一些输入,symfony可以从以透明的方式呈现和阅读。ob娱乐下载
I18n小部件
在多语言应用程序中,日期必须显示的格式根据用户文化(有关详细信息,请参阅第13章关于文化和本地化)。促进这个定位形式,symfony提供了一个ob娱乐下载sfWidgetFormI18nDate
小部件,这预计用户文化
决定的日期格式参数。你也可以指定一个month_format
下拉显示月的名称(在用户语言),而不是数字。
/ /日期美元的年=范围(1950年,1990年);美元的形式- >setWidget(“强加于人”,新sfWidgetFormI18nDate(数组(“文化”= >这个美元- >getUser()- >getCulture(),“month_format”= >“名字”,/ /使用“名称”(默认),“short_name”和“数量”“标签”= >“出生日期”,“默认”= >“01/01/1950”,“年”= >合二为一(美元的年,美元的年))));/ /对于一个说英语的用户,symfony呈现小部件的HTMLob娱乐下载<标签为=“强加于人”>出生日期< /标签> <选择id =“dob_month”name =“罗伯特(月)”> <选项值=”“/ > <选项选择=“选择”值=“1”> < /选项> <选项值= 1月“2”2 > < /选项>…<选项值=“12”12月< / >选项> < /选择> / <选择id =“dob_day”name =“罗伯特(天)”< /选择> >…/
类似的小部件存在时间(sfWidgetFormI18nTime
)和datetime (sfWidgetFormI18nDateTime
)。
有两个下拉列表,发生在许多形式,也依赖于用户文化:国家和语言选择器。ob娱乐下载特别是为此Symfony提供了两个小部件。你不需要定义选择
在这些小部件,因为symfony将填充他们ob娱乐下载的国家和语言的语言列表的用户(提供用户在symfony说250引用任何语言)。
/ /国家列表形式- > setWidget美元(“国家”,新的sfWidgetFormI18nCountryChoice(数组(“违约”= >“英国”)));/ /对于一个说英语的用户,symfony呈现小部件的HTML国家< /标签> <选择id =“国家”name = "国家" > <选项值= " / > <选项值= "广告" >安道尔< /选项> <选项值=“AE”>阿拉伯联合酋长国< /选项>…津巴布韦<选项值= " ZWD " > < /选项> < /选择> / /语言列表形式- > setWidget美元(“语言”,新的sfWidgetFormI18nLanguageChoice(数组(“语言”= >数组(“en”、“fr”、“德”),/ /可选的限制列表的语言“默认”= >“en”)));/ /对于一个说英语的用户,symfony呈现小部件的HTML 语言> < /标签<选择id =“语言”name = "语言" > <选项值= " / > <选项值= "德" >德国< /选项> <选项值=选中“en”=“选择”>英语< /选项> <选项值=“fr”>法国< /选项> < /选择>
文件小部件
处理文件输入标签并不比其他小部件处理更复杂:
/ /输入文件美元的形式- >setWidget(“图片”,新sfWidgetFormInputFile());/ /ob娱乐下载 symfony呈现小部件的HTML<标签为=“图片”> < /标签> <图片输入id =“图片”类型=“文件”name =“图片”/ >/ /每当一个表单文件小部件,renderFormTag()输出一个<形式>标记的多部分的选择/ /可编辑的输入文件美元的形式- >setWidget(“图片”,新sfWidgetFormInputFileEditable(数组(“默认”= >' /遗留/图片/ foo.png ')));/ /ob娱乐下载 symfony呈现小部件的HTML文件输入标签,加上当前文件的预览
提示
第三方插件提供了许多额外的部件。你可以很容易地找到一个富文本编辑器部件,日历小部件或其他“丰富的UI小部件用于各种JavaScript库。检查插件库为更多的细节。
处理表单提交
当用户填写表单并提交,web应用程序服务器需要检索的数据请求,并做一些东西。的sfForm
类提供了所有必要的方法来用几行代码。
简单的形式处理
因为小部件作为常规的HTML表单字段,输出值在操作处理表单提交一样容易检查相关的请求参数。例如接触形式,行动可能看起来像这样:
/ /模块/ foo /行动/ actions.class.php公共函数executeContact(美元的请求){/ /定义形式这个美元- >形式=新sfForm();这个美元- >形式- >setWidgets(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInput(数组(“默认”= >“me@example.com”)),“主题”= >新sfWidgetFormChoice(数组(“选择”= >数组(“主题”,“B”主题,“C”主题))),“消息”= >新sfWidgetFormTextarea(),));/ /处理请求如果(美元的请求- >isMethod(“职位”)){/ /处理表单提交美元的名字=美元的请求- >getParameter(“名字”);/ /做东西/ /……这个美元- >重定向(“foo / bar”);}}
如果请求方法是‘得到’,这一行动将在终止sfView:成功
因此呈现contactSuccess
模板来显示表单。如果请求方法是“文章”,那么行动处理表单提交和重定向到另一个动作。对于这个工作,<形式>
目标操作必须相同的显示。这就解释了为什么使用前面的例子foo /联系
是一种目标:
/ /模块/ foo /模板/ contactSuccess.php< ? php回声美元的形式- >renderFormTag(“foo /接触”)吗?>…
形式处理和数据验证
在实践中,有比刚刚更表单提交处理用户输入的值。对于大多数表单提交时,应用程序控制器需要:
- 检查数据是否符合一组预定义的规则(必填字段,格式的电子邮件,等等)。李< / ><李>随意变换的一些输入数据,使其可以理解(修剪空白,将日期转换为PHP格式等)李< / ><李>如果数据是无效的,再次显示形式,错误消息适用的地方李< / ><李>如果数据是正确的,做一些东西,然后重定向到另一个动作李< / >
ob娱乐下载Symfony提供了一个自动的方式来验证提交的数据与一组预定义的规则。首先,定义一组为每个字段验证器。第二,当提交表单时,“绑定”表单对象与用户提交的值(即。用户提交的,检索的值并把它们放在表单)。最后,请检查数据的形式是有效的。下面的示例展示了如何检索的检查价值电子邮件
小部件是一个电子邮件地址,并检查消息
有一个最少4个字符的大小:
/ /模块/ foo /行动/ actions.class.php公共函数executeContact(美元的请求){/ /定义形式这个美元- >形式=新sfForm();这个美元- >形式- >setWidgets(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInput(数组(“默认”= >“me@example.com”)),“主题”= >新sfWidgetFormChoice(数组(“选择”= >数组(“主题”,“B”主题,“C”主题))),“消息”= >新sfWidgetFormTextarea(),));这个美元- >形式- >setValidators(数组(“名字”= >新sfValidatorString(),“电子邮件”= >新sfValidatorEmail(),“主题”= >新sfValidatorString(),“消息”= >新sfValidatorString(数组(“min_length”= >4))));/ /处理请求如果(美元的请求- >isMethod(“职位”)){这个美元- >形式- >绑定(/ * * /用户提交的数据);如果(这个美元- >形式- >isValid()){/ /处理表单提交/ /……这个美元- >重定向(“foo / bar”);}}}
setValidators ()
使用类似的语法setWidgets ()
方法。sfValidatorEmail
和sfValidatorString
列出的两个无数symfony validatorob娱乐下载类,进一步在这一章。自然地,sfForm
还提供了setValidator ()
方法添加验证器。
将请求的数据放到表单绑定在一起,使用sfForm: bind ()
方法。表格必须用一些数据来检查它的有效性。
isValid ()
检查所有的注册验证通过。如果是这种情况,isValid ()
返回真正的
,行动可以继续表单提交。如果表单是无效的,那么行动终止与违约sfView:成功
并再次显示表单。但不仅仅是形式显示默认值,当它第一次显示。表单输入显示充满了之前用户输入的数据,和错误消息出现在验证没有通过。
提示
验证过程并不能阻止当形式遇上一个无效的字段。isValid ()
流程整个表单数据和检查所有字段错误,避免显示新的错误消息作为用户纠正其错误并再次提交表单。
使用干净的表单数据
在前面的清单,我们还没有定义了请求数据绑定过程中收到的形式。问题是,请求不仅仅包含表单数据。它还包含标题、饼干、参数作为参数,传递和所有这可能污染绑定过程。一个良好的实践是通过表单数据bind ()
方法。
幸运的是,symfony提ob娱乐下载供了名称所有表单输入使用数组语法。定义名称属性格式宽度setNameFormat ()
方法在动作当你定义表单,如下:
/ /模块/ foo /行动/ actions.class.php/ /定义形式这个美元- >形式- >getWidgetSchema()- >setNameFormat(“接触(% s)”);
这样,所有生成的表单输入呈现这样的一个名字形式(WIDGET_NAME)
而不是仅仅WIDGET_NAME
:
<标签为=“contact_name”> < /标签> < input type =“文本”name =“联系[名字]”id =“contact_name”/ >……<标签为=“contact_email”>邮件< /标签> < input type =“文本”name =“联系(邮件)”id =“contact_email”值=“me@example.com”/ >……<标签为=“contact_subject”> < /标签> <选择name =“联系(主题)”id =“contact_subject”> <选项值=“0”> < /选项> <主题选项值=“1”>主题B < /选项> <选项值=“2”>主题C < /选项> < /选择>…<标签为=“contact_message”消息> < /标签> < textarea行=“4”关口=“30”name =“联系信息”id =“contact_message”> < / >文本区域
现在可以检索的动作联系
请求参数到一个变量中。该变量包含一组中的所有用户输入的数据形式:
/ /模块/ foo /行动/ actions.class.php/ /处理请求如果(美元的请求- >isMethod(“职位”)){这个美元- >形式- >绑定(美元的请求- >getParameter(“接触”));如果(这个美元- >形式- >isValid()){/ /处理表单提交美元联系=这个美元- >形式- >getvalue();美元的名字=美元联系(“名字”];/ /或特定值美元的名字=这个美元- >形式- >getValue(“名字”);/ /做东西/ /……这个美元- >重定向(“foo / bar”);}}
当bind ()
方法接收一个参数数组,symfony自动避免注入额外的字段在客户端。ob娱乐下载这个安全功能将使表单验证失败的数组联系
参数包含一个字段,不是在原来的表单定义。
你会发现一个区别在上面的操作代码之前编写的。操作使用的数组值通过表单对象($形式- > getvalue ()
),而不是从请求。这是因为输入验证器可以过滤和清洁它,所以它总是更好的依靠数据从表单中检索对象(通过getvalue ()
或getValue ()
比的数据请求)。和复合材料领域(如日期控件),返回的数据getvalue ()
已经重组到原始的名字:
/ /提交时,“日期”小部件的表单控件……<标签为=“contact_dob”>出生日期< /标签> <选择id =“contact_dob_month”name =“联系(捐赠)(月)”< /选择> >…/“contact_dob_day”name =“联系(捐赠)(天)”< /选择> >…/ “contact_dob_year”name =“联系(捐赠)(年)”< /选择> >…/ /……导致行动三个请求参数美元联系=美元的请求- >getParameter(“接触”);美元的月=美元联系(“强加于人”](“月”];美元一天=美元联系(“强加于人”](“天”];美元一年=美元联系(“强加于人”](“年”];dateOfBirth美元=mktime(0,0,0,美元的月,美元一天,美元一年);/ /如果你使用getvalue(),您可以直接获取正确的日期美元联系=这个美元- >形式- >getvalue();dateOfBirth美元=美元联系(“强加于人”];
所以花的习惯总是使用数组语法(使用表单字段setNameFormat ()
),总是使用(使用干净的形式输出getvalue ()
)。
自定义错误消息显示
在哪里上面的截图所示的错误消息从何而来?你知道一个小部件是由四个组件,和错误消息就是其中之一。事实上,默认(表)格式化程序渲染字段行如下:
< ? php如果(美元的领域- >hasError()):吗?>< tr > < td colspan =“2”>< ? php回声美元的领域- >renderError()吗?>/ /错误列表< / td > < / tr >< ? phpendif;吗?>< tr > < th > < ? php回声美元的领域- >renderLabel()? > < / th >/ /标签< td >< ? php回声美元的领域- >渲染()吗?>/ /部件< ? php如果(美元的领域- >hasHelp()):吗?>< br / > < ? php回声美元的领域- >renderHelp()吗?>/ /帮助< ? phpendif;吗?>< / td > < / tr >
使用上述任何一种方法,您可以自定义错误信息出现的位置和方法为每个字段。此外,您可以显示一个全球错误消息的形式是如果是无效的:
< ? php如果(美元的形式- >hasErrors()):吗?>有一些错误需要修复。< ? phpendif;吗?>
定制验证器
在一个表单,所有字段必须有验证器和默认情况下,所有的字段是必需的。如果你需要设置一个字段可选,通过要求
验证器和设置选项假
。例如,下面的清单显示了如何使的名字
现场要求和电子邮件
字段可选:
这个美元- >形式- >setValidators(数组(“名字”= >新sfValidatorString(),“电子邮件”= >新sfValidatorEmail(数组(“要求”= >假)),“主题”= >新sfValidatorString(),“消息”= >新sfValidatorString(数组(“min_length”= >4))));
你可以把多个字段验证器。例如,您可能需要检查电子邮件
场都满足sfValidatorEmail
和sfValidatorString
验证器的最小大小4字符。在这种情况下,使用sfValidatorAnd
验证器将两个验证器,通过两个sfValidatorEmail
和sfValidatorString
验证器作为参数:
这个美元- >形式- >setValidators(数组(“名字”= >新sfValidatorString(),“电子邮件”= >新sfValidatorAnd(数组(新sfValidatorEmail(),新sfValidatorString(数组(“min_length”= >4)),),数组(“要求”= >假)),“主题”= >新sfValidatorString(),“消息”= >新sfValidatorString(数组(“min_length”= >4))));
如果两个验证器是有效的,那么电子邮件
字段声明有效。类似地,您可以使用sfValidatorOr
验证器结合几个验证器。如果其中一个验证器是有效的,那么字段声明有效。
每一个无效的验证器结果变成一个错误消息。这些错误消息在英语,但使用symfony国际化助手;ob娱乐下载如果您的项目使用其他语言,你可以很容易地与i18n词典翻译错误消息。另外,每一个验证器提供了一个第三个参数定制的错误消息。每一个验证器都有至少两个错误消息:要求
消息和无效的
消息。一些验证器可以显示错误消息不同的目的,并将永远支持最重要的错误消息通过他们的第三个参数:
/ /模块/ foo /行动/ actions.class.php这个美元- >形式- >setValidators(数组(“名字”= >新sfValidatorString(),“电子邮件”= >新sfValidatorEmail(数组(),数组(“要求”= >请提供一个电子邮件的,“无效”= >请提供一个有效的电子邮件地址(me@example.com)”)),“主题”= >新sfValidatorString(),“消息”= >新sfValidatorString(数组(“min_length”= >4),数组(“要求”= >请提供消息的,“min_length”= >“请提供更长的信息(至少4个字符)))));
自然,这些自定义消息将呈现模板通过i18n帮手,所以任何多语言应用程序也可以在字典翻译自定义错误消息(有关详细信息,请参阅第13章)。
将一个验证器应用于几个字段
上面使用的语法来定义验证器形式不允许验证两个字段都是有效的在一起。例如,在注册表单,通常有两种密码
字段必须匹配,否则拒绝登记。每个密码字段是无效的,只有有效的与其他相关领域。
这就是为什么你可以设置一个验证器通过“多个”setPostValidator ()
设置验证器工作在多个值。后验证器毕竟是执行其他验证器和接收清除值的数组。如果你需要验证原始输入表单数据,使用setPreValidator ()
方法相反。
一个典型的注册表单定义是这样的:
/ /模块/ foo /行动/ actions.class.php/ /定义形式这个美元- >形式=新sfForm();这个美元- >形式- >setWidgets(数组(“登录”= >新sfWidgetFormInputText(),“密码”= >新sfWidgetFormInputText(),“2”= >新sfWidgetFormInputText());这个美元- >形式- >setValidators(数组(“登录”= >新sfValidatorString(),/ /登录是必需的“密码”= >新sfValidatorString(),/ /密码是必需的“2”= >新sfValidatorString(),/ / 2是必需的));这个美元- >形式- >setPostValidators(新sfValidatorSchemaCompare(“密码”,“= =”,“2”));
的sfValidatorSchemaCompare
验证器是一种特殊的多个验证器接收所有清理值并能捡起他们两个比较。当然,您可以定义多个验证器使用sfValidatorAnd
和sfValidatorOr
验证器。
验证器
ob娱乐下载Symfony提供了相当多的验证器。记住,每一个验证器接受选项数组和数组作为参数的错误,你至少可以定制要求
和无效的
错误消息。
/ /字符串验证器美元的形式- >setValidator(“消息”,新sfValidatorString(数组(“min_length”= >4,“max_length”= >50,),数组(“min_length”= >请发布一个长信息的,“max_length”= >请更详细的,)));/ /数字验证器美元的形式- >setValidator(“年龄”,新sfValidatorNumber(数组(/ /使用武力“sfValidatorInteger”相反,如果你想整数值“最小值”= >18,“马克斯”= >99.99,),数组(“最小值”= >“你必须18或多个使用这个服务,“马克斯”= >“你在跟我开玩笑吧?30岁以上的人可以\ '甚至t使用互联网的,)));/ /邮箱验证器美元的形式- >setValidator(“电子邮件”,新sfValidatorEmail());/ / URL验证器美元的形式- >setValidator(“网站”,新sfValidatorUrl());/ /正则表达式验证器美元的形式- >setValidator(“知识产权”,新sfValidatorRegex(数组(“模式”= >“^ [0 - 9]{3}\。[0 - 9]{3}\。[0 - 9]{2}\。[0 - 9]{3}$”)));
尽管一些表单控件(下拉列表、复选框、单选按钮组)限制可能的选择,恶意用户可以尝试破解表单通过操纵Firebug或提交查询的页面脚本语言。因此,你也应该验证字段只接受有限阵列的价值观:
/ /逻辑验证器美元的形式- >setValidator(“has_signed_terms_of_service”,新sfValidatorBoolean());/ /选择验证器(限制值列表中)美元的形式- >setValidator(“主题”,新sfValidatorChoice(数组(“选择”= >数组(“主题”,“B”主题,“C”主题))));/ /验证器多个选择美元的形式- >setValidator(“语言”,新sfValidatorChoice(数组(“多”= >真正的,“选择”= >数组(“en”= >“英语”,“fr”= >“法国”,“其他”))));
I18n选择验证器存在国家列表(sfValidatorI18nChoiceCountry
)和语言列表(sfValidatorI18nChoiceLanguage
)。这些确认器接受限制的列表国家
和语言
如果你想限制可能的选项。
的sfValidatorChoice
验证器通常用于验证sfWidgetFormChoice
小部件。由于您可以使用sfWidgetFormChoice
为外键列部件,所以symfony还提供了一个验证器检查,外键值存在于外ob娱乐下载国表:
/ /验证器推动的选择美元的形式- >setValidator(“section_id”,新sfValidatorPropelChoice(数组(“模型”= >“节”,“列”= >“名字”)));/ /原则选择验证器美元的形式- >setValidator(“section_id”,新sfValidatorDoctrineChoice(数组(“模型”= >“节”,“列”= >“名字”)));
另一个有用的Model-related验证器是sfValidatorPropelUnique
验证器,检查一个新值通过一种形式进入不与现有的价值冲突与一个唯一索引数据库列。例如,两个用户不能有相同的登录
,所以当编辑用户
对象的形式,您必须添加一个sfValidatorPropelUnique
验证器这一列:
/ /推动独一无二的验证器美元的形式- >setValidator(“昵称”,新sfValidatorPropelUnique(数组(“模型”= >“用户”,“列”= >“登录”)));美元的形式- >setValidator(“昵称”,新sfValidatorDoctrineUnique(数组(“模型”= >“用户”,“列”= >“登录”)));
让你更加安全,避免形式跨站点请求伪造攻击,您可以启用CSRF保护:
/ / CSRF保护——设置一个随机字符串,没人知道的秘密美元的形式- >addCSRFProtection(“flkd445rvvrGV34G”);
提示
你可以设置CSRF秘密一旦整个网站settings.yml
文件:
#在应用程序/ myapp / config /设置。yml: .settings: #形式安全秘密(CSRF保护)csrf_secret: # # # # # csrf_secret独特的秘密启用CSRF保护或假禁用
多个验证器处理整个形式,而不是一个单一的输入。这是一个可用多个验证器的列表:
/ /验证器进行比较,比较两个字段美元的形式- >setPostValidator(新sfValidatorSchemaCompare(“密码”,“= =”,“2”));/ /额外的字段验证器:查找请求没有出现在表单中的字段美元的形式- >setOption(“allow_extra_fields”,假);美元的形式- >setOption(“filter_extra_fields”,真正的);
替代方法使用一种形式
表单类
与所有小部件选项,验证器和形式参数,联系人表单定义写在动作类看起来很混乱:
/ /模块/ foo /行动/ actions.class.php/ /定义形式这个美元- >形式=新sfForm();这个美元- >形式- >getWidgetSchema()- >setNameFormat(“接触(% s)”);这个美元- >形式- >getWidgetSchema()- >setIdFormat(“my_form_ % s”);这个美元- >形式- >setWidgets(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInput(数组(“默认”= >“me@example.com”)),“主题”= >新sfWidgetFormChoice(数组(“选择”= >数组(“主题”,“B”主题,“C”主题))),“消息”= >新sfWidgetFormTextarea(),));这个美元- >形式- >setValidators(数组(“名字”= >新sfValidatorString(),“电子邮件”= >新sfValidatorEmail(),“主题”= >新sfValidatorString(),“消息”= >新sfValidatorString(数组(“min_length”= >4))));
最好的做法是创建一个表单实例化的类具有相同属性和使用它的所有操作。例如,下面是如何创建一个类的接触形式:
/ / lib /形式/ ContactForm.class.php类ContactForm扩展sfForm{受保护的静态美元的科目=数组(“主题”,“B”主题,“C”主题);公共函数配置(){这个美元- >widgetSchema- >setNameFormat(“接触(% s)”);这个美元- >widgetSchema- >setIdFormat(“my_form_ % s”);这个美元- >setWidgets(数组(“名字”= >新sfWidgetFormInputText(),“电子邮件”= >新sfWidgetFormInput(数组(“默认”= >“me@example.com”)),“主题”= >新sfWidgetFormChoice(数组(“选择”= >数组(“主题”,“B”主题,“C”主题))),“消息”= >新sfWidgetFormTextarea(),));这个美元- >setValidators(数组(“名字”= >新sfValidatorString(),“电子邮件”= >新sfValidatorEmail(),“主题”= >新sfValidatorString(),“消息”= >新sfValidatorString(数组(“min_length”= >4))));这个美元- >setDefaults(数组(“电子邮件”= >“me@example.com”));}}
现在联系表单对象的行动从来都不是一件容易的事:
/ /模块/ foo /行动/ actions.class.php/ /定义形式这个美元- >形式=新ContactForm();
改变表单对象
当你使用一个表单类定义,定义表单以外的行动。这使得动态默认值分配相当困难。这就是为什么表单对象需要一个数组的默认值作为其第一个参数:
/ /模块/ foo /行动/ actions.class.php/ /定义形式这个美元- >形式=新ContactForm(数组(“电子邮件”= >“me@example.com”));
您也可以通过调用覆盖现有的部件或验证器设置setWidget ()
或setValidator ()
在现有的字段名。
然而,小部件和验证器是对象在symfony中,并提供一个干净的API来修改它们的属性:ob娱乐下载
/ /模块/ foo /行动/ actions.class.php/ /定义形式这个美元- >形式=新ContactForm();/ /允许多个语言选择美元的形式- >getWidget(“语言”)- >setOption(“多”,真正的);/ /添加一个“性别”选项列表小部件美元的形式- >setWidget(“性别”,新sfWidgetFormChoice(数组(“扩展”= >真正的,“选择”= >数组(“米”= >“男”,“f”= >“女”)),数组(“类”= >“gender_list”)));/ /改变主题的小部件的HTML属性美元的形式- >getWidget(“主题”)- >setAttribute(“禁用”,“禁用”);/ /删除“主题”字段设置(美元的形式(“主题”])/ /注意:你不能删除小部件。删除小部件也会删除相关的验证器/ /改变“min_length”错误消息的验证器美元的形式- >getValidator(“消息”)- >setMessage(“min_length”,消息太短的);/ /使“名称”字段可选美元的形式- >getValidator(“名字”)- >setOption(“要求”,假);
自定义小部件和验证器类
一个自定义小部件是一个简单的类扩展sfWidgetForm
,并提供一个配置()
和一个呈现()
方法。检查现有的代码窗口小部件类部件系统的深入了解。下一个清单提供的代码sfWidgetFormInput
小部件来说明小部件结构:
类sfWidgetFormInputText扩展sfWidgetForm{/ * * *配置当前小部件。*此方法允许每个小部件添加选项或在小部件创建的HTML属性。* * *可用选项:类型:小部件类型(文本默认情况下)* * @param数组$选项的选项数组* @param数组$一组默认的HTML属性* @see sfWidgetForm * /受保护的函数配置(选择美元=数组(),美元的属性=数组()){这个美元- >使用addOption(“类型”,“文本”);这个美元- >setOption(“is_hidden”,假);}/ * * * * *小部件呈现为HTML @param字符串名称元素名称* @param字符串值美元价值显示在这个小部件* @param数组$一个数组的HTML属性合并使用默认的HTML属性* @param数组$错误错误的字段数组* @return字符串一个HTML标记字符串* @see sfWidgetForm * /公共函数渲染(美元的名字,美元的价值=零,美元的属性=数组(),美元的错误=数组()){返回这个美元- >renderTag(“输入”,array_merge(数组(“类型”= >这个美元- >getOption(“类型”),“名字”= >美元的名字,“价值”= >美元的价值),美元的属性));}}
一个确认器类必须扩展sfValidatorBase
并提供一个配置()
和一个doClean ()
方法。为什么doClean ()
而不是validate ()
吗?因为验证器做两件事:检查输入满足一组规则,他们选择干净的输入(例如通过强制类型、修剪、转换日期时间戳字符串,等等)。因此,doClean ()
方法必须返回清洁输入,或扔一个sfValidatorError
例外,如果输入不满足任何验证器的规则。的这个概念,下面是一个例子的代码sfValidatorInteger
验证器。
类sfValidatorInteger扩展sfValidatorBase{/ * * *配置当前验证器。*此方法允许每个验证器验证器创建期间添加选项和错误消息。* * *可用选项:马克斯:* *分钟:允许的最大值最小值允许*可用错误代码:* *马克斯* *分* * @param数组$选项的选项数组* @param数组$消息错误消息数组* @see sfValidatorBase * /受保护的函数配置(选择美元=数组(),美元的消息=数组()){这个美元- >使用addOption(“最小值”);这个美元- >使用addOption(“马克斯”);这个美元- >addMessage(“马克斯”,“%值%”必须小于%马克斯%。”);这个美元- >addMessage(“最小值”,“%值%”必须大于%分钟%。”);这个美元- >setMessage(“无效”,“%值%”不是一个整数。);}/ * * *清洁输入值。* * @param混合美元值输入值* @return混合清洗值* @throws sfValidatorError * /受保护的函数doClean(美元的价值){美元的清洁=intval中(美元的价值);如果(strval(美元的清洁)! =美元的价值){扔新sfValidatorError(这个美元,“无效”,数组(“价值”= >美元的价值));}如果(这个美元- >hasOption(“马克斯”)& &美元的清洁>这个美元- >getOption(“马克斯”)){扔新sfValidatorError(这个美元,“马克斯”,数组(“价值”= >美元的价值,“马克斯”= >这个美元- >getOption(“马克斯”)));}如果(这个美元- >hasOption(“最小值”)& &美元的清洁<这个美元- >getOption(“最小值”)){扔新sfValidatorError(这个美元,“最小值”,数组(“价值”= >美元的价值,“最小值”= >这个美元- >getOption(“最小值”)));}返回美元的清洁;}}
检查部件的symfoob娱乐下载ny API文档和验证器欧宝官网下载app类名称和语法。
侧边栏
使用选项来将参数传递给形式类
形式的一个常见的问题是能够使用应用程序参数,如用户的文化。最快的但是丑陋的方式是通过sfContext实例检索用户实例,使用sfContext: getInstance () - > getUser ()
方法。然而,这种解决方案创建一个大的形式和上下文之间的耦合,使测试和可重用性更加困难。为了避免这个问题,您可以简单地通过使用选项文化
价值形式:
/ /从一个动作公共职能executeContact (sfWebRequest请求美元){$ this - > = new ContactForm形式(数组()数组('文化' = > $ this - > getUser () - > getCulture ()));}/ /从一个单元测试形式= new ContactForm(数组()数组(“文化”= >“en”));类ContactForm延伸sfForm{公共职能配置(){/ *……* / $ this - > setWidget(“国家”,新的sfWidgetFormI18NCountry(数组(“文化”= > $ this - > getOption('文化'))));/ *……* /}}
基于模型形式
形式的主要方式是在web应用程序中编辑数据库记录。和大多数形式在symfony应用程序ob娱乐下载允许编辑的模型对象。但必要的信息来构建一个表单来编辑一个模型已经存在:它是在模式中。所以sob娱乐下载ymfony提供了一种发电机模型对象,这使得model-editing形式快速的创建。
请注意
下面描述相似的特征的存在主义。
生成模型形式
ob娱乐下载Symfony可以推导出小部件类型和模型的验证器使用编辑形式,基于模式。采取以下模式,例如推动ORM:
/ /配置/模式。yml推动:文章:id: ~标题:{类型:varchar(255),要求:真实}蛞蝓:{类型:varchar(255),要求:真的,指数:独特}内容:用longvarchar is_published:{类型:布尔,要求:真}author_id:{类型:整数,要求:真的,foreignTable:作者,foreignReference: id、OnDelete:级联}created_at: ~作者:id: ~ first_name: varchar (20) last_name: varchar(20)电子邮件:{类型:varchar(255),要求:真的,指数:独特}活跃:布尔
一个表单来编辑的文章
对象应该使用一个隐藏的小部件id
的文本小部件标题
,一个字符串验证器标题
等。Symfoob娱乐下载ny生成表单,提供你所说的推动:构建表单
任务:
/ /推动美元php symfoob娱乐下载ny推动:构建表单/ /学说美元php symfony学说:构建表单
每个表的模型中,这个命令下创建两个文件lib /形式/
目录:BaseXXXForm
类,覆盖每次调用推动:构建表单
任务,和一个空XXXForm
类,扩展。它是相同的系统推进模型类的一代。
生成的lib /形式/基地/ BaseArticleForm.class.php
包含翻译成小部件和列定义的验证器文章
表中schema.yml
:
类BaseArticleForm扩展BaseFormPropel{公共函数设置(){这个美元- >setWidgets(数组(“id”= >新sfWidgetFormInputHidden(),“标题”= >新sfWidgetFormInputText(),“鼻涕虫”= >新sfWidgetFormInputText(),“内容”= >新sfWidgetFormTextarea(),“is_published”= >新sfWidgetFormInputCheckbox(),“author_id”= >新sfWidgetFormPropelChoice(数组(“模型”= >“作者”,“add_empty”= >假)),“created_at”= >新sfWidgetFormDatetime(),));这个美元- >setValidators(数组(“id”= >新sfValidatorPropelChoice(数组(“模型”= >“文章”,“列”= >“id”,“要求”= >假)),“标题”= >新sfValidatorString(数组(“max_length”= >255年)),“鼻涕虫”= >新sfValidatorString(数组(“max_length”= >255年)),“内容”= >新sfValidatorString(数组(“max_length”= >255年,“要求”= >假)),“is_published”= >新sfValidatorBoolean(),“author_id”= >新sfValidatorPropelChoice(数组(“模型”= >“作者”,“列”= >“id”)),“created_at”= >新sfValidatorDatetime(数组(“要求”= >假)),));这个美元- >setPostValidator(新sfValidatorPropelUnique(数组(“模型”= >“文章”,“列”= >数组(“鼻涕虫”))));这个美元- >widgetSchema- >setNameFormat(“文章(% s)”);父::设置();}公共函数getModelName(){返回“文章”;}}
注意,尽管id
列是一个整数,symfony检查提交的表中的ob娱乐下载id存在使用sfValidatorPropelChoice
验证器。表单生成器总是集最强的验证规则,以确保最干净的数据库中的数据。
使用模型形式
您可以自定义生成的表单类整个项目通过将代码添加到空的ArticleForm::配置()
方法。
这是一个例子的模型形式处理行动。这种形式的鼻涕虫
修改验证器,使其可选的,以及author_id
定制小部件显示只有一个子集的作者——“活跃”的。
/ / lib /形式/ ArticleForm.class.php公共函数配置(){这个美元- >getWidget(“author_id”)- >setOption(“标准”,这个美元- >getOption(“标准”));这个美元- >getValidator(“鼻涕虫”)- >setOption(“要求”,假);}/ /模块/ foo /行动/ actions.class.php公共函数executeEditArticle(美元的请求){$ c=新标准();$ c- >添加(AuthorPeer::活跃的,真正的);这个美元- >形式=新ArticleForm(ArticlePeer::retrieveByPk(美元的请求- >getParameter(“id”)),数组(“标准”= >$ c));如果(美元的请求- >isMethod(“职位”)){这个美元- >形式- >绑定(美元的请求- >getParameter(“文章”));如果(这个美元- >形式- >isValid()){美元的文章=这个美元- >形式- >保存();这个美元- >重定向(“文章/编辑? id =”。美元的作者- >getId());}}}
通过关联数组而不是设置默认值,模型形式使用小部件模型对象来初始化值。显示一个空的表单,就通过一个新的模型对象。
表单提交处理大大简化的对象有一个嵌入式模型对象。调用$ this - >形式- >保存()
在一个有效的形式更新嵌入式文章
对象与清洁值和触发器save ()
方法文章
对象,以及相关对象是否存在。
提示
处理表单所需的操作代码几乎总是一样的,但是这不是一个理由复制从一个模块到另一个。ob娱乐下载Symfony提供了一个模块的整个行动和模板代码生成器创建通过Symfony形式操纵一个模型对象。
结论
symfob娱乐下载ony的表单组件是整个框架的。它促进了显示视图的形式通过小部件,它促进了验证和处理通过验证器控制器的形式,它通过模型形式促进模型对象的版本。虽然设计一个清晰的MVC分离,形成sub-framework总是容易使用。大多数时候,代码生成将减少您的自定义表单几行代码。
有比这更在symfony的形式类章公开。ob娱乐下载事实上,有一个整本书通过使用示例描述它的所有功能。如果表单框架本身不提供小部件或你需要的验证器,它的目的是在这样一个可扩展的方式,你只需要写一个类来得到你的需要。
这项工作是GFDL许可执照。