Hướng dẫn xây dựng lớp phân trang trong PHP

Hướng dẫn xây dựng lớp phân trang trong PHP

Hướng dẫn xây dựng lớp phân trang trong PHP

Phân trang là một phần quan trọng của bất kỳ ngôn ngữ lập trình web động nào, đây cũng là phần gây nhiều khó khăn cho những ai mới làm quen với ngôn ngữ lập trình web. Phân trang trong PHP cũng có nhiều cách làm. Trong bài này tôi xin hướng dẫn xây dựng một lớp phân trang đơn giản trong PHP, điều cốt yếu để tạo được một lớp phân trang là bạn phải hiểu được giải thuật của bài toán phân trang nhưng cốt yếu lại bạn chỉ cần ghi nhớ những vấn đề như:

Nếu ta qui ước một số biến để tính toán như sau.

  1. $pages : Tổng số trang
  2. $limit : Số mẫu tin trên một trang
  3. $start : Vị trí mẫu tin bắt đầu trên trang
  4. $curpage : Vị trí trang hiện tại
$pages = (tổng số mẫu tin / $limit)
nếu kết quả chia lẻ thì số trang phải được làm tròn lên
$start = ($curpage - 1) * $limit
Từ trên giễ dàng suy ra
$curpage = ($start/$limit)+1;

Từ những giải thuật trên bằng cách dùng for lặp qua tổng số trang để tạo ra các liên kết đến trang và ta sẽ dùng phương thức truyền biến GET để lấy các giá trị về số trang hiện tại hay tổng số trang.

Cụ thể hóa vấn đề sau đây sẽ là đoạn code dùng cho lớp phân trang.

class Paging{
protected $_total;
protected $_pages;

// Phương thức tìm tổng số mẫu tin
public function findTotal($db, $table){
  if(isset($_GET['total'])){
   $this->_total = $_GET['total'];
  }else{
   $sql= 'SELECT COUNT(*) FROM '.$table;
   $result = $db->query($sql);
   $row = $db->fetch_array($result);
   $this ->_total = $row[0];
  }
}

// Phương thức tính số trang
public function findPages($limit){
  $this->_pages = ceil($this->_total / $limit);
}

// Phương thức tính vị trí mẫu tin bắt đầu từ vị trí trang
function rowStart($limit){
  return (!isset($_GET['page'])) ? 0 :  ($_GET['page']-1) * $limit;
}

public function pagesList($curpage){
  $total = $this->_total;
  $pages = $this->_pages;
  if($pages <=1){return '';}
  $page_list="";

  // Tạo liên kết tới trang đầu và trang trang trước
  if($curpage!=1){
   $page_list .= '<a href="'.$_SERVER['PHP_SELF'].'?page=1&total='.$total.'" title="trang đầu">First </a>';
  }
  if($curpage  > 1){
   $page_list .= '<a href="'.$_SERVER['PHP_SELF'] .'?page='.($curpage-1).'&total='.$total.'" title="trang trước">< </a>';
  }

  // Tạo liên kết tới các trang
  for($i=1; $i<=$pages; $i++){
   if($i == $curpage){
    $page_list .= "<b>".$i."</b>";
   }
   else{
    $page_list .= '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'&total='.$total.'" title="Trang '.$i.'">'.$i.'</a>';
   }
   $page_list .= " ";
  }

  // Tạo liên kết tới trang sau và trang cuối
  if(($curpage+1)<=$pages){
   $page_list .= '<a href="'.$_SERVER['PHP_SELF'].'?page='.($curpage+1).'&total='.$total.'" title="Đến trang sau"> > </a>';
  }
  if(($curpage != $pages) && ($pages != 0)){
   $page_list .= '<a href="'.$_SERVER['PHP_SELF'].'?page='.$pages.'&total='.$total.'" title="trang cuối"> Last</a>';
  }
  return $page_list;
}// end pagesList
}// end class

Sau khi tạo xong lớp phân trang bây giờ chúng ta chỉ việc thưởng thức thành quả đã tạo ra.

$paging = new Paging;
$limit =10;
// Tổng số mẫu tin
$paging->findTotal($db,'shops');
// Tổng số trang
$paging->findPages($limit);
// Bắt đầu từ mẫu tin
$start =$paging->rowStart($limit);
// Trang hiện tại
$curpage = ($start/$limit)+1;

// Xuất dữ liệu với truy vấn
$sql ='SELECT * FROM shops LIMIT '.$start.','.$limit;
------------------

// Xuất phân trang
echo $paging->pagesList($curpage); 

Để thử nghiệm bạn nhớ tạo csdl nhiều nhiều dữ liệu chút để test. Bài toán chỉ khó ở giải thuật nhưng biết rồi thì thấy giễ, với việc xây dựng bằng lớp trong hướng đối tượng việc áp dụng sẽ vô cùng đơn giản. Tất nhiên đây không phải là cách tối ưu nhất bạn có thể biến tấu tùy theo ý của bạn để phân trang chuyên nghiệp hơn.

Bạn thấy bài viết này như thế nào?: 
Average: 10 (1 vote)
Ảnh của Khanh Hoang

Khanh Hoang - Kenn

Kenn is a user experience designer and front end developer who enjoys creating beautiful and usable web and mobile experiences.

Advertisement

 

jobsora

Dich vu khu trung tphcm

Dich vu diet chuot tphcm

Dich vu diet con trung

Quảng Cáo Bài Viết

 
Thiết kế UI UX, hướng phát triển tiếp theo mà Graphic Designer hướng đến

Thiết kế UI UX, hướng phát triển tiếp theo mà Graphic Designer hướng đến

4 lý do khiến thiết kế UI UX trở thành ngành hot được quan tâm hiện nay:

Running Drupal in Kubernetes with Docker in production

Running Drupal trong Kubernetes với Docker in production

You might think that Drupal and Docker work together nicely. They definitely can and do, in many cases, as we see with local development environments built around Docker

Hướng dẫn chính cho Drupal 8: Episode 5 - Front-End Developer Improvements

Hướng dẫn chính cho Drupal 8: Episode 5 - Front-End Developer Improvements

Please note that since Drupal 8 is still under active development, some of the details below may change prior to its release. Still, since Drupal 8 is now feature-frozen, hopefully most info should remain relevant.

Công ty diệt chuột T&C

 

Diet con trung