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模型:
<?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 設置驗證規則
在你的表單指定的那個函數中裝載驗證類并聲明你的校驗規則:
$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>
下一篇 PHP采集程序中常用的函數