-----
Phần x31. CakePHP2
– beforeFilter, lấy thông tin user, virtualFields
Xem (clip số 33b – chickenrainshop):
- Lọc các action không yêu cầu đăng nhập
- Sử dụng Auth->allow, beforeFilter (3":21)
- Sử dụng parent để không ghi đè hàm cha (8":15)
Mặc định AuthComponent sẽ tác động lên mọi action trong mọi
controller của project. Nghĩa là người dùng vào bất kì trang nào, hoặc sử dụng
bất kì chức năng nào của website, nó cũng bắt phải đăng nhập; hay nói cách khác
mọi thao tác đều phải đăng nhập để hệ thống kiểm soát.
Tuy nhiên, trong thực tế, sẽ có những trang, những action
không nhất thiết phải đăng nhập mới sử dụng được. Vì vậy, cần phải khai báo để
website bỏ qua yêu cầu chứng thực đối với các trường hợp này. Khai báo trong
hàm beforeFilter.
Đọc thêm về hàm beforeFilter tại đây: https://book.cakephp.org/2.0/en/controllers.html
[This function is executed before every action in the
controller. It’s a handy place to check for an active session or inspect user
permissions.
The beforeFilter() method will be called for missing
actions, and scaffolded actions.]
Hàm beforeFilter được thực thi trước mọi action trong
controller.
Trong hàm beforeFilter, sử dụng hàm $this->Auth->allow();
để liệt kê các action mà người sử dụng có thể dùng mà không cần đăng nhập. Ví
dụ,
[AppController.php]
public function beforeFilter() {
$this->Auth->allow('menu',
'index');
}
Do action ‘menu’, ‘index’ được chỉ định trong AppController,
nên chỉ định này sẽ áp dụng cho mọi action ‘menu’, ‘index’ của mọi controller
là con của AppController.
Nếu chỉ muốn thiết lập cho một controller cụ thể thì viết
thêm hàm beforeFilter trong chính controller đó, và nhớ thêm dòng mã:
parent::beforeFilter();
để thực thi các nội dung được thiết lập tại hàm beforeFilter
trong AppController. Ví dụ,
[CouponsController.php]
public function
beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('add');
}
Xem (clip số 34a – chickenrainshop):
Sau khi người dùng đăng nhập thành công, thông tin người
dùng sẽ được lưu trong AuthComponent.
Để kiểm tra người dùng đăng nhập hay chưa? Sử dụng hàm:
$this->Auth->login()
Để lấy thông tin người dùng, sử dụng hàm:
$this->Auth->user();
Nội dung hàm lấy thông tin người dùng, trong
AppController.php:
public function getUser() {
//
kiểm tra người dùng đăng nhập hay chưa?
if
($this->Auth->login()) {
//
trả về thông tin người dùng
return
$this->Auth->user();
}
}
Để gửi thông tin người dùng đã đăng nhập tới tất cả các
view, sẽ thực hiện trong hàm beforeFilter tại AppController.php:
public function beforeFilter() {
$this->Auth->allow('menu',
'index');
$this->set('userInfo',
$this->getUser());
}
Trong các view, để kiểm tra xem người dùng đã đăng nhập hay
chưa, sẽ kiểm tra biến userInfo:
[View\Layouts\default.ctp]
<!-- sidebar -->
<div class="sidebar col col-lg-3">
<!-- user panel -->
<?php if
(!empty($userInfo)): ?>
<div
class="panel panel-info">
<h4
class="panel-heading"><span class="glyphicon
glyphicon-user"></span><small> Xin chào
<strong><?php echo $userInfo['username'];
?></strong></small></h4>
<ul>
<li><a
href="">Cập nhật thông tin</a></li>
<li><a
href="">Đổi mật khẩu</a></li>
<li><a
href="">Lịch sử mua hàng</a></li>
<li><a
href="">Đăng xuất</a></li>
</ul>
</div>
<?php else: ?>
<div
class="panel panel-info">
<h4
class="panel-heading"><span class="glyphicon
glyphicon-user"></span><small> Xin chào
<strong>khách</strong></small></h4>
Nhấn
vào <?php echo $this->Html->link('đây','/login'); ?> để đăng nhập.
</div>
<?php endif ?>
<!-- /user panel -->
Thiết lập virtualFields:
Đọc thêm về virtualFields tại đây: https://book.cakephp.org/2.0/en/models/virtual-fields.html
VirtualFields cho phép tạo một tên trường ảo cho Model, tuy
nhiên chỉ có thể đọc (read) dữ liệu từ trường này chứ không thể lưu xuống cơ sở
dữ liệu (save).
Khai báo virtualFields trong model User:
[Model\User.php]
class User extends AppModel {
public $virtualFields = [
'fullname' => 'concat(User.lastname,
" ", User.firstname)'
];
Hàm concat để nối chuỗi.
Gọi ra sử dụng trong view:
[default.ctp]
<h4 class="panel-heading"><span
class="glyphicon glyphicon-user"></span><small> Xin
chào <strong><?php echo
$userInfo['fullname']; ?></strong></small></h4>
<ul>
<li><a
href="">Cập nhật thông tin</a></li>
-----------
Cập nhật 22/6/2017
-----------