Khi chúng ta sử dụng công cụ yiic command, chúng ta nhận được hàm đăng nhập(login) mức cơ bản với công cụ tạo sẵn cho chúng ta. Trang đăng nhập cho phép người dùng truy nhập với 2 hình thức tài khoản (admin/admin) (demo/demo)
Chúng ta cần làm một số thay đổi điều chỉnh sao cho chúng ta quản lýđược nhiều người dùng.Điều này sẽ khiến ta phải mở rộng thêm bảng người dùng (table user) và thêm các chức năng cần thiết để quản lý.
TẠO CRUD của table User
Navigate to the Gii tool via http://localhost/trackstar/index.php?r=gii and choose the Model
Generator link. Leave the table prefix as tbl. Fill in the Table Name field as tbl_user, which will
auto-populate the Model Class name field as User .Click preview -> generate.
Navigate to the tool via http://localhost/trackstar/index.php?r=gii. 2. Choose the Crud Generator link from the list of available generators.
3. Type in User for the Model Class name field. The corresponding Controller ID will auto-populate with user.->preview->generate. auto-populate with user.->preview->generate.
Gõ http://localhost/trackstar/index.php?r=user để xem kết quả hiển thị. Cập nhật kiểm tra lịch sử các cột (columns).
Như tất cả các thực thể của chúng tôi bảng tbl_project, tbl_issue, tbl_user có các cột tương tự quy định, chúng tôi sẽ thêm vào các logic cần thiết cho một lớp cơ sở chung và sau đó có mỗi của các lớp cá nhân AR mở rộng từ lớp cơ sở mới này.
Lý do chúng ta đang tạo lớp mới này, thay vì chỉ cần thêm logic trực tiếp vào model class project, là bởi vì các class khác, model Issue và User, cũng cần logic này. Thay vì lặp lại trong các mã trong tất cả các lớp mô hình AR, cách tiếp cận này sẽ cho phép chúng tôi để thiết lập các lĩnh vực này cho tất cả các lớp mô hình AR chỉ trong một nơi. Chúng tôi cũng sẽ làm cho lớp trừu tượng mới, vì nó không nên được khởi tạo trực tiếp.
Tạo file mới: trong protected/models/ tạo CheckUserActiveRecord.php
<?php
abstract class CheckUserActiveRecord extends CActiveRecord {
/**
* Prepares create_time, create_user_id, update_time and update_user_id attributes before performing validation.
*/
{
if($this-‐>isNewRecord) {
// set the create date, last updated date and the user doing the creating $this-‐>create_time=$this-‐>update_time=new CDbExpression('NOW()'); $this-‐>create_user_id=$this-‐>update_user_id=Yii::app()-‐>user-‐>id; }
else {
//not a new record, so just set the last updated time and last updated user id $this-‐>update_time=new CDbExpression('NOW()'); $this-‐>update_user_id=Yii::app()-‐>user-‐>id; } return parent::beforeValidate(); } }
Ởđây chúng ta đang ghi đè phương thức CactiveRecord::beforeValidate().Đây là phương thức giúp người sử dụng có thể tùy biến quá trình truy cập.
nếu bạn không thực hiện sai một tham số khi gọi phương thức save () trên một lớp AR, quá trình xác thực sẽđược kích hoạt. Quá trình này thực hiện xác thực theo quy định trong phương pháp rules () trong lớp AR. Có hai phương pháp tiếp xúc cho phép chúng ta để khai thác các công việc xác nhận và thực hiện bất kỳ logic cần thiết, hoặc ngay trước hoặc ngay sau khi xác nhận được thực hiện: beforeValidate () và afterValidate (). Chú ý: Sử dụng NOW () trong mã trước đó là cụ thể cho MySQL. Điều này có thể làm việc nếu bạn đang theo cùng cách sử dụng một cơ sở dữ liệu khác nhau. Bạn luôn có thể có một cách tiếp cận khác nhau để thiết lập giá trị này. Ví dụ, bằng cách sử dụng chức năng thời gian PHP và định dạng nó một cách thích hợp cho loại dữ liệu của cột: $ this-> createTime = $ this-> updateTime = ngày ("Ymd H: i: s, time());
bây giờ chúng ta cần phải thay đổi 3 class hiện có của AR là -Project.php, User.php, và Issue.php để mở rộng từ lớp trừu tượng hơn là trực tiếp từ CActiveRecord.3 class này nằm trong protected/models/.
Chúng ta thay thế :
class Project extends CActiveRecord {
Thay ổi thành
class Project extends CheckUserActiveRecord {
Tương tự với 2 class user và issue.
Định nghĩa lần lượt các trường dữ liệu trong form nằm trong :
protected/views/project/_form.php và protected/views/user/_form.php protected/views/issue/_form.php,
Loại bỏ các trường dữ liệu như sau: <div class="row">
<?php echo $form-‐>textField($model,'create_time'); ?> <?php echo $form-‐>error($model,'create_time'); ?> </div> <div class="row"> <?php echo $form-‐>labelEx($model,'create_user_id'); ?> <?php echo $form-‐>textField($model,'create_user_id'); ?> <?php echo $form-‐>error($model,'create_user_id'); ?> </div> <div class="row"> <?php echo $form-‐>labelEx($model,'update_time'); ?> <?php echo $form-‐>textField($model,'update_time'); ?> <?php echo $form-‐>error($model,'update_time'); ?> </div> <div class="row"> <?php echo $form-‐>labelEx($model,'update_user_id'); ?> <?php echo $form-‐>textField($model,'update_user_id'); ?> <?php echo $form-‐>error($model,'update_user_id'); ?> </div>
Từ form user trong : protected/views/user/_form.php chúng ta xóa bỏ thuộc tính last login time
<div class="row">
<?php echo $form-‐>labelEx($model,'last_login_time'); ?> <?php echo $form-‐>textField($model,'last_login_time'); ?> <?php echo $form-‐>error($model,'last_login_time'); ?> </div>
chúng ta cũng nên loại bỏ các quy tắc xác nhận quy định cho các trường này trong các method quy tắc liên quan
Trong method User::rules() method, xóa i 2 rules sau:
array('create_user_id, update_user_id', 'numerical', 'integerOnly'=>true), array('last_login_time, create_time, update_time', 'safe'),
Làm tương tự với 2 model còn lại là :project, issue. Xóa bỏ các trường liên quan tới dữ liệu vừa xóa.
Thêm trường xác thực mật khẩu: Thêm lên bên đầu trang user:
public $password_repeat;
User::rules() method thêm :
array('password', 'compare'), array('password_repeat', 'safe'),
<div class="row"> <?php echo $form->label($model,'password_repeat'); ?> <?php echo $form->passwordField($model,'password_repeat',array('size'=>60,'maxlength'=>256)); ?> <?php echo $form->error($model,'password_repeat'); ?> </div> Mã hóa mật khẩu:
Mở CheckUserActiveRecord trong protected/models/ và thực hiện:
/**
* perform one-‐way encryption on the password before we store it in the database */
protected function afterValidate() {
parent::afterValidate();
$this-‐>password = $this-‐>encrypt($this-‐>password); }
public function encrypt($value) {
return md5($value); }