CodeIgniter的表单辅助函数:输入数据让我们把目光转向你如何使用你的HTML页。
任何动态的网站最重要部份之一是和用户互动,而且这通常意味着使用HTML表单。
CodeIgniter的表单辅助函数是非常有用的代码片断。
它有一个稍稍不同的定义,使表单创建起来比较容易。我们建立一个表单,这个表单允许我们在浏览器中录入数据。在websites数据库的sites表中,我们想要录入网站的名字、类型和网址,和更新的日期。
你能用简单的HTML代码建立表单,
或者你能在一个控制器内建立它,把它赋给一个变量,然后调用视图,而且传送该变量到视图。
下面是按照第二种方式做。
第一,我们必须装载表单辅助函数到我们需要使用它的控制器内。然后,我们把下列的代码放入控制器的构造函数:
$this->load->helper('form');
$variable.='<inputtype="text"name="name"value="">';
$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"/>';
$data=array( 'name' => 'url', 'id' => 'url', 'value' => 'www.mysite.com', 'maxlength' => '100', 'size' => '50', 'style' => 'yellow' ); $variable=form_input($data);
form_hidden('updated',$date);
$data=array( 'name' =>'url', 'id' =>'url', 'value' =>'www.mysite.com' ); $variable=form_textarea($data);
$urlarray=array( '1' =>'www.this.com', '2' =>'www.that.com', '3' =>'www.theother.com' ); $variable=form_dropdown('url',$urlarray,'1');
<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>
$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; } }
echoform_dropdown('type',$urlarray,'1');
$this->db->select('id,url,name'); $this->db->where('id','$id') $sitequery=$this->db->get('sites'); $siterow=$sitequery->row();
echoform_dropdown('url',$urlarray,$siterow->url);
2、使用表单辅助函数的好处之二:自动化
使用表单辅助函数的第二个好处是可以自动化实现一些功能,不然的话,你只能自己编写相关的脚本了。首先,它拦截HTML的一些字符,比如用户输入的引号,并且
转义它们以免破坏表单。其次,它自动链接。当你打开一个表单时,你必须声明目标页,它将会接受表单的数据并且处理它。(在CI中,这是一个控制器里面的一个功能而不是一个静态页。比如它指向控制器的更新函数。)因此,如果你用纯HTML代码,你将会这样写:
<form method="post" action="http:/www.mysite.com/index.php/websites/update"/>
form_open('websites/update');
下面来简单的分析一个“Display”模型,也就是MVC中的Model。
作为示范(稍微简化了一下),这里是Display模型:
<?php class 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 设置验证规则
在你的表单指定的那个函数中装载验证类并声明你的校验规则:
$this->load->library('validation'); $rules['url'] ="required"; $rules['name'] ="required"; $this->validation->set_rules($rules);
$rules['name']="required|alpha|max_length[12]";
意味着不能为空,字母,长度至少12个字符。你甚至能编写你自己的规则。
if($this->validation->run()==FALSE) { $this->load->view('myform'); } else { $this->load->view('success'); }
你进行确认测试,而且如果输入内容不能通过测试的话,就再返回到输入页面。(如果你在一个控制器内的一个函数中生成你的视图,则使用$this->myfunction代替$this->load->view('myform')。
3 设置表单
录入信息的表单也要做相应的调整。每次校验没有通过的话,你不但要让系统返回到录入界面,而且必须说明哪一项出错,以及为什么出错。因此你必须在表单的某处给出一个附加信息:$this->validation->error_string;
$this->validation->set_fields($fields);
<input type="text" name="url" value="<?php echo $this->validation->url; ?>"/>
$variable.=form_input('url',$this->validation->url);
if(isset($_POST['url'])) { $myvalue=$this->validation->url; } else { $myvalue=$siterow->url; }
总结:
我们已经学习了CI中生成视图的方法,以及它如何让你创建“迷你-视图”,你能把视图嵌套到其它视图中去。这意谓着你能建立共用的HTML头部和HTML尾部,实现视图的重用。我们也已经见到CI如何帮助你编写HTML录入表单,通过表单辅助函数简化HTML表单的编写工作。最后,我们学习了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>