第10章表单.docx
- 文档编号:14071852
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:40
- 大小:54.06KB
第10章表单.docx
《第10章表单.docx》由会员分享,可在线阅读,更多相关《第10章表单.docx(40页珍藏版)》请在冰点文库上搜索。
第10章表单
为_i_____________________________________________________________________________________________________________________________
第10章表单
可以说,表单占据了开发人员编写模板的大部分时间,而且表单一般都设计得相当糟糕。
由于涉及默认值,数据格式,验证,重填,表单处理等许多内容,开发者常常忽略了表单中的一些重要细节。
而symfony恰恰对这个问题给予了特别的关注。
本章介绍了为加速表单开发而设计的可以自动完成多种要求的开发工具:
∙表单辅助函数提供了一种比较快地在模板中编写表单控件的方法,特别是在编写诸如日期,下拉列表和富文本之类复杂的元素时。
∙如果要用一个表单去编辑一个对象的属性时,利用对象表单辅助函数可以进一步加速模板的编写。
∙YAML验证文件可以方便表单验证和重填。
∙验证器集成了用于验证输入数据的代码,symfony绑定了满足最常用需求的验证器,开发人员也很容易定制自己的验证器。
表单辅助函数
在模板中,表单元素的HTML标签常常和PHP代码混杂在一起。
symfony中的表单辅助函数就是为了减少这种情形的发生并且避免在标签中不断重复
phpecho标签。
主要的表单标签
根据前面章节的介绍,你必须用form_tag()辅助函数创建表单,因为它可以将用参数表示的动作转换为经路由过的URL。
第二个参数还可以支持额外的选项。
例如,可以改变默认的method,可以改变默认的enctype或指定其他的属性,参见例10-1。
例10-1form_tag()辅助函数
phpechoform_tag('test/save')?
>
=>
phpechoform_tag('test/save','method=getmultipart=trueclass=simpleForm')?
>
=>
因为没有必要提供表单结束辅助函数,所以尽管看起来不怎么美观,你仍旧需要加上HTML的标签。
标准的表单元素
有了表单辅助函数,表单中的每个元素都会默认以元素名作为其id属性。
这个约定很有用。
例10-2给出了所有标准表单辅助函数及相关的选项。
例10-2标准表单辅助函数语法
//输入框(textfield)
phpechoinput_tag('name','defaultvalue')?
>
=>
//所有表单辅助函数都接受一个额外的选项参数
//它允许你为生成的标签加上定制的属性
phpechoinput_tag('name','defaultvalue','maxlength=20')?
>
=>
//文本框(textarea)
phpechotextarea_tag('name','defaultcontent','size=10x20')?
>
=>
defaultcontent
//复选框(checkbox)
phpechocheckbox_tag('single',1,true)?
>
phpechocheckbox_tag('driverslicense','B',false)?
>
=>
//单选按钮(Radiobutton)
phpechoradiobutton_tag('status[]','value1',true)?
>
phpechoradiobutton_tag('status[]','value2',false)?
>
=>
//下拉列表(Dropdownlist/select)
phpechoselect_tag('payment',
'
')
?
>
=>
//可选项列表
phpechooptions_for_select(array('Visa','Eurocard','Mastercard'),0)?
>
=>
//混合了可选项的下拉列表辅助函数
phpechoselect_tag('payment',options_for_select(array(
'Visa',
'Eurocard',
'Mastercard'
),0))?
>
=>
//用关联数组指明选项名称
phpechoselect_tag('name',options_for_select(array(
'Steve'=>'Steve',
'Bob'=>'Bob',
'Albert'=>'Albert',
'Ian'=>'Ian',
'Buck'=>'Buck'
),'Ian'))?
>
=>
//可复选的下拉列表(选中值可以是一个数组)
phpechoselect_tag('payment',options_for_select(
array('Visa'=>'Visa','Eurocard'=>'Eurocard','Mastercard'=>'Mastercard'),
array('Visa','Mastecard'),
),array('multiple'=>true)))?
>
=>
//可复选的下拉列表(选中值可以是一个数组)
phpechoselect_tag('payment',options_for_select(
array('Visa'=>'Visa','Eurocard'=>'Eurocard','Mastercard'=>'Mastercard'),
array('Visa','Mastecard')
),'multiple=multiple')?
>
=>
//上传文件域(Uploadfilefield)
phpechoinput_file_tag('name')?
>
=>
//密码输入框(Passwordfield)
phpechoinput_password_tag('name','value')?
>
=>
//隐藏域(Passwordfield)
phpechoinput_hidden_tag('name','value')?
>
=>
//提交按钮(文本格式)(Submitbutton(astext))
phpechosubmit_tag('Save')?
>
=>
//提交按钮(图片格式)(Submitbutton(asimage))
phpechosubmit_image_tag('submit_img')?
>
=>
submit_image_tag()辅助函数使用的语法和image_tag()相同,也具有相同的优点。
NOTE对于单选按钮,id属性没有默认地被设定为name属性的值,而是将name属性值和选项值混合后作为id属性的默认值。
之所以这样做,是为了实现“选中一个就自动去除另一个”的目的,你需要有多个同名的单选按钮标签,而根据前面id=name的约定,将导致在页面中出现多个含有同样id属性的HTML标签,这是被严格禁止的。
SIDEBAR处理表单提交
如何取得用户通过表单提交的数据呢?
这些数据存放在请求参数中,所以动作只要调用$this->getRequestParameter($elementName)就可以取得数据。
在同一个动作中既显示表单又处理表单是一种比较好的方法。
对应不同的请求方法(GET或POST),要么调用表单模板,要么处理表单并将请求重定向到另一个动作去。
//mymodule/actions/actions.class.php
publicfunctionexecuteEditAuthor()
{
if($this->getRequest()->getMethod()!
=sfRequest:
:
POST)
{
//显示表单
returnsfView:
:
SUCCESS;
}
else
{
//对提交的表单加以处理
$name=$this->getRequestParameter('name');
...
$this->redirect('mymodule/anotheraction');
}
}
这段代码要能正常工作,表单处理和表单显示必须在同一个动作中。
//mymodule/templates/editAuthorSuccess.php
...
symfony还专门设计了为后台处理异步请求的表单辅助函数。
下一章有关AJAX的介绍将会提供更详细的信息。
日期输入控件
表单常用于输入日期,而日期格式错误常常是表单提交失败的主要原因。
如果你将rich选项设定为true,则input_date_tag()辅助函数可以用一个交互式的JavaScript日历来帮助用户输入日期,见图10-1所示。
图10-1富日期输入标签
如果未设置rich选项,则辅助函数将会输出三个select标签,可取值为年、月、日的正常取值范围。
你也可以通过调用三个辅助函数select_day_tag(),select_month_tag()和select_year_tag(),来分别显示下拉列表。
这些元素的默认值是当前的年、月、日。
例10-3演示了日期输入辅助函数的应用。
例10-3日期输入辅助函数
phpechoinput_date_tag('dateofbirth','2005-05-03','rich=true')?
>
=>一个文本输入域加一个日期输入控件
//以下辅助函数需要包括日期辅助函数组
phpuse_helper('Date')?
>
phpechoselect_day_tag('day',1,'include_custom=Chooseaday')?
>
=>
...
phpechoselect_month_tag('month',1,'include_custom=Chooseamonthuse_short_month=true')?
>
=>
...
phpechoselect_year_tag('year',2007,'include_custom=Chooseayearyear_end=2010')?
>
=>
...
input_date_tag()辅助函数可接受的日期值是PHP函数strtotime()可以识别的值。
例10-4列出的格式是可以使用的,而例10-5中的格式是严格禁止使用的。
例10-4日期辅助函数可以接受的日期格式
//运行正常
phpechoinput_date_tag('test','2006-04-01','rich=true')?
>
phpechoinput_date_tag('test',1143884373,'rich=true')?
>
phpechoinput_date_tag('test','now','rich=true')?
>
phpechoinput_date_tag('test','23October2005','rich=true')?
>
phpechoinput_date_tag('test','nexttuesday','rich=true')?
>
phpechoinput_date_tag('test','1week2days4hours2seconds','rich=true')?
>
//返回空值
phpechoinput_date_tag('test',null,'rich=true')?
>
phpechoinput_date_tag('test','','rich=true')?
>
例10-5日期辅助函数中的错误日期格式
//日期0=01/01/1970
phpechoinput_date_tag('test',0,'rich=true')?
>
//非英语日期格式不能正常运行
phpechoinput_date_tag('test','01/04/2006','rich=true')?
>
编辑富文本(richtext)
因为集成了TinyMCE和FCKEditor插件,因而可以对
图10-2编辑富文本
这两种插件都需要手工安装。
因为安装方法相同,这里只介绍TinyMCE的安装方法。
你可以从该项目的网站(
例10-6设置TinyMCE库路径
all:
.settings:
rich_text_js_dir:
js/tiny_mce
设置好后,再加入rich=true选项,就可以在文本框内进行富文本编辑了。
你也可以用tinymce_options选项为Javascript编辑器设置定制的选项。
参见例10-7
例10-7富文本框
phpechotextarea_tag('name','defaultcontent','rich=truesize=10x20'))?
>
=>一个具有TinyMCE功能的富文本编辑区
phpechotextarea_tag('name','defaultcontent','rich=truesize=10x20tinymce_options=language:
"fr",theme_advanced_buttons2:
"separator"'))?
>
=>一个具有定制过的TinyMCE功能的富文本编辑区
选择国家和语言
你可能会需要一个可以选择国家的域。
因为在不同的语言中国家名也不相同,所以国家名下拉列表要根据用户的culture值来调整(第13章有culture的详细介绍)。
如例10-8所示,select_country_tag()辅助函数可以完成所有工作,它会按照不同的语言显示国家名,并用ISO标准的国家代码作为选项的值。
例10-8选取国家名称辅助函数
phpechoselect_country_tag('country','AL')?
>
=>
...
类似于select_country_tag()辅助函数,select_language_tag()辅助函数可以显示一个语言名称列表,见例10-9
例10-9选取语言名称辅助函数
phpechoselect_language_tag('language','en')?
>
=>
...
...
对象表单辅助函数
如果利用表单去编辑对象的属性,那么用标准的链接辅助函数去写代码非常
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第10章 表单 10
![提示](https://static.bingdoc.com/images/bang_tan.gif)