Bài 11: [Module User] - Danh sách người dùng

DOWNLOAD

Vậy là bạn đã hiểu ý tưởng cũng như cách viết hàm phân trang rồi đúng không nào? Nếu chưa biết thì hãy quay lại bài viết hàm phân trang để học nó trước khi vào bài này nhé.

Trong bài này chúng ta sẽ xây dựng chức năng hiển thị danh sách người dùng có phân trang được lấy từ bảng tb_user trong cơ sở dữ liệu. Giao diện sau khi hoàn thành sẽ hoàn thành sẽ như sau:

Như thường lệ chúng ta sẽ có các bước thực hiện như sau.

1. Bổ sung CSS trên header

Để có giao diện như trong hình thì chúng ta cần bổ sung một số đoạn CSS. Bạn mở file admin/widgets/header.php lên và bổ sung đoạn CSS sau vào thẻ style.

.pagination a, .pagination span{
    margin-right: 3px;
}
.pagination span{
    display: inline-block;
    padding: 3px 5px;
    background: gray;
    color: #fff;
    text-decoration: none;
    margin-top: 10px;
}
table.form{
    width: 100%;
}
table.form td{
    border: solid 1px #ddd;
    padding: 5px 10px;
}
table.form thead{
    font-weight: bold;
}
.controls{
    margin: 10px 0px;
    text-align: right;
}

Vẫn ở file này, bạn thay đổi đường dẫn URL trên thanh menu của User thành như sau:

<a href="<?php echo create_link(base_url('admin'), array('m' => 'user', 'a' => 'list')); ?>">User</a>

2. Bổ sung dữ liệu bảng người dùng

Ta phải bổ sung một số User để thực hiện phân trang. Bạn copy đoạn mã SQL sau và vào PHPMYADMIN để chạy nó.

INSERT INTO `tb_user` (`id`, `username`, `password`, `email`, `fullname`, `level`, `add_date`) VALUES
(2, 'User2', '83617175fd8cf470d4af657a28def98e', 'User2@gmail.com', 'User2 Name', 2, NULL),
(3, 'User3', '83617175fd8cf470d4af657a28def98e', 'User3@gmail.com', 'User3 Name', 2, NULL),
(4, 'User4', '83617175fd8cf470d4af657a28def98e', 'User4@gmail.com', 'User4 Name', 2, NULL),
(5, 'User5', '83617175fd8cf470d4af657a28def98e', 'User5@gmail.com', 'User5 Name', 2, NULL),
(6, 'User6', '83617175fd8cf470d4af657a28def98e', 'User6@gmail.com', 'User6 Name', 2, NULL),
(7, 'User7', '83617175fd8cf470d4af657a28def98e', 'User7@gmail.com', 'User7 Name', 2, NULL),
(8, 'User8', '83617175fd8cf470d4af657a28def98e', 'User8@gmail.com', 'User8 Name', 2, NULL),
(9, 'User9', '83617175fd8cf470d4af657a28def98e', 'User9@gmail.com', 'User9 Name', 2, NULL),
(10, 'User10', '83617175fd8cf470d4af657a28def98e', 'User10@gmail.com', 'User10 Name', 2, NULL),
(11, 'User11', '83617175fd8cf470d4af657a28def98e', 'User11@gmail.com', 'User11 Name', 2, NULL),
(12, 'User12', '83617175fd8cf470d4af657a28def98e', 'User12@gmail.com', 'User12 Name', 2, NULL),
(13, 'User13', '83617175fd8cf470d4af657a28def98e', 'User13@gmail.com', 'User13 Name', 2, NULL),
(14, 'User14', '83617175fd8cf470d4af657a28def98e', 'User14@gmail.com', 'User14 Name', 2, NULL),
(15, 'User15', '83617175fd8cf470d4af657a28def98e', 'User15@gmail.com', 'User15 Name', 2, NULL),
(16, 'User16', '83617175fd8cf470d4af657a28def98e', 'User16@gmail.com', 'User16 Name', 2, NULL),
(17, 'User17', '83617175fd8cf470d4af657a28def98e', 'User17@gmail.com', 'User17 Name', 2, NULL),
(18, 'User18', '83617175fd8cf470d4af657a28def98e', 'User18@gmail.com', 'User18 Name', 2, NULL),
(19, 'User19', '83617175fd8cf470d4af657a28def98e', 'User19@gmail.com', 'User19 Name', 2, NULL),
(20, 'User20', '83617175fd8cf470d4af657a28def98e', 'User20@gmail.com', 'User20 Name', 2, NULL),
(21, 'User21', '83617175fd8cf470d4af657a28def98e', 'User21@gmail.com', 'User21 Name', 2, NULL),
(22, 'User22', '83617175fd8cf470d4af657a28def98e', 'User22@gmail.com', 'User22 Name', 2, NULL),
(23, 'User23', '83617175fd8cf470d4af657a28def98e', 'User23@gmail.com', 'User23 Name', 2, NULL);

