CodeIgniter的表单辅助函数:输入数据让我们把目光转向你如何使用你的HTML页。 任何动态的网 站最重要部份之一是和用户互动,而且这通常意味着使用HTML 表单。 CodeIgniter的表单辅助函数是非常有用的代码片断。 它有一个稍稍不同的定义,使表单创建起来比较
CodeIgniter的表单辅助函数:输入数据让我们把目光转向你如何使用你的HTML页。
任何动态的网站最重要部份之一是和用户互动,而且这通常意味着使用HTML表单。
CodeIgniter的表单辅助函数是非常有用的代码片断。
它有一个稍稍不同的定义,使表单创建起来比较容易。我们建立一个表单,这个表单允许我们在浏览器中录入数据。在websites数据库的sites表中,我们想要录入网站的名字、类型和网址,和更新的日期。
你能用简单的HTML代码建立表单,
或者你能在一个控制器内建立它,把它赋给一个变量,然后调用视图,而且传送该变量到视图。
下面是按照第二种方式做。
第一,我们必须装载表单辅助函数到我们需要使用它的控制器内。然后,我们把下列的代码放入控制器的构造函数:
$this->load->helper('form');
$variable.='';
$variable.=form_input('name',''');
(记得'name'是输入项的名称,'value'是你想输入的内容。在这里可以设定value的初始值,或你能动态地从表单中获取。)嗯,你可能会说,48个字符变成33个字符,没少几个字符,特别是我必须先装载这个辅助函数(另外的28个字符)。何必呢?理由如下:
1、使用表单辅助函数的好处之一:清楚使用CI表单辅助函数的第一个好处是你的代码绝对的清
楚。如果你想要一个比较精细的输入框,如果用HTML是这样的:
$variable='
(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代码编写:
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_open('websites/update');
下面来简单的分析一个“Display”模型,也就是MVC中的Model。
作为示范(稍微简化了一下),这里是Display模型:
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']=''; /*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 设置验证规则
在你的表单指定的那个函数中装载验证类并声明你的校验规则:
$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);
$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'); //插入文本框。等价于: // $data=array( 'name' => 'url', 'id' => 'url', 'value' => 'www.mysite.com', 'maxlength' => '100', 'size' => '50', 'style' => 'yellow' ); echo form_input($data); //使用数组的方式部署表单的信息。等价于: // echo form_hidden('updated','date is 2013/02/08'); //隐藏的数据。等价于: // $data=array( 'name' =>'url', 'id' =>'url', 'value' =>'www.mysite.com' ); echo form_textarea($data); //设置文本区域。等价于 // $urlarray=array( '1' =>'www.this.com', '2' =>'www.that.com', '3' =>'www.theother.com' ); echo form_dropdown('url',$urlarray,'1'); //设置下拉菜单。等价于 //