06/04/2021, 14:46

[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$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.

Tạ Quốc Bảo

23 chủ đề

7270 bài viết

0