2013-03-12 48 views
1

我使用CodeIgniter 2.3.1並在config中創建了form_validation.php文件,其內容如下。CodeIgniter自定義驗證功能不工作

<?php 
    $config = array(
array(
    'field' => 'firstname', 
    'label' => 'First Name', 
    'rules' => 'required' 
), 
array(
    'field' => 'lastname', 
    'label' => 'Last Name', 
    'rules' => 'required' 
), 
array(
    'field' => 'email', 
    'label' => 'Email', 
    'rules' => 'required|valid_email|callback_unique_email' 
), 
array(
    'field' => 'password', 
    'label' => 'Password', 
    'rules' => 'required|matches[confirm_password]' 
), 
array(
    'field' => 'confirm_password', 
    'label' => 'Confirm Password', 
    'rules' => 'required' 
) 
); 

function unique_email($email) { 
if($email == '[email protected]') { 
    $this->form_validation->set_message('unique_email', 'Hello World !'); 
    return false; 
} 
} 

?> 

而且檢查user控制器的form_validationregister功能。代碼如下。

public function register() { 
    $this->load->helper('form'); 
    $data['message'] = ''; 
    if($this->input->post('submit')) { 
     $this->load->library('form_validation'); 
     if($this->form_validation->run() == FALSE) { 
      $data['message'] = 'User could not be saved.'; 
     } else { 
      $user_data['firstname'] = $this->input->post('firstname'); 
      $user_data['lastname'] = $this->input->post('lastname'); 
      $user_data['email'] = $this->input->post('email'); 
      $user_data['password'] = md5($this->input->post('password')); 
      if($this->user_model->insert($user_data)) { 
       if($this->user_model->login($user_data)) { 
        $this->session->set_flashdata('message', 'User saved successfully.'); 
        redirect('/user', 'refresh'); 
       } 
      } 
     } 
    } 

    $this->load->view('user/register', $data); 
} 

但我沒有得到自定義方法的驗證消息。請告訴我該怎麼做?這項工作更受讚賞。

+1

自定義函數屬於該函數的控制器中的形式。 – Rooneyl 2013-03-12 14:42:37

+0

請看下面的Spikers回答並閱讀手冊。知道最終你也可以將你的表單驗證放入模型中,並將數據庫函數放入模型中,然後將true/false返回給控制器。如果爲false,表單驗證的所有錯誤消息等功能仍然有效,則不必在控制器中。 – cartalot 2013-03-12 18:03:45

回答

1

我用這個答案,並得到了錯誤:

無法訪問與您的字段名稱錯誤消息。

函數_unique_email改爲set_message('unique_email','Hello World!');應該是set_message('_ unique_email','Hello World!');像這樣:

function _unique_email($email) { 
    if($email == '[email protected]') { 
     $this->form_validation->set_message('_unique_email', 'Hello World !'); 
     return false; 
    } 
} 
+0

這應該在評論部分,因爲它不回答問題。 – Kezz101 2013-03-31 14:08:24

3

看一看下列文件:http://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#callbacks

正如你所看到的文檔int,則自定義驗證函數實際上屬於在控制器中,而不是在配置文件中。通過將驗證功能移到控制器,回調函數應該開始被調用。

另一個有趣的事實是,人們可以通過一個url訪問這個unique_email函數(即http://yoursite.com/index.php/user/unique_email)。爲了避免這種情況,我們可以通過簡單地將一個下劃線在函數的開始,像這樣寫函數作爲私有函數:

function _unique_email($email) { 
    ... 
} 

然後,您可以通過使用新的函數名調用你的驗證功能在你的配置(注意回調額外的下劃線:

array(
    'field' => 'email', 
    'label' => 'Email', 
    'rules' => 'required|valid_email|callback__unique_email' 
) 

最後,你的控制器應類似於以下內容:

class User extends CI_Controller { 

    public function register() { 
     $this->load->helper('form'); 
     $data['message'] = ''; 
     if($this->input->post('submit')) { 
      $this->load->library('form_validation'); 
      if($this->form_validation->run() == FALSE) { 
       $data['message'] = 'User could not be saved.'; 
      } else { 
       $user_data['firstname'] = $this->input->post('firstname'); 
       $user_data['lastname'] = $this->input->post('lastname'); 
       $user_data['email'] = $this->input->post('email'); 
       $user_data['password'] = md5($this->input->post('password')); 
       if($this->user_model->insert($user_data)) { 
        if($this->user_model->login($user_data)) { 
         $this->session->set_flashdata('message', 'User saved successfully.'); 
         redirect('/user', 'refresh'); 
        } 
       } 
      } 
     } 

     $this->load->view('user/register', $data); 
    } 

    function _unique_email($email) { 
     if($email == '[email protected]') { 
      $this->form_validation->set_message('unique_email', 'Hello World !'); 
      return false; 
     } 
    } 

} 

你CON圖將類似於如下:

$config = array(
    array(
     'field' => 'firstname', 
     'label' => 'First Name', 
     'rules' => 'required' 
    ), 
    array(
     'field' => 'lastname', 
     'label' => 'Last Name', 
     'rules' => 'required' 
    ), 
    array(
     'field' => 'email', 
     'label' => 'Email', 
     'rules' => 'required|valid_email|callback__unique_email' 
    ), 
    array(
     'field' => 'password', 
     'label' => 'Password', 
     'rules' => 'required|matches[confirm_password]' 
    ), 
    array(
     'field' => 'confirm_password', 
     'label' => 'Confirm Password', 
     'rules' => 'required' 
    ) 
);