[Module User] - Viết hàm phân trang - PHP MVC căn bản
Để hiển thị danh sách người dùng thì chúng ta phải sử dụng thuật toán phân trang để giới hạn danh sách hiển thị, vì vậy nếu bạn chưa biết về thuật toán đó thì hãy quay lại bài đó để xem nhé, mình có quay video kèm theo nên rất dễ hiểu. Sau khi bạn xem xong và hiểu toàn bộ nội dung của thuật ...
Để hiển thị danh sách người dùng thì chúng ta phải sử dụng thuật toán phân trang để giới hạn danh sách hiển thị, vì vậy nếu bạn chưa biết về thuật toán đó thì hãy quay lại bài đó để xem nhé, mình có quay video kèm theo nên rất dễ hiểu. Sau khi bạn xem xong và hiểu toàn bộ nội dung của thuật toán thì ta có thể bắt đầu bài học thứ 10 của series này.
1. Viết hàm phân trang
Trong một trang web có rất nhiều chức năng liên quan đến hiển thị danh sách như chức năng danh sách người dùng, chức năng danh sách tin tức, ... Tất cả các chức năng đó đều phải sử dụng thuật toán phân trang, vì vậy để tiện sử dụng thì chúng ta nên viết một hàm dùng chung cho toàn bộ hệ thống.
Bạn mở file libs/helper.php
lên và chúng ta sẽ thêm một số hàm trong đó.
Hàm bổ trợ:
Trước tiên ta cần viết một hàm bổ trợ có tên là create_link
, hàm này sẽ nhận hai tham số là $url
và $filter
như sau:
// Tạo chuỗi query string function create_link($uri, $filter = array()){ $string = ''; foreach ($filter as $key => $val){ if ($val != ''){ $string .= "&{$key}={$val}"; } } return $uri . ($string ? '?'.ltrim($string, '&') : ''); }
Trong đó tham số:
- $url là full đường dẫn đến thư mục của admin, ví dụ
http://localhost/php_example/admin
. - $filter là một mảng gồm các cặp key và value của chuỗi query string.
Ví dụ:
echo create_link(base_url('admin'), array('m' => 'user', 'a' => 'list'));
Đoạn code này sẽ in ra màn hình dòng http://localhost/php_example/admin/?&m=user&a=list
.
Hàm phân trang:
Bạn thêm hàm phân trang paging
với nội dung như sau:
// Hàm phân trang function paging($link, $total_records, $current_page, $limit) { // Tính tổng số trang $total_page = ceil($total_records / $limit); // Giới hạn current_page trong khoảng 1 đến total_page if ($current_page > $total_page){ $current_page = $total_page; } else if ($current_page < 1){ $current_page = 1; } // Tìm Start $start = ($current_page - 1) * $limit; $html = ''; // nếu current_page > 1 và total_page > 1 mới hiển thị nút prev if ($current_page > 1 && $total_page > 1){ $html .= '<a href="'.str_replace('{page}', $current_page-1, $link).'">Prev</a>'; } // Lặp khoảng giữa for ($i = 1; $i <= $total_page; $i++){ // Nếu là trang hiện tại thì hiển thị thẻ span // ngược lại hiển thị thẻ a if ($i == $current_page){ $html .= '<span>'.$i.'</span>'; } else{ $html .= '<a href="'.str_replace('{page}', $i, $link).'">'.$i.'</a>'; } } // nếu current_page < $total_page và total_page > 1 mới hiển thị nút prev if ($current_page < $total_page && $total_page > 1){ $html .= '<a href="'.str_replace('{page}', $current_page+1, $link).'">Next</a>'; } // Trả kết quả return array( 'start' => $start, 'limit' => $limit, 'html' => $html ); }
Nội dung bên trong của hàm này chính là thuật toán phân trang mà bạn đã học. Tuy nhiên về các tham số truyền vào thì bạn cần chú ý như sau:
- $link: là đường dẫn full của trang hiển thị danh sách co đính kèm tham số
page={page}
. Bắt buộc kèm theo tham sốpage={page}
bởi lúc hiển thị URL cho các nút phân trang nó sẽ replace tham số này thành các con số tương ứng. - $total_records: Tổng số records trong CSDL
- $current_page: Trang hiện tại
- $limit: Giới hạn bao nhiêu records trên một trang
Kể quả hàm này sẽ trả về một mảng gồm ba tham số:
- start: Vị trí records đầu tiên trong danh sách kết quả truy vấn
- limit: Số records muốn lấy trên một trang
- html: Nội dung html phân trang
Cách sử dụng:
Lưu ý quan trọng nhất là tham số $link
bởi nó hơi rườm rà.
$link = create_link(base_url('admin'), array( 'm' => 'user', 'a' => 'list', 'page' => '{page}', 'username' => $filter['username'] )); // Thực hiện phân trang $paging = paging($link, 1000, 2, 10);
Như vậy chúng ta đã sử dụng hàm bổ trợ để tạo link và lúc tạo link bắt buộc phải có tham số page={page}
.
2. Lời kết
Bài này chủ yếu mình hướng dẫn cách viết một hàm phân trang để dùng chung cho toàn bộ hệ thống admin của website. Trong bài mình không đề cập đến thuật toán phân trang vì mình đã có một bài hướng dẫn rất chi tiết rồi, vì vậy nếu bạn chưa biết thì hãy đến bài đó để tham khảo.
Bài tiếp theo chúng ta sẽ viết chức năng hiển thị danh sách người dùng.