[Module User] - Danh sách người dùng
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.
Bài viết này được đăng tại [free tuts .net]
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.