Khanh Hoang - Kenn
Kenn is a user experience designer and front end developer who enjoys creating beautiful and usable web and mobile experiences.
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.
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.