2011-11-18 31 views
18

Tôi có chức năng trong biểu mẫu đăng nhập để kiểm tra xem email và mật khẩu có khớp với các giá trị trong cơ sở dữ liệu hay không và nếu nó ghi nhật ký người dùng vào hệ thống.Tạo quy tắc xác thực mã tùy chỉnh

Tôi muốn hiển thị lỗi xác thực nếu hàm này trả về false.

Vấn đề của tôi là tôi không chắc chắn về cách tạo điều này. Thông báo liên quan đến cả hai trường mật khẩu và email nên tôi không muốn quy tắc cho mỗi trường nhập chỉ hiển thị một thông báo.

Tôi đã thử sử dụng flashdata để đạt được điều này nhưng nó chỉ hoạt động khi trang đã được làm mới.

Làm cách nào để tạo quy tắc xác thực mới chỉ dành cho hàm $this->members_model->validate_member() ??

$this->form_validation->set_error_delimiters('<div class="error">', '</div>'); 
     $this->form_validation->set_rules('email_address', '"Email address"', 'trim|required|valid_email'); 
     $this->form_validation->set_rules('password', '"Password"', 'trim|required'); 

     if ($this->form_validation->run() == FALSE) 
     { 
      $viewdata['main_content'] = 'members/login'; 
      $this->load->view('includes/template', $viewdata); 
     } 
     else 
     {  
       if($this->members_model->validate_member()) 
       { 

Trả lời

38

Bạn sử dụng callback_ trong các quy tắc của bạn, xem callbacks, cho ex.

$this->form_validation->set_rules('email_address', '"Email address"', 'trim|required|valid_email|callback_validate_member'); 

và thêm phương thức vào bộ điều khiển. Phương pháp này cần phải trả lại TRUE hoặc FALSE

function validate_member($str) 
{ 
    $field_value = $str; //this is redundant, but it's to show you how 
    //the content of the fields gets automatically passed to the method 

    if($this->members_model->validate_member($field_value)) 
    { 
    return TRUE; 
    } 
    else 
    { 
    return FALSE; 
    } 
} 

Sau đó bạn cần phải tạo ra một lỗi tương ứng trong trường hợp xác nhận thất bại

$this->form_validation->set_message('validate_member','Member is not valid!'); 
+2

Name "_validate_member" sẽ tốt hơn .. – Ivan

+0

@Ivan Đó là không cần thiết, nhưng có thể thêm vào Có thể không đọc được, cảm ơn bạn –

+6

Có thể không cần thiết, nhưng dấu gạch dưới hàng đầu sẽ ngăn phương thức truy cập thông qua "/ controller_name/validate_member/blah" ... và sử dụng dấu gạch dưới kép là IMO hoàn toàn có thể chấp nhận được "callback__validate_member";) –

5

Một cách tốt nhất để đạt được điều này là mở rộng thư viện Form Validation CodeIgniter của. Giả sử chúng ta muốn tạo trình xác thực tùy chỉnh có tên là access_code_unique cho trường access_code của bảng cơ sở dữ liệu users.

Tất cả những gì bạn phải làm là tạo một tệp Lớp có tên là MY_Form_validation.php trong thư mục application/libraries. Phương pháp này nên luôn luôn trả TRUE HOẶC FALSE

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class MY_Form_validation extends CI_Form_validation { 
    protected $CI; 

    public function __construct() { 
     parent::__construct(); 
      // reference to the CodeIgniter super object 
     $this->CI =& get_instance(); 
    } 

    public function access_code_unique($access_code, $table_name) { 
     $this->CI->form_validation->set_message('access_code_unique', $this->CI->lang->line('access_code_invalid')); 

     $where = array (
      'access_code' => $access_code 
     ); 

     $query = $this->CI->db->limit(1)->get_where($table_name, $where); 
     return $query->num_rows() === 0; 
    } 
} 

Bây giờ bạn có thể dễ dàng thêm quy định mới tạo của bạn

$this->form_validation->set_rules('access_code', $this->lang->line('access_code'), 'trim|xss_clean|access_code_unique[users]'); 
Các vấn đề liên quan