Yii 1.1: Create your own Validation Rule

Yii 1.1: Create your own Validation Rule

Đôi khi những nhân validation có sẵn được cung cấp bởi Yii không đáp ứng được nhu cầu của bạn . Vì vậy bạn cần phải tạo những validator cho riêng mình .

Chúng ta hãy lấy 1 bài toán đơn giản :

Screenshot from 2015-04-27 09:59:40.png

  • Như trong form này . Ta thấy những trường bắt buộc phải có là những trường có dấu * .
  • Lấy ví dụ trường Tên . Mặc định trong Yii cung cấp cho ta option required để cho Yii hiểu rằng trường này là bắt buộc .

Screenshot from 2015-04-27 10:12:11.png

Screenshot from 2015-04-27 10:13:01.png

  • Thế nhưng trong trường hợp có thêm 1 yêu cầu là kí tự nhập vào ở trường Tên bao gôm ít nhất 1 kí tự từ A->Z và a->z thì không có bất kì validator nào của Yii phù hợp với điều kiện này .

=> Bắt buộc ta phải xây dựng một validator riêng của mình

1. Cách tiếp cận dễ nhất : viết trực tiếp trong model (inside-model rule )

Cách dễ nhất để tạo 1 validator mới là tạo nó ngay tại model mà nó đang được sử dụng

ví dụ ta đặt tên cho validator của trường tên là correctName . Vì vậy trong method rule() bạn phải sửa lại : Screenshot from 2015-04-27 10:41:45.png

  • Bạn cần chắc chắn rằng bạn không đặt tên của validator trùng với bất kì hàm nào trước đó . Nếu không bạn sẽ có thể gặp một số rắc rối sau này

Bây giờ bạn chỉ việc tạo một method bên trong model này , Với tên giống với validator bạn vừa định nghĩa

Screenshot from 2015-04-27 14:29:40.png

  • Method vừa được tạo có 2 arguments : $attribute = là tên của thuộc tính mà method đang validating . Và $params = tham số điều kiện mà bạn có thể định nghĩa trong function rules
  • Trong rules mothod chúng ta đã sử method này cho trường ten, nên giá trị của biến $attribute trong validator của chúng ta là 'ten'
  • Trong rule chúng ta cũng set giá trị parameter upperCase là true nên trường tên sẽ cho phép nhập cả chữ hoa và chữ thường là kí tự lating
  • Như bạn có thể thấy trong method chúng ta đang gọi CModel::addError() . Add Error chấp nhận 2 tham số : thứ nhất là tên của attribute mà bạn muốn hiển thì lỗi trên form của bạn , thứ 2 là string mà sẽ được hiển thị , string này tương đương với giá trị 'message' của các trường khác trong hàm rule().

Screenshot from 2015-04-27 14:31:22.png

2. Cách tiếp cận vấn đề hoàn toàn : mở rộng class CValidator(extending the CValidator class)

  • Nếu như bạn muộn custom lại validator trong nhiều hơn 1 model thì cách tốt nhất là bạn nên xây dựng riêng một class validator bằng cách extend từ class CValidator
  • Mở rộng class này cũng giúp bạn có thêm nhiều lợn thế trong tương lai phát triển project như CActiveForm::$enableClientValidation

Tạo file class

  • Đầu tiên chúng ta phải làm đó là tạo file class validator . Cách tốt nhất là đặt tên file theo tên class validator của bạn , tốt nhất để sử dụng tính năng Yii lazy loading.
  • Bây giờ hãy tạo 1 thư mục mới bên trong project của bạn (phải được đặt trong thư mục protected ) Tên của thư mục là MyValidators Sau đó chúng ta tạo file correctName.php

Screenshot from 2015-04-27 14:32:15.png

  • Trong class vừa được tạo ra chúng ta sẽ tạo các thuộc tính của class tương ứng với các tham số truyển vào class này . Trong trường hợp này là $upperCase
  • CValidator sẽ tự động điền các thuộc tính với giá trị của parameter truyền vào .
  • Chúng ta cũng sẽ tạo 2 thuộc tính khác trong trường hợp này , ứng với 2 trường hợp upperCase = true hoặc upperCase != true. Và sẽ được sử dụng trong hàm preg_match.
  • Để cho class validator này chạy được chúng ta phải override method validateAttribute của class CValidator.
  • Sửa lại hàm rule() ta có :

Screenshot from 2015-04-27 14:33:16.png

Ở đây ta sẽ đưa đường dẫn import file validator vào để Yii có thể hiểu được file validator ở đâu . Sử dụng Yii::import

Screenshot from 2015-04-27 14:35:11.png

Như vậy chúng ta đã có thể khai báo class validator cho riêng mình . Giúp cho việc phát triền project trở nên linh hoạt hơn .

Chúc bạn thành công !

Tài liệu tham khảo : http://www.yiiframework.com/wiki/168/create-your-own-validation-rule/ http://www.yiiframework.com/forum/index.php/topic/14322-yiiimport-and-extensions/


All Rights Reserved