[PHP]架構CodeIgniter中的表單教程

來源:互聯網
上載者:User

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 setsvariables */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 inthe 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錄入表單,通過表單輔助函數簡化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>
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.