Ngu ngơ học làm web (x51) - CakePHP2 - Khóa tài khoản

Tiếp theo của: Ngu ngơ học làm web (x50) - CakePHP2 – postLink trong form, updateAll
-----

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']); ?>&nbsp;</td>
                        <td><?php echo h($user['User']['email']); ?>&nbsp;</td>
                        <td><?php echo h($user['User']['fullname']); ?>&nbsp;</td>
                        <td><?php echo h($user['User']['created']); ?>&nbsp;</td>
                        <td><?php echo h($user['User']['modified']); ?>&nbsp;</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
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web