Lớp phân trang trong PHP

  • PHP and Mysql
  • 31 tháng 03 2012
  • bởi Văn Khương
  • 0 Comments

Phân trang là một phần quan trọng của bất kỳ một website nào, đây cũng là thực hành gây nhiều khó khăn cho những ai mới làm quen với lập trình web. Phân trang trong PHP cũng có nhiều cách viết, trong bài này sẽ giới thiệu xây dựng một lớp phân trang đơn giản trong PHP, điều đầu tiên để tạo được một lớp phân trang ta cần thủ tục tìm giải thuật của bài toán trước:

Nếu 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 ý tưởng trên bằng cách dùng hàm 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 GET để lấy các giá trị về số trang hiện tại hay tổng số trang.

Cụ thể hóa 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

Dưới đây là cách sử dụng.

$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); 

Với việc xây dựng bằng lớp trong hướng đối tượng việc sử dụng lại sẽ tốt hơn. Tất nhiên đây không phải là cách tốt nhất bạn có thể sửa thêm để phân trang chuyên nghiệp hơn.

  • Chia sẻ
comments powered by Disqus