程序员人生 网站导航

[PHP]框架CodeIgniter中的表单教程

栏目:codeigniter时间:2014-04-24 09:40:16

CodeIgniter的表单辅助函数:输入数据让我们把目光转向你如何使用你的HTML页。

任何动态的网站最重要部份之一是和用户互动,而且这通常意味着使用HTML表单。

CodeIgniter的表单辅助函数是非常有用的代码片断。

它有一个稍稍不同的定义,使表单创建起来比较容易。我们建立一个表单,这个表单允许我们在浏览器中录入数据。在websites数据库的sites表中,我们想要录入网站的名字、类型和网址,和更新的日期。

你能用简单的HTML代码建立表单,

或者你能在一个控制器内建立它,把它赋给一个变量,然后调用视图,而且传送该变量到视图。

下面是按照第二种方式做。

第一,我们必须装载表单辅助函数到我们需要使用它的控制器内。然后,我们把下列的代码放入控制器的构造函数:

$this->load->helper('form');

然后,我们必须开始编写表单。现在,为了生成表单的输入项,我们不用这样写:

$variable.='<inputtype="text"name="name"value="">';

CI允许你这样做:
$variable.=form_input('name',''');
(记得'name'是输入项的名称,'value'是你想输入的内容。在这里可以设定value的初始值,或你能动态地从表单中获取。)

嗯,你可能会说,48个字符变成33个字符,没少几个字符,特别是我必须先装载这个辅助函数(另外的28个字符)。何必呢?理由如下

1使用表单辅助函数的好处之一:清楚使用CI表单辅助函数的第一个好处是你的代码绝对的清

楚。如果你想要一个比较精细的输入框,如果用HTML是这样的:

$variable='<input type="text" name="url" id="url" value="www.mysite.com" maxlength="100" size="50" style="yellow"/>';

(type是输入框的类型:text、hidden等等。name是将在$_POST数组中取得的变量名称。id是在网页上定
位这个输入框的标识符,如果你使用JavaScript的话。value是输入框里显示的值,它一开始是一个默认值,用户也
可以在输入一个新的值。maxlength和size是明显的;style一组HTML格式或者在css style sheet中定义。)
CI用一个数组代替上述的HTML代码:

$data=array('name' => 'url','id' => 'url','value' => 'www.mysite.com','maxlength' => '100','size' => '50','style' => 'yellow');$variable=form_input($data);

它看上去蛮长的,实际上并不比HTML代码长,而且,它非常清楚,容易理解和维护。而且是动态的。
隐藏的表单输入框非常简单。如果我们想要自动地记录我们的数据库被更新的日期。我们把日期放入一个$date变量,然后:

form_hidden('updated',$date);

如果你想要一个'文本'输入框,给你的使用者提供一个可以输入超过一行的地方,可以使用CI的form_textarea()函数,下面的代码使用默认的长度,在网页上显示一个文件输入框:

$data=array('name' =>'url','id' =>'url','value' =>'www.mysite.com');$variable=form_textarea($data);

CI的表单辅助函数在你编写下拉框,多选框和单选框时特别有用,如果我们要改变我们的URL输入框为一个下拉框,允许用户从下拉列表中选取一个URL。首先,把下拉列表的选项存入一个数组,然后调用form_dropdown()函数:

$urlarray=array('1' =>'www.this.com','2' =>'www.that.com','3' =>'www.theother.com');$variable=form_dropdown('url',$urlarray,'1');

被传给表单中url下拉框的第一个参数是输入框的名字;第二个是包含下拉列表的数组,第三个默认选项。换句话说,如果使用者接受默认值,你的$_POST数组将会包含值'url=>1',但是你的用户将会见到选项'www.this.com'。
如果使用HTML代码编写:

<select name="type"><option value="1" selected="selected">www.this.com</option><option value="2">www.that.com</option><option value="3">www.theother.com</option></select>

CI实现的代码实际上比较短,很容易学会。
如果你在一个数据库表('urls')中储存你的可能选择的网址的目录,那么生成一个动态下拉框很容易。首先把数据从表中读出放到一个数组中:


$urlarray = array();$this->db->select('id,url');$query=$this->db->get('urls');if($query->num_rows()>0){	foreach($query->result() as $row)	{		$urlarray[$row->id]=$row->url;	}}

然后重复我们以前用过的CIform_dropdown()功能:

echoform_dropdown('type',$urlarray,'1');

只有$urlarray的内容会发生变化;代码总是一样的。
如果你正在更新一个表中的记录而不是插入,你不想为你的用户显示默认值。你想要为那一个记录显示已经存在的值。你应该已经知道你想要的修改的记录的id值,因此,你需要先读取数据库中'site'表中相关记录。确定把查询结果赋给一个变量,使用第二个变量取出第一个变量的中的相关记录,再调用CI的form_dropdown函数,把第二个变量和对应的列名作为参数传入:

$this->db->select('id,url,name');$this->db->where('id','$id')$sitequery=$this->db->get('sites');$siterow=$sitequery->row();

然后你的CI下拉框函数会从中读取相关信息:

echoform_dropdown('url',$urlarray,$siterow->url);

没有太多的篇幅讨论所有的表单辅助函数。它还能编写单选框,隐藏文件框,多选框和一些其它的输入框,完整的资料请参考CI用户手册。

2、使用表单辅助函数的好处之二:自动化
使用表单辅助函数的第二个好处是可以自动化实现一些功能,不然的话,你只能自己编写相关的脚本了。首先,它拦截HTML的一些字符,比如用户输入的引号,并且
转义它们以免破坏表单。其次,它自动链接。当你打开一个表单时,你必须声明目标页,它将会接受表单的数据并且处理它。(在CI中,这是一个控制器里面的一个功能而不是一个静态页。比如它指向控制器的更新函数。)因此,如果你用纯HTML代码,你将会这样写:

<form method="post"	action="http:/www.mysite.com/index.php/websites/update"/>

如果你用CI打开你的表单,你只需要这样做:
form_open('websites/update');

CI自动地在你的config文件中取出基本URL并定位到对应的控制器函数。再次强调,如果你迁移你的网站,你只需要修改config文件,而不是去一个一个地修改代码文件。顺便提一下,CI假定你的表单将会总是以POST的方式提交数据而不是GET方式。CI普遍使用URL本身,因此,不要搞错。


下面来简单的分析一个“Display”模型,也就是MVC中的Model。
作为示范(稍微简化了一下),这里是Display模型:

<?phpclass Display extends CI_Model{	/*create the array to pass to the views*/	var $data=array();	/*two other class variables*/	var $base;	var $status='';	/*the constructor function: this calls the 'model' parent class	 *loads other CI libraries and helper sit requires,and dynamically sets	variables	 */	function Display()	{		parent::CI_Model();		$this->load->helper('form');		$this->load->library('user_agent');		$this->load->library('errors');		$this->load->library('menu');		$this->load->library('session');		/*now set the standard parts of the array*/		$this->data['css']=$this->config->item('css');		$this->data['base']=$this->config->item('base_url');		$this->base =$this->config->item('base_url');		$this->data['myrobots']='<metaname="robots"	content="noindex,nofollow"/>';		/*note that CI's session stuff doesn't automatically recall the extra variables you have added, so you have to look up the user's status in	the ci_session stable*/		$sessionid=$this->session->userdata('session_id');		$this->db->select('status');		$this->db->where('session_id',$sessionid);		$query=$this->db->get('ci_sessions');		if($query->num_rows()>0)		{			$row=$query->row();			$this->status=$row->status;		}	}	/*function to assemble a standard page.	 *Any controller can call this.	 *Just supply as $mydata an array,of key/value pairs for the contents you want the view	*to display. 	 *Available variables in this view are:mytitle.menu,mytext,diagnostic	 */	function mainpage($mydata)	{		$this->data['mytitle']='Monitoringwebsite';		$this->data['diagnostic']=$diagnostic;		foreach($mydataas$key=>$variable)		{			$this->data[$key]=$variable;		}		/*here's the menu class*/		$fred=newmenu;		$this->load->library('session');		$mysess=$this->session->userdata('session_id');		if(isset($this->status)&&$this->status>0)		{			$this->data['menu']=$fred->show_menu($this->status);		}		$this->load->view('basic_view',$this->data);	}}?>

用下面的代码在任何的控制器中调用这个主页:

$this->load->model('display');$this->display->mainpage($data);
视图正在被动态地装配,完全符合需要。


下面来看一看CI的验证类。

 在你编写HTML表单时一个重要的工作是检查输入。我们都知道我们应该这样做,但是…直到现在为止,我们已经编写过一种简单的表单,将会信任地接受任何用户输入的任何数据。你应该意识到可能有一些用户是不怀好意的,而且所有的其余都是不负责任的。(别直接告诉他们。)如果他们有可能犯一个简单的错误,他们就会犯。确保你始终检查用户输入的数据,并使它们符合你的要求。你能在客户端用javascript做到这一点,但是这样做作用有限,使用者能容易地绕过它。而在服务器端的校验需要一个额外的信息来回,这点额外的开销是值得的。编写校验代码也相当复杂,但是,你一定猜到了。CI提供了一个验证类可以使这项工作变得非常容易。让我们改变我们自己的表单处理过程来实现校验。你需要在表单里作一些调整,还要在它指向的函数里作一些调整。如果你的表单由form_open('sites/update')开始,你需要修改的函数是'sites'控制器里的'update'函数。如果你没有使用CI的表单辅助函数,HTML等价代码是:

<form method="post" action="http:/www.mysite.com/index.php/sites/update"/>

接下来需要做三件事情:1.设置校验。2.设置控制器。3.设置表单。

1 设置验证规则

在你的表单指定的那个函数中装载验证类并声明你的校验规则:

$this->load->library('validation');$rules['url'] ="required";$rules['name'] ="required";$this->validation->set_rules($rules);

'url'和'name'输入框一定要有输入内容。CI提供了各种操作,确保一些操作一定要进行,用户手册全面地解释了这些内容。
他们的含义非常明了:min_length[6]显然意味着输入的信息长度一定要大于等于六个字符。numeric意味着只能输入数字,等等。
你还能组合规则,用“|”把它们连接起来:

$rules['name']="required|alpha|max_length[12]";

意味着不能为空,字母,长度至少12个字符。你甚至能编写你自己的规则。


2 设置控制器
仍然在相同的函数中,创建一个'if/else'语句:
if($this->validation->run()==FALSE){	$this->load->view('myform');}else{	$this->load->view('success');}

你进行确认测试,而且如果输入内容不能通过测试的话,就再返回到输入页面。(如果你在一个控制器内的一个函数中生成你的视图,则使用$this->myfunction代替$this->load->view('myform')。

如果校验成功,就生成view("success"),告诉用户输入的信息已被接受,然后给出一个链接让他进到下一步。


3 设置表单

录入信息的表单也要做相应的调整。每次校验没有通过的话,你不但要让系统返回到录入界面,而且必须说明哪一项出错,以及为什么出错。因此你必须在表单的某处给出一个附加信息:
$this->validation->error_string;

这行代码显示适当的信息,避免用户在那里犯嘀咕。你也需要自动地填写用户已正确输入的那些内容,否则,用户必须再次录入上一次他们已经正确录入的信息。
首先,你需要在控制器里增加更多的代码。而且是立刻加在校验规则之后,加入一个数组来存放给用户的提示信息。数组的键名是你表单中的输入框名,值是给出的错误提示信息:
-22-$fields['url']='TheURLofyoursite';
然后,增加一行代码:

$this->validation->set_fields($fields);

现在你已经在控制器里声明了一个存有信息的数组,你只需要在表单内加入显示它们的代码。对于HTML代码,这会是:
<input type="text" name="url" value="<?php echo $this->validation->url; ?>"/>

或者,如果你正在使用CI的表单辅助函数:
$variable.=form_input('url',$this->validation->url);

如果使用这个表单插入一个新的记录到数据库的表中,上面的代码已经够用了。如果你正在使用表单更新一个已经输入过的记录,当表单第一次显示时,应该在输入框中显示数据库表中的实际信息,这个时候,它的值应该是从数据库里读回来的(记得前面调用$siterow->url的例子吗?)如果你在更新一个现有的记录时,上一次的录入内容由于一个输入框内容没有录入而无法通过校验,在重新回到表单之前,你需要在通过校验的输入框中填写用户刚录入的信息,而在校验出错的输入框里再次放入从数据库表中读入的信息,否则,你就需要再次录入已经校验通过的信息了。
还好,这可以通过一个简单的“if/else”语句来实现:

if(isset($_POST['url'])){	$myvalue=$this->validation->url;}else{	$myvalue=$siterow->url;}

第一次表单显示的时候,在$_POST数组中将会没有内容;因此你从数据库的相关表中读取信息。但当你提交一次以后,$_POST数组中有数据存在,所以你选择validation函数中返回的值。查阅CI用户手册,了解表单校验的其它内容,你还可以做到:自动地准备你的数据,举例来说,通过它消除可能产生的跨站脚本攻击
编写你自己的复杂校验标准,举例来说,用户录入的值不能已经存在于数据库中编写你自己的错误信息CI的验证类非常有用而又功能强大,值得花时间好好研读并
掌握。


总结:
我们已经学习了CI中生成视图的方法,以及它如何让你创建“迷你-视图”,你能把视图嵌套到其它视图中去。这意谓着你能建立共用的HTML头部和HTML尾部,实现视图的重用。我们也已经见到CI如何帮助你编写HTML录入表单,通过表单辅助函数简化HTM
L表单的编写工作最后,我们学习了CI的验证类,这是检查用户录入信息的
有用工具。没有什么是完美的,但是这个工具的确能阻击你的用户录入垃圾,或企图进行攻击。它也使你的网站看起来更加专业,能够有效地捕捉用户造成的各种输入错误,而不是一味地接受无意义的输入。
在整个学习过程中,我们也再次玩味了MVC的原则,而且有时稍稍地做一些变通会让生活变得更容易。CI有一种非常有柔性的哲学:如果要有效率地解决问题,就要学会灵活地使用工具。



下面来对比一下CI中的代码与最后生成的效果。

/*下面是关于表单提交的几个简单元素*/echo form_input('name','name_value');//插入文本框。等价于://<input type="text" name="name" value="name_value"  />$data=array(	'name' => 'url',	'id' => 'url',	'value' => 'www.mysite.com',	'maxlength' => '100',	'size' => '50',	'style' => 'yellow');echo form_input($data);//使用数组的方式部署表单的信息。等价于://<input type="text" name="url" value="www.mysite.com" id="url" maxlength="100" size="50" style="yellow"  />echo form_hidden('updated','date is 2013/02/08');//隐藏的数据。等价于://<input type="hidden" name="updated" value="date is 2013/02/08" />$data=array(	'name' =>'url',	'id' =>'url',	'value' =>'www.mysite.com');echo form_textarea($data);//设置文本区域。等价于//<textarea name="url" cols="40" rows="10" id="url" >www.mysite.com</textarea>$urlarray=array(	'1' =>'www.this.com',	'2' =>'www.that.com',	'3' =>'www.theother.com');echo form_dropdown('url',$urlarray,'1');//设置下拉菜单。等价于//<select name="url">//<option value="1" selected="selected">www.this.com</option>//<option value="2">www.that.com</option>//<option value="3">www.theother.com</option>//</select>


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