Heim >php教程 >php手册 >[PHP]框架CodeIgniter中的表单教程

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

WBOY
WBOYOriginal
2016-06-06 19:57:25998Durchsuche

CodeIgniter的表单辅助函数:输入数据让我们把目光转向你如何使用你的HTML页。 任何动态的网 站最重要部份之一是和用户互动,而且这通常意味着使用HTML 表单。 CodeIgniter的表单辅助函数是非常有用的代码片断。 它有一个稍稍不同的定义,使表单创建起来比较

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

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

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

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

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

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

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

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

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

然后,我们必须开始编写表单。现在,为了生成表单的输入项,我们不用这样写:
$variable.='<inputtype>';</inputtype>

CI允许你这样做:
$variable.=form_input('name',<span><span>''</span></span>');
(记得'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代码,你将会这样写:



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

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


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

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']='';
		/*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等价代码是:



接下来需要做三件事情: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>www.this.com</option>
//<option value="2">www.that.com</option>
//<option value="3">www.theother.com</option>
//</select>


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn