[Module User] - Xóa người dùng
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 đó.
Bài viết này được đăng tại [free tuts .net]
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 delete và submit 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.

 Xây dựng chức năng đăng nhập và đăng ký với php và mysql
            Xây dựng chức năng đăng nhập và đăng ký với php và mysql         Bảng mã ASCII chuẩn các hệ nhị phân - thập phân - thập lục phân
            Bảng mã ASCII chuẩn các hệ nhị phân - thập phân - thập lục phân         Cách khai báo biến trong PHP, các loại biến thường gặp
            Cách khai báo biến trong PHP, các loại biến thường gặp         Bài 26: Hàm isset() và empty() trong php
            Bài 26: Hàm isset() và empty() trong php         Các kiểu dữ liệu trong PHP và các loại biến tương ứng
            Các kiểu dữ liệu trong PHP và các loại biến tương ứng         Bài 19: Phương thức GET và POST trong php
            Bài 19: Phương thức GET và POST trong php         Download và cài đặt Vertrigo Server
            Download và cài đặt Vertrigo Server         Bài 20: Các hàm xử lý chuỗi trong php
            Bài 20: Các hàm xử lý chuỗi trong php         Thẻ li trong HTML
                Thẻ li trong HTML             Thẻ article trong HTML5
                Thẻ article trong HTML5             Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
                Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên             Cách dùng thẻ img trong HTML và các thuộc tính của img
                Cách dùng thẻ img trong HTML và các thuộc tính của img             Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng
                Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng             
                