-----
Phần x51. CakePHP2
– Khóa tài khoản
Xem (clip số 49 – chickenrainshop):
- Khóa tài khoản người dùng (49)(3":27)
- Định dạng ngày và thời gian (7":22)
Thực hiện chức năng khóa tài khoản.
Trong [UsersController.php] sửa action index() thành
admin_index().
Trong [View\Users\] sửa view index.ctp thành
admin_index.ctp.
Thêm trường active (tinyint(1)) vào bảng users, giá trị 1 là
hoạt động, giá trị 0 là bị khóa.
[View\Users\admin_index.ctp]
<div class="users index">
<h2><?php
echo __('Users'); ?></h2>
<table
cellpadding="0" cellspacing="0">
<thead>
<tr>
<th><?php
echo $this->Paginator->sort('active', 'Trạng thái tài khoản');
?></th>
<th><?php
echo $this->Paginator->sort('group_id', 'Group'); ?></th>
<th><?php
echo $this->Paginator->sort('username'); ?></th>
<th><?php
echo $this->Paginator->sort('email'); ?></th>
<th><?php
echo $this->Paginator->sort('fullname', 'Họ tên'); ?></th>
<th><?php
echo $this->Paginator->sort('created', 'Ngày tạo'); ?></th>
<th><?php
echo $this->Paginator->sort('modified', 'Ngày chỉnh sửa');
?></th>
<th
class="actions"><?php echo __('Actions'); ?></th>
</tr>
</thead>
<tbody>
<?php foreach
($users as $user): ?>
<tr>
<td>
<?php
if ($user['User']['active'] == 1): ?>
Đang
hoạt động
<?php
else: ?>
Bị
khóa
<?php
endif ?>
<td>
<?php
echo $this->Html->link($user['Group']['name'], array('controller' =>
'groups', 'action' => 'view', $user['Group']['id'])); ?>
</td>
<td><?php
echo h($user['User']['username']); ?> </td>
<td><?php
echo h($user['User']['email']); ?> </td>
<td><?php
echo h($user['User']['fullname']); ?> </td>
<td><?php
echo h($user['User']['created']); ?> </td>
<td><?php
echo h($user['User']['modified']); ?> </td>
<td
class="actions">
<?php if ($user['User']['active'] == 1): ?>
<?php
echo $this->Form->postLink(__('Khóa tài khoản'), array('action' =>
'active', $user['User']['id']), array('confirm' => __('Bạn có chắc chắn muốn
khóa tài khoản này không?'))); ?>
<?php
else: ?>
<?php
echo $this->Form->postLink(__('Mở khóa tài khoản'), array('action' =>
'active', $user['User']['id']), array('confirm' => __('Bạn có chắc chắn muốn
mở tài khoản này không?'))); ?>
<?php
endif ?>
<?php
echo $this->Html->link(__('Edit'), array('action' => 'edit',
$user['User']['id'])); ?>
<?php
echo $this->Form->postLink(__('Delete'), array('action' => 'delete',
$user['User']['id']), array('confirm' => __('Are you sure you want to delete
# %s?', $user['User']['id']))); ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
…
[UsersController.php]
public function
admin_active ($id = null) {
$this->User->id
= $id;
if
(!$this->User->exists()) {
throw
new NotFoundException(__('Invalid user'));
}
$user
= $this->User->findById($id);
$active
= $user['User']['active'];
if
($active == 1) {
if
($this->User->saveField('active', 0)) {
$this->Flash->success(__('Tài
khoản đã bị khóa!'));
}
else {
$this->Flash->error(__('Khóa
tài khoản không thành công!'));
}
}
else {
if
($this->User->saveField('active', 1)) {
$this->Flash->success(__('Tài
khoản đã được mở!'));
}
else {
$this->Flash->error(__('Mở
tài khoản không thành công!'));
}
}
$this->redirect($this->referer());
}
Các tài khoản đã bị khóa sẽ không được phép đăng nhập vào
Website, để làm điều này, vào
AppController.php, thêm đoạn mã sau:
public $components = [
'Flash','Session','Tool',
'Auth'
=>[
'loginAction'
=> '/login',
'authError'
=> 'Bạn cần phải đăng nhập để tiếp tục!',
'flash'
=> [
'element'
=> 'error',
'key'
=> 'auth',
'params'
=> ['class' => 'alert alert-danger']
],
'loginRedirect'
=> '/',
'authenticate' => array(
'Form'
=> array(
'scope'
=> array('User.active' => 1)
)
)
]
];
Khi user đã bị khóa, nếu họ cố gắng để đăng nhập, cần thông
báo để họ biết:
[UsersController.php action login()]
public function login() {
if
($this->request->is('post')) {
if
($this->Auth->login()) {
$this->redirect($this->Auth->redirect());
}
else {
$userInfo =
$this->User->findByUsername($this->request->data['User']['username']);
if (!empty($userInfo)
&& $userInfo['User']['active'] == 0) {
$this->Flash->error('Tài
khoản đã bị khóa, vui lòng liên hệ với admin!', ['key' => 'auth', 'params'
=> ['class' => 'alert alert-danger']]);
} else {
$this->Flash->error('Sai
tên đăng nhập hoặc mật khẩu', ['key' => 'auth', 'params' => ['class'
=> 'alert alert-danger']]);
}
}
}
$this->set('title_for_layout',
'Đăng nhập');
}
Để định dạng hiển thị thời gian của một input theo kiểu
ngày/tháng/năm và 24 giờ, viết mã như sau:
Ví dụ:
echo $this->Form->input(‘timeStart’, [‘label’=>’Ngày bắt
đầu’, ‘dateFormat’=>’DMY’, ‘timeFormat’ => 24]);
-----------
Cập nhật 7/8/2017
-----------