-----
Phần x14. CakePHP2
– Validate
Xem (clip số 20b – chickenrainshop):
- Kiểm tra dữ liệu (validate) ngay tại controller thay vì
tại model (20b)
- Lưu biến thông báo lỗi vào session (6":16)
- Ẩn dấu * trên view khi có thuộc tính require (7":50)
- Tắt validate mặc định của trình duyệt (9":04)
- Đọc và kiểm tra session có tồn tại không (11":35)
- Kiểm tra biến có tồn tại hay không trên view
(isset)(15":57)
Đọc thêm về validate tại đây: https://book.cakephp.org/2.0/en/models/data-validation.html
Để kiểm tra dữ liệu đã hợp lệ hay chưa, bước đầu tiên là
khai báo luật (rule) trong model như sau:
public $validate = array(
'content' =>
array(
'notBlank'
=> array(
'rule'
=> array('notBlank'),
'message'
=> 'Nội dung nhận xét không được để trống.',
//'allowEmpty'
=> false,
//'required'
=> false,
//'last'
=> false, // Stop validation after this rule
//'on'
=> 'create', // Limit validation to 'create' or 'update' operations
),
'minLength'
=> array(
'rule'
=> array('minLength', 8),
'message'
=> 'Nội dung nhận xét tối thiểu phải có 8 kí tự',
),
),
);
Biến $validate thuộc kiểu public, là một mảng,
- content: là tên của trường dữ liệu (trong database và trên
view) cần kiểm tra tính hợp lệ
- notBlank: là tên luật áp dụng cho trường content
- Mỗi luật gồm các mục:
+ rule: nội dung của
luật
+ message: thông báo lỗi khi dữ liệu nhập vào không đúng
theo yêu cầu
+ required: bắt buộc phải có trường này trong array khi ghi
dữ liệu xuống cơ sở dữ liệu, mặc dù giá trị của trường này có thể là trống
(blank). Đọc thêm ở đây: https://book.cakephp.org/2.0/en/models/data-validation.html#required
Bước thứ hai là thực hiện kiểm tra dữ liệu bên controller:
- Việc kiểm tra dữ liệu phải được thực hiện trước khi lưu dữ
liệu xuống cơ sở dữ liệu, sử dụng lệnh sau:
$this->Comment->set($this->request->data);
if($this->Comment->validates()) {
// xử lý nếu kiểm tra dữ liệu thành công
} else {
// xử lý nếu
kiểm tra dữ liệu thất bại
}
Trong đó, $this->request->data là dữ liệu gửi từ
client lên server
Bước thứ ba là lưu thông báo lỗi vào session:
$this->Session->write('comment_errors',
$comment_errors);
Bước thứ tư là hiển thị thông báo lỗi tại view:
- Tại controller, kiểm tra xem có thông báo lỗi ghi trong
session hay không:
$this->Session->check('comment_errors')
- Đọc thông báo lỗi từ session, lưu vào một biến:
$errors = $this->Session->read('comment_errors')
- Gửi biến lên view:
$this->set('errors', $errors);
- Xóa thông báo lỗi trong session, để nó không hiển thị ở
các lần sau.
$this->Session->delete('comment_errors');
- Tại view, hiển thị thông báo lỗi trong biến $errors:
Nên đặt ngay dưới ô nhập liệu,
echo $this->Form->input('content');
if
(isset($errors)) {
foreach ($errors as $error) {
echo $error[0];
}
}
Để ẩn dấu * trên view, thêm thuộc tính require => false,
ví dụ:
echo $this->Form->input('user_id',
[
'type'
=> 'text',
'value'
=> 1,
'hidden'
=> true,
'label'
=> '',
'required' => false
]);
Tắt validate mặc định của trình duyệt bằng cách thêm thuộc
tính novalidate => true trong lệnh tạo form, ví dụ:
<?php echo $this->Form->create('Comment', ['url' =>
['action' => 'add'], 'novalidate'
=> true]); ?>
Để không hiển thị thông báo lỗi validate mặc định ngay dưới
một input, thêm thuộc tính 'error' => false, ví dụ:
<?php echo $this->Form->input('keyword',
[
'label'
=> '',
'placeholder'
=> 'Nhập từ khóa tìm kiếm...',
'error'
=> false
]);
?>
-----------
Cập nhật 11/5/2017
-----------