06/04/2021, 14:46

[Module User] - Xóa người dùng - PHP MVC căn bản

Trong bài này mình sẽ hướng dẫn các bạn xây dựng chức năng xóa người dùng. Việc xóa người dùng rất nguy hiểm trong hệ thống bởi nếu chương trình vô tình xóa nhầm User hoặc xóa hết toàn bộ User thì dẫn đến website không có người quản trị. Bởi vậy trước khi xóa người dùng thì chúng ta cần phải kiểm ...

Trong bài này mình sẽ hướng dẫn các bạn xây dựng chức năng xóa người dùng. Việc xóa người dùng rất nguy hiểm trong hệ thống bởi nếu chương trình vô tình xóa nhầm User hoặc xóa hết toàn bộ User thì dẫn đến website không có người quản trị. Bởi vậy trước khi xóa người dùng thì chúng ta cần phải kiểm tra thông tin của người dùng thật chặt chẽ.

Điều kiện để xóa một người dùng như sau:

  • Người dùng cần xóa không phải là người dùng đang login, bởi vì bạn không thể xóa chính bạn được.
  • Không thể xóa người dùng có username à admin bởi đó là người dùng cao nhất của hệ thống.
  • Chỉ có người dùng tên là admin mới thực hiện được thao tác xóa

Người dùng có tên là Admin ta gọi là supper admin.

1. Chỉnh lại phần hiển thị danh sách người dùng

Trong bài hiển thị danh sách người dùng mình đã hiển thị button delete và edit ở toàn bộ danh sách user. Nhưng hệ thống của ta muốn chỉ có User có tên là admin mới có thể edit và delete, vì vậy ta phải kiểm tra lại quyền của user rồi mới hiển thị các button đó.

Trước tiên ta viết một hàm kiểm tra có phải là Supper Admin hay không. Bạn mở file libs/role.php lên và thêm vào hàm sau:

 

// Hàm kiểm tra là supper admin
function is_supper_admin(){
    $user = is_logged();
    if (!empty($user['level']) && $user['level'] == '1' && $user['username'] == 'Admin'){
        return true;
    }
    false;
}

 

Hàm này sẽ kiểm tra có phải là Supper Admin hay không.

Tiếp theo bạn vào file modules/user/list.php và sửa lại hai vị trí.

Vị trí thứ nhất là ở thẻ thead, thêm câu lềnh if kiểm tra Supper Admin vào:

 

<?php if (is_supper_admin()){ ?>
<td>Action</td>
<?php } ?>

 

Vị trí thứ hai là là bên trong vòng lặp hiển thị $users, bạn cũng thêm câu lệnh if kiểm tra Supper Admin vào:

 

<?php if (is_supper_admin()){ ?>
<td>
    <form method="POST" class="form-delete" action="<?php echo create_link(base_url('admin/index.php'), array('m' => 'user', 'a' => 'delete')); ?>">
        <a href="<?php echo create_link(base_url('admin'), array('m' => 'user', 'a' => 'edit', 'id' => $item['id'])); ?>">Edit</a>
        <input type="hidden" name="user_id" value="<?php echo $item['id']; ?>"/>
        <input type="hidden" name="request_name" value="delete_user"/>
        <a href="#" class="btn-submit">Delete</a>
    </form>
</td>
<?php } ?>

 

Và đây chính là toàn bộ HTML cho thẻ table:

 

<table cellspacing="0" cellpadding="0" class="form">
    <thead>
        <tr>
            <td>Username</td>
            <td>Email</td>
            <?php if (is_supper_admin()){ ?>
            <td>Action</td>
            <?php } ?>
        </tr>
    </thead>
    <tbody>
        <?php // VỊ TRÍ 02: CODE HIỂN THỊ NGƯỜI DÙNG ?>
        <?php foreach ($users as $item){ ?>
        <tr>
            <td><?php echo $item['username']; ?></td>
            <td><?php echo $item['email']; ?></td>
            <?php if (is_supper_admin()){ ?>
            <td>
                <form method="POST" class="form-delete" action="<?php echo create_link(base_url('admin/index.php'), array('m' => 'user', 'a' => 'delete')); ?>">
                    <a href="<?php echo create_link(base_url('admin'), array('m' => 'user', 'a' => 'edit', 'id' => $item['id'])); ?>">Edit</a>
                    <input type="hidden" name="user_id" value="<?php echo $item['id']; ?>"/>
                    <input type="hidden" name="request_name" value="delete_user"/>
                    <a href="#" class="btn-submit">Delete</a>
                </form>
            </td>
            <?php } ?>
        </tr>
        <?php } ?>
    </tbody>
</table>

 

2. Viết jQuery xử lý sự kiện submit form

Vì chúng ta có sử dụng jQuery nên bạn vào file widgets/header.php thêm một đoạn code import file jQuery như sau ở thẻ head.

 

<script src="http://code.jquery.com/jquery-1.9.0.js"></script>

 

Tiếp theo bạn mở file modules/user/list.php lên và thêm vào đoạn mã Javascript như sau:

 

<script language="javascript">
    $(document).ready(function(){
        // Nếu người dùng click vào nút delete
        // Thì submit form
        $('.btn-submit').click(function(){
            $(this).parent().submit();
            return false;
        });

        // Nếu sự kiện submit form xảy ra thì hỏi người dùng có chắc không?
        $('.form-delete').submit(function(){
            if (!confirm('Bạn có chắc muốn xóa thành viên này không?')){
                return false;
            }
            
            // Nếu người dùng chắc chắn muốn xóa thì ta thêm vào trong form delete
            // một input hidden có giá trị là URL hiện tại, mục đích là giúp ở 
            // trang delete sẽ lấy url này để chuyển hướng trở lại sau khi xóa xong
            $(this).append('<input type="hidden" name="redirect" value="'+window.location.href+'"/>');
            
            // Thực hiện xóa
            return true;
        });
    });
</script>

 

Mình đã xử lý hai sự kiện click vào nút deletesubmit form. Khi click vào nút delete thì ta thực hiện submit form, còn khi submit form thì ta hỏi người dùng có chắc chắn muốn xó không? Nếu muốn xóa thì ta bổ sung một input hidden vào form với tên là redirect và giá trị của nó là URL hiện tại để phía action delete sau khi xóa xong sẽ chuyển hướng về lại đúng trang hiện tại.

Trong code mình đã giải thích kỹ rồi nên mình không giải thích gì thêm.

3. Xử lý xóa người dùng

Bạn mở file modules/user/delete.php lên và nhập vào nội dung như sau:

 

if (!defined('IN_SITE')) die ('The request not found');

// Thiết lập font chữ UTF8 để khỏi bị lõi font
header('Content-Type: text/html; charset=utf-8');

// Kiểm tra quyền, nếu không có quyền thì chuyển nó về trang logout
if (!is_supper_admin()){
    redirect(base_url('admin'), array('m' => 'common', 'a' => 'logout'));
}

// Nếu người dùng submit delete user
if (is_submit('delete_user'))
{
    // Lấy ID và ép kiểu
    $id = (int)input_post('user_id');
    if ($id)
    {
        // Lấy thông tin người dùng
        $user = db_get_row(db_create_sql('SELECT * FROM tb_user {where}', array(
            'id' => $id
        )));
        
        // Kiểm tra có phải xóa admin hay không
        if ($user['username'] == 'Admin'){
            ?>
            <script language="javascript">
                alert('Bạn không thể xóa Supper Admin được!');
                window.location = '<?php echo input_post('redirect'); ?>';
            </script>
            <?php
        }
        else
        {
            $sql = db_create_sql('DELETE FROM tb_user {where}', array(
                'id' => $id
            ));

            if (db_execute($sql)){
                ?>
                <script language="javascript">
                    alert('Xóa thành công!');
                    window.location = '<?php echo input_post('redirect'); ?>';
                </script>
                <?php
            }
            else{
                ?>
                <script language="javascript">
                    alert('Xóa thất bại!');
                    window.location = '<?php echo input_post('redirect'); ?>';
                </script>
                <?php
            }
        }
    }
}
else{
    // Nếu không phải submit delete user thì chuyển về trang chủ
    redirect(base_url('admin'));
}

 

Bạn đọc kỹ từng comment và kết hợp với các lưu ý ở trên sẽ hiểu được ý tưởng mà mình đã sử dụng trong bài này.

Bây giờ bạn hãy thử delete một người dùng bình thường thì sẽ thấy thông báo thành công. Nhưng nếu bạn delete người dùng Admin thì lập tức nhận được thông báo là thao tác thất bại vì đó là Supper Admin.

4. Lời kết

Điểm nhấn quan trọng nhất của bài này là ý tưởng phân quyền và đoạn mã jQuery xử lý sự kiện xóa người dùng. Ý tưởng phân quyền là chỉ cho phép Supper Admin mới có thể xóa ngươi dùng, còn code xử lý các sự kiện thì bạn chú ý là mình có thêm một input hidden lúc submit form.

Mọi việc cho tới bài hiện tại quá suôn sẻ rồi. Bài tiếp theo chúng ta sẽ làm chức năng thêm người dùng.

Tạ Quốc Bảo

23 chủ đề

7270 bài viết

0