CodeIgnitor: Form Validation


Đăng ký nhận thông báo về những video mới nhất

Thư viện Form Validation của CodeIgniter giúp lập trình viên kiểm tra dữ liệu được gửi lên từ phía người dùng. Trong thư viện Form Validation đã xây dựng sẵn một số ràng buộc dữ liệu thường gặp, ta có thể áp dụng vào lập trình một cách dễ dàng. Để sử dụng thư viện này, ta khai báo như sau:

$this->load->library('form_validation');

Sau khi khai báo, ta có thể sử dụng c|c phương thức của thư viện này bằng cách sử dụng đối tượng $this->form_validation.

1. Thiết lập các điều kiện kiểm tra

Bằng cách kết hợp các điều kiện có sẵn và các hàm tự định nghĩa, thư viện Form Validation giúp lập trình viên có thể kiểm tra dữ liệu nhập vào từ phía người dùng. Để sử dụng các điều kiện này, ta khai b|o như sau:

$this->form_validation->set_rules(string $field, string $label, string $rules);

Trong đó:

- $field là tên của trường HTML được áp dụng điều kiện này, thông thường là giá trị thuộc tính name của tag INPUT, TEXTAREA, SELECT… Lưu ý là nếu sử dụng mảng làm tên trường (thường gặp đối với checkbox, list…), ví dụ chkColor[], ta phải truyền chính x|c tên trường, kể cả ký tự [].

- $label là tên của trường đó. Giá trị của biến này sẽ được sử dụng trong các thông báo lỗi.

- $rules là chuỗi chứa các điều kiện kiểm tra. Các điều kiện này có thể được xây dựng sẵn bởi CodeIgniter, hoặc là các hàm nhận một đối số của PHP hay các hàm callback do lập trình viên tự định nghĩa. C|c điều kiện cách nhau bởi ký tự gạch đứng |.

Xét ví dụ sau:

$this->form_validation->set_rules('txtUsername', 'Username', 'trim|required|min_length[5]|max_length[12]|xss_clean');

Điều kiện trên có nghĩa là, trường txtUsername là trường bắt buộc (required), giá trị của trường có chiều dài tối thiểu là 5 ký tự (min_length[5]), chiều dài tối đa l{ 12 ký tự (max_length[12]), dữ liệu này sẽ được loại bỏ khoảng trắng ở hai đầu (trim) và lọc XSS (xss_clean).

Các điều kiện có sẵn trong thư viện Form Validation:

Tên luật Mô tả Ví dụ
required  Trả về FALSE nếu trường rỗng   
matches  Trả về FALSE nếu giá trị của trường không trùng với giá trị của trường đượctruyền vào  matches[txtPassword]
min_length   Trả về FALSE nếu chiều dài giá trị của trường ít hơn số ký tự quy định  min_length[5]
max_length   Trả về FALSE nếu chiều dài giá trị của trường nhiều hơn số ký tự quy định  max_length[12]
exact_length   Trả về FALSE nếu chiều dài giá trị của trường không đúng bằng số ký tự quy định exact_length[8]
alpha    Chỉ cho phép giá trị của trường chứa các ký tự chữ  
alpha_numeric   Chỉ cho phép giá trị của trường chứa các ký tự chữ và số  
alpha_dash   Chỉ cho phép giá trị của trường chứa các ký tự chữ, số, dấu gạch ngang (-) và dấu gạch dưới (_)   
numeric  Chỉ cho phép giá trị của trường chứa các ký tự số  
integer   Chỉ cho phép trường chứa giá trị số nguyên  
is_natural   Chỉ cho phép trường chứa giá trị số tự nhiên  
is_natural_no_zero   Chỉ cho phép trường chứa giá trị số tự nhiên, bỏ số 0  
valid_email   Trả về FALSE nếu giá trị của trường không phải là một địa chỉ email hợp lệ   
valid_emails  Trả về FALSE nếu giá trị của trường không phải là một tập hợp các địa chỉ email hợp lệ, ngăn cách bởi dấu phẩy (,)   
valid_ip  Trả về FALSE nếu giá trị của trường không phải là một địa chỉ IP hợp lệ   
valid_base64  Trả về FALSE nếu giá trị của trường chứa các ký tự không phải là các ký tự của mã hóa Base 64  
xss_clean  Lọc XSS từ dữ liệu gửi lên  
prep_for_form   Chuyển đổi mã HTML thành các thực thể ký tự (character entites) để hiển thị chính x|c trên c|c tag như INPUT, TEXTAREA…   
prep_url  Thêm chuỗi http:// vào URL nếu không có strip_image_tags Lọc lấy địa chỉ URL của hình trong tag IMG   
encode_php_tags  Chuyển tag của PHP thành các thực thể ký tự  

Thư viện Form Validation còn cho phép thiết lập điều kiện kiểm tra bằng cách truyền vào hàm set_rules() một mảng hai chiều có dạng:

$config = array(

  array(

    'field' => 'txtUsername',

    'label' => 'Username',

    'rules' => 'required'

  ),

  array(

    'field' => 'txtPassword',

    'label' => 'Password',

    'rules' => 'required'

  ),

  array(

    'field' => 'txtPassConf',

    'label' => 'Password Confirmation',

    'rules' => 'required|matches[txtPassword]'

  ),

  array(

    'field' => 'txtEmail',

    'label' => 'Email',

    'rules' => 'required'

  )

);

$this->form_validation->set_rules($config);

Ta cũng có thể sử dụng các hàm một đối số của PHP như trim(), htmlspecialchars(), md5()…để thiết lập điều kiện. Ngoài ra, CodeIgniter còn cho phép lập trình viên sử dụng các hàm callback tự định nghĩa để thiết lập luật kiểm tra của riêng mình, chẳng hạn như kiểm tra tên đăng nhập đ~ có trong cơ sở dữ liệu chưa…C|c h{m callback được bắt đầu bằng tiền tố callback_ và phải trả về giá trị boolean.

$this->form_validation->set_rules('txtUsername', 'Username', 'callback_check_username');

function check_username($str) {

  if( $this->UserModel->usernamExists() == TRUE)

    return FALSE;

  else

    return TRUE;

}

Sau khi thiết lập các điều kiện, ta sử dụng phương thức run() để kiểm tra dữ liệu đầu vào. Nếu kết quả trả về là TRUE, tức là dữ liệu thỏa m~n c|c điều kiện đưa ra, ngược lại hàm trả về FALSE.

$this->form_validation->run();

Một chức năng hữu ích khác của thư viện CodeIgniter l{ cho phép ta lưu c|c điều kiện kiểm tra dữ liệu vào một tập tin thiết lập. C|c điều kiện này có thể được sắp xếp vào từng nhóm. Các nhóm này có thể được gọi một cách tự động hay thông qua lời gọi của lập trình viên.

Để sử dụng chức năng n{y, ta tạo một tập tin form_validation.php trong thư mục application/config. Bên trong tập tin này, ta khai báo mảng $config chứa c|c điều kiện kiểm tra như đã trình bày, với tên của khóa cũng l{ tên nhóm. Ví dụ, tạo hai nhóm điều kiện có tên là signup và email:

$config = array(

  'signup' => array(

    array(

      'field' => 'username',

      'label' => 'Username',

      'rules' => 'required'

    ),

    array(

      'field' => 'password',

      'label' => 'Password',

      'rules' => 'required'

    ),

  'email' => array(

    array(

      'field' => 'name',

      'label' => 'Name',

      'rules' => 'required|alpha'

    ),

    array(

      'field' => 'title',

      'label' => 'Title',

      'rules' => 'required'

    ),

    array(

      'field' => 'message',

      'label' => 'MessageBody',

      'rules' => 'required'

    )

  )

);

Khi đó, để kiểm tra dữ liệu cho một nhóm, ta gọi phương thức run() với tham số truyền vào là tên của nhóm điều kiện:

$this->form_validation->run('group_name');

Lớp Form Validation còn cho phép gắn nhóm điều kiện với từng phương thức trong controller. Khi dữ liệu được gửi v{o phương thức này, lớp Form Validation sẽ tự động kiểm tra c|c điều kiện đ~ được định sẵn. Ví dụ, để thiết lập điều kiện kiểm tra dữ liệu cho phương thức signup() của lớp controller Member, ta khai báo:

$config = array(

  'member/signup' => array(

    array(

      'field' => 'username',

      'label' => 'Username',

      'rules' => 'required'

    ),

    array(

      'field' => 'password',

      'label' => 'Password',

      'rules' => 'required'

    ),

    array(

      'field' => 'passconf',

      'label' => 'PasswordConfirmation',

      'rules' => 'required'

    ),

    array(

      'field' => 'email',

      'label' => 'Email',

      'rules' => 'required'

    )

  )

);

2. Xử lý lỗi

Thư viện Form Validation cung cấp hàm validation_errors() để hiển thị tất cả lỗi kiểm tra dữ liệu trong các tập tin view. Các thông báo sẽ hiển thị được quy định trong tập tin system/language/english/form_validation_lang.php. Ta cũng có thể thay đổi các thông báo này bằng cách sử dụng hàm set_message().

$this->form_validation->set_message('rule', 'Error Message');

Với rule là tên điều kiện dựng sẵn của thư viện Form Validation và Error Message là thông báo sẽ được hiển thị. Nếu trong Error Message có chứa %s, giá trị label sẽ được thay thế vào đó.

$this->form_validation->set_message(required', 'Field %s must not be empty!');

Để thiết lập thông báo cho các hàm callback, ta chỉ cần đưa tên h{m l{m đối số đầu tiên. Chẳng hạn:

$this->form_validation->set_message('check_username', 'This username is used. Please choose another one!');

Để hiển thị lỗi cho riêng từng trường, ta có thể sử dụng hàm form_error() như sau:

<?php echo form_error($fieldName); ?> // Với $fieldName là tên của trường

Theo mặc định, các thông báo lỗi sẽ được đặt trong tag P. Ta có thể thiết lập lại cách hiển thị này cho phù hợp với giao diện website. CodeIgniter cho phép thiết lập toàn cục, áp dụng với tất cả các lần gọi hàm validation_errors(), và cục bộ, áp dụng với từng lần gọi hàm riêng biệt. Để thiết lập toàn cục, ta sử dụng hàm sau:

$this->form_validation->set_error_delimiters(string $startTag, string $endTag);

Chẳng hạn, đoạn mã dưới đ}y sẽ thiết lập các thông báo lỗi được đặt trong thẻ DIV.

$this->form_validation->set_error_delimiters('<div class="error">', '</div>');

Để thiết lập riêng cho từng lần gọi hàm, ta sử dụng:

<?php echo form_error('field name',  '<div class="error">', '</div>'); ?>

Hoặc

<?php echo validation_errors('<div class="error">', '</div>'); ?>

3. Các hàm tiện ích

form_error(string $fieldName[, string $errorStartTag[, string $errorEndTag]])

Hàm form_error() sẽ hiển thị lỗi của trường được truyền vào.

set_value(string $fieldName[, mixed $defaultValue])

Hàm set_value() sẽ hiển thị lại những dữ liệu do người dùng nhập v{o, trong trường hợp trường hợp xảy ra lỗi. H{m này được áp dụng với các textfield (tag INPUT) hay textarea (tag TEXTAREA). Hàm nhận tên trường l{m đối số thứ nhất. Đối số thứ hai (tùy chọn) sẽ hiển thị giá trị mặc định của trường khi được tải lần đầu.

set_select(string $fieldName[, mixed $defaultValue[, boolean $isSelected]])

Hàm set_select() sẽ hiển thị lại giá trị đã chọn của người dùng trong combo box, trong trường hợp xảy ra lỗi. H{m được áp dụng cho các tag OPTION. Hàm nhận tên trường làm đối số thứ nhất. Đối số thứ hai (tùy chọn) sẽ hiển thị giá trị mặc định của tùy chọn này. Đối số thứ ba (tùy chọn) sẽ đ|nh dấu lựa chọn này làm lựa chọn mặc định.

set_checkbox(string $fieldName, mixed $defaultValue[, boolean $isSelected])

Hàm set_checbox() sẽ chọn những checkbox đã chọn của người dùng, trong trường hợp xảy ra lỗi. H{m được áp dụng cho các tag INPUT với type="checkbox". Hàm nhận tên trường l{m đối số thứ nhất. Đối số thứ hai là giá trị của checkbox. Đối số thứ ba (tùy chọn) sẽ đ|nh dấu checkbox n{y được chọn.

set_radio(string $fieldName, mixed $defaultValue[, boolean $isSelected])

Hàm set_radio() sẽ chọn những radio button đ~ được chọn của người dùng, trong trường hợp xảy ra lỗi. H{m n{y được áp dụng cho những tag INPUT có type="radio". Hàm nhận tên trường l{m đối số thứ nhất. Đối số thứ hai là giá trị của checkbox. Đối số thứ ba (tùy chọn) sẽ đ|nh dấu chọn cho radio button này.


Nếu bạn có điều thắc mắc, bạn hãy comment cho V1Study để được giải đáp.
Bài viết này được chia sẻ bởi LongDT. Nếu bạn muốn chia sẻ bài viết, bạn hãy Đăng ký làm thành viên!
« Prev
Next »
Copied !!!