2010/02/15

[CodeIgniter] Form Validation

春節還是寫一下程式XDD
在報名頁面有FROM讓使用者填寫資訊,你知道人總會手誤嘛!
所以一定得做檢查,讓使用者第一時間做修正,以往都是用JavaScript在前端檢查,後端則做簡易的檢查。
而CI提供的From Validation則是屬於後端的檢查。


引入Library
由於並不是每個頁面都需要,我選擇只在報名功能(signup/join)內引入,而非在建構子(Constructor) 內引入
$this->load->library('form_validation');
使用方法:$this->form_validation->函式();


加入驗證規則
如果沒有設規則,那就沒有意義了XDD
設定規則的方法:$this->form_validation->set_rules('名稱','給人看的描述','規則');
範例:$this->form_validation->set_rules('name','Your Name','required');
設定<input name='name'>是需要填寫的(required),如果有錯誤會提示'Your Name'沒有填寫


在報名頁面中,我設定以下的規則來驗證
$this->form_validation->set_rules('name','Your Name','required');
$this->form_validation->set_rules('sex','Sex','required');
$this->form_validation->set_rules('mobile','Mobile Phone','required|max_length[10]');
max_length[10] 限制最大長度為10

改寫處理程序
之前只有用$this->input->post('name')來檢查是不是有post資料,有則做新增,無則顯示form。簡易流程如下。
if( !$this->input->post('name') ){
  //無資料送過來,顯示form
}else{
  //有資料,做新增
}
改為依據驗證程序是否執行判斷(有跑過表示有送資料也通過驗證規則)
檢測是否有執行是使用$this->form_validation->run()
if( $this->form_validation->run() == FALSE ){
  //驗證程序未執行,可能為無資料或資料不正確,顯示form
}else{ 
  //驗證通過,做新增
}

在表單顯示錯誤訊息
為了讓使用者知道哪些欄位沒通過驗證規則,要在view中加入:
<?php echo validation_errors(); ?>
validation_errors()會顯示所有錯誤的訊息,預設是使用<p>包裝,可使用
$this->form_validation->set_error_delimiters('<div>','</div>');
來更改包圍物件,或可改為每個錯誤獨立顯示,如:
<input name='欄位名稱'><?php echo form_error('欄位名稱'); ?>


顯示自設的錯誤訊息
不喜歡預設的錯誤說明敘述可以使用set_message來更改
$this->form_validation->set_message('驗證條件','錯誤訊息');
可在說明中加入%s來顯示set_rule內的第二個參數文字
$this->form_validation->set_message('required','欄位%s未填寫');
$this->form_validation->set_message('max_length','欄位%s超過限定值%d');
我另外發現在限制字數可以增加%d來顯示限制的字元數


重新顯示填入的資料
Text使用set_value('欄位名稱');
<input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" />
Radio, Checkbox, Select 則使用set_radio(), set_checkbox(), set_select();
<input type="radio" name="myradio" value="1" <?php echo set_radio('myradio','1',TRUE); ?> />
<input type="radio" name="myradio" value="2" <?php echo set_radio('myradio','2'); ?> />


搭配Form Helper
TEXT: form_input('name',set_value('name') )
RADIO: form_radio('sex','m', (set_value('sex')=='m')?TRUE:FALSE )

修正驗證錯誤後的頁面錯誤

原因是因為當發生驗證錯誤時,返回的網址並沒有參加活動的sn
http://127.0.0.1/ci/signup/join
所以造成程式無法抓取活動的名稱,在新增資料時也會錯誤
只要將view內的form_open修正即可
從 <?php echo form_open('signup/join');?>
修正為<?php echo form_open('signup/join/'.$this->uri->segment(3));?>

原始碼 controller: signup.php
function join(){ 
    $this->load->library('form_validation');
    $this->form_validation->set_rules('name','Your Name','required');
    $this->form_validation->set_rules('sex','Sex','required');
    $this->form_validation->set_rules('mobile','Mobile Phone','required|max_length[10]');
    $this->form_validation->set_message('required','欄位%s未填寫');
    $this->form_validation->set_message('max_length','欄位%s超過限定值%d');  

    if( $this->form_validation->run() == FALSE ){
        $data['title'] = '報名';    

        $query = $this->mevent->get_one( $this->uri->segment(3) );
        $data['event_name'] = $query['topic'];  
        $data['content'] = 'join_form';
        $this->load->view('index',$data);
    }else{
        echo 'Success';  
        $insert_id = $this->mjoiner->add();   
        if( $insert_id ){   
            redirect('/signup/joininfo/'.$insert_id,'refresh');
        }else{
            echo "error";
            exit;
        }
    }
}


這篇寫的好爛= =,應該只有我自己看的懂

沒有留言:

張貼留言