Ngu ngơ học làm web (x14) - CakePHP2 - Validate

Tiếp theo của: Ngu ngơ học làm web (x13) - CakePHP2 – Hàm rand(), Form, Redirect
-----

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
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web