3. Viết hàm tạo câu truy vấn

Trong các câu truy vấn sẽ có các điều kiện where nên để tiện cho việc xây dựng các câu truy vấn thì chúng ta cần tạo một hàm có nhiệm vụ tự động tạo ra câu SQL kèm với điều kiện WHERE.

Bạn mở file libs/database.php lên và bổ sung hàm sau:

// Hàm tạo câu truy vấn có thêm điều kiện Where
function db_create_sql($sql, $filter = array())
{    
    // Chuỗi where
    $where = '';
    
    // Lặp qua biến $filter và bổ sung vào $where
    foreach ($filter as $field => $value){
        if ($value != ''){
            $value = addslashes($value);
            $where .= "AND $field = '$value', ";
        }
    }
    
    // Remove chữ AND ở đầu
    $where = trim($where, 'AND');
    // Remove ký tự , ở cuối
    $where = trim($where, ', ');
    
    // Nếu có điều kiện where thì nối chuỗi
    if ($where){
        $where = ' WHERE '.$where;
    }
    
    // Return về câu truy vấn
    return str_replace('{where}', $where, $sql);
}

Hàm này có hai tham số truyền vào:

  • $sql: Là câu lệnh SQL không có WHERE
  • $filter: Là một mảng key => value tương ứng với key là tên field và value là giá trị tìm kiếm. Như vậy tham số này chính là điều kiện where.

Có một lưu ý là trong câu lênh $sql bạn sẽ phải xác định vị trí đặt điều kiện where bằng cách bổ sung chữ {where} tại vị trí mong muốn.

Ví dụ:

echo db_create_sql("SELECT * FROM tb_user {where}", array('id' => '1'));

Kết quả sẽ là câu truy vấn dạng:

SELECT * FROM tb_user WHERE id = '1'

4. Xử lý trang danh sách người dùng

Trang danh sách người dùng sẽ có URL là: http://localhost/php_example/admin/?m=user&a=list.

Bạn mở file modules/user/list.php lên và dán nội dung sau vào:

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

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

<?php include_once('widgets/header.php'); ?>

<?php // VỊ TRÍ 01: CODE XỬ LÝ PHÂN TRANG ?>

<h1>Danh sách thành viên</h1>
<div class="controls">
    <a class="button" href="<?php echo create_link(base_url('admin'), array('m' => 'user', 'a' => 'add')); ?>">Thêm</a>
</div>
<table cellspacing="0" cellpadding="0" class="form">
    <thead>
        <tr>
            <td>Username</td>
            <td>Email</td>
            <td>Action</td>
        </tr>
    </thead>
    <tbody>
        <?php // VỊ TRÍ 02: CODE HIỂN THỊ NGƯỜI DÙNG ?>
    </tbody>
</table>

<div class="pagination">
    <?php // VỊ TRÍ 03: CODE HIỂN THỊ CÁC NÚT PHÂN TRANG ?>
</div>

<?php include_once('widgets/footer.php'); ?>

Trong đó mình có sử dụng một đoạn code như sau:

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

Đoạn code này chính là kiểm tra ngươi dùng có phải là admin hay không? Nếu không phải thì đẩy ra ngoài hệ thống.

Và mình có comment ba vị trí:

  • VỊ TRÍ 01: CODE XỬ LÝ PHÂN TRANG
  • VỊ TRÍ 02: CODE HIỂN THỊ NGƯỜI DÙNG
  • VỊ TRÍ 03: CODE HIỂN THỊ CÁC NÚT PHÂN TRANG

Bây giờ ta sẽ code cho từng vị trí.

Ví trí 01: Code xử lý phân trang.

Bạn dán vào đoạn code sau:

// Tìm tổng số records
$sql = db_create_sql('SELECT count(id) as counter from tb_user {where}');
$result = db_get_row($sql);
$total_records = $result['counter'];

// Lấy trang hiện tại
$current_page = input_get('page');

// Lấy limit
$limit = 10;

// Lấy link
$link = create_link(base_url('admin'), array(
    'm' => 'user',
    'a' => 'list',
    'page' => '{page}'
));

// Thực hiện phân trang
$paging = paging($link, $total_records, $current_page, $limit);

// Lấy danh sách User
$sql = db_create_sql("SELECT * FROM tb_user {where} LIMIT {$paging['start']}, {$paging['limit']}");
$users = db_get_list($sql);

Sau khi chạy xong đoạn code này ta sẽ có hai biến:

  • $users: Chứa danh sách người dùng
  • $paging: Chứa nội dung HTML phân trang

Vị trí 02: Code hiển thị người dùng.

Bạn dán vào đoạn code sau:

<?php foreach ($users as $item){ ?>
<tr>
    <td><?php echo $item['username']; ?></td>
    <td><?php echo $item['email']; ?></td>
    <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>
</tr>
<?php } ?>

Mình đã lặp biến $users để hiển thị danh sách người dùng. Mỗi người dùng sẽ có một button edit và một button delete và được đặt trong một form, ngoài 2 button đó ra thì bên trong form còn có hai input hidden chứa ID và request_name. Những thông tin này sẽ được giải thích ở bài xây dựng chức năng xóa người dùng.

Vị trí 03: Code hiển thị các nút phân trang.

Vị trí này đơn giản nhất bởi vì ta chỉ cần show mã HTML phân trang là được.

echo $paging['html']; 

Toàn bộ code:

Và đây là toàn bộ nội dung của file này:

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

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

    <?php include_once('widgets/header.php'); ?>

    <?php 
    // VỊ TRÍ 01: CODE XỬ LÝ PHÂN TRANG 
    // Tìm tổng số records
    $sql = db_create_sql('SELECT count(id) as counter from tb_user {where}');
    $result = db_get_row($sql);
    $total_records = $result['counter'];

    // Lấy trang hiện tại
    $current_page = input_get('page');

    // Lấy limit
    $limit = 10;

    // Lấy link
    $link = create_link(base_url('admin'), array(
        'm' => 'user',
        'a' => 'list',
        'page' => '{page}'
    ));

    // Thực hiện phân trang
    $paging = paging($link, $total_records, $current_page, $limit);

    // Lấy danh sách User
    $sql = db_create_sql("SELECT * FROM tb_user {where} LIMIT {$paging['start']}, {$paging['limit']}");
    $users = db_get_list($sql);
?>

<h1>Danh sách thành viên</h1>
<div class="controls">
    <a class="button" href="<?php echo create_link(base_url('admin'), array('m' => 'user', 'a' => 'add')); ?>">Thêm</a>
</div>
<table cellspacing="0" cellpadding="0" class="form">
    <thead>
        <tr>
            <td>Username</td>
            <td>Email</td>
            <td>Action</td>
        </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>
            <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>
        </tr>
        <?php } ?>
    </tbody>
</table>

<div class="pagination">
    <?php 
    // VỊ TRÍ 03: CODE HIỂN THỊ CÁC NÚT PHÂN TRANG
    echo $paging['html']; 
    ?>
</div>

<?php include_once('widgets/footer.php'); ?>

Bây giờ bạn hãy chạy web lên với đường dẫn là http://localhost/php_example/admin/?m=user&a=list để xem kết quả nhé, nhớ click vào các nút phân trang để xem sự khác biệt.

5. Lời kết

Bài này có vẻ bắt đầu khó dần rồi phải không các bạn. Nếu các bạn hiểu được toàn bộ code trên thì khả năng của bạn cũng tương đối tốt rồi đấy. 

Để dễ hiểu bài thì bạn nên xem video một lần rồi sau đó thực hành theo. Trong quá trình học nếu bị lỗi gì thì hãy lên trang hỏi đáp để đăng câu hỏi nhé, mình chỉ hỗ trợ trên đó thôi. Bài tiếp theo ta sẽ xây dựng chức năng xóa người dùng.

Hãy để lại link bài viết gốc khi chia sẻ bài viết này, mình sẽ report DMCA với những website lấy nội dung mà không để nguồn hoặc copy bài với số lượng lớn.

Nguồn: freetuts.net

Profile photo of adminTheHalfHeart

TheHalfHeart

Có sở thích viết tuts nên đã từng tham gia viết ở một số diễn đàn, đến năm 2014 mới có điều kiện sáng lập ra freetuts.net. Sinh năm 90 và có 1 vợ 2 con, thích ca hát và lập trình.

ĐĂNG BÌNH LUẬN: Đăng câu hỏi trên Group Facebook để được hỗ trợ nhanh nhất.