Lớp phân trang trong PHP (P2)

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

lop_phan_trang_trong_PHP_2

Bài viết trước có đề cập đến phân trang đơn giản với PHP. Bài viết này sẽ cải tiến thêm một chút về bài lớp phân trang với PHP trước. Cũng không có thay đổi gì nhiều ngoài việc sử dụng cấu trúc lớp, đồng thời khắc phục một số vấn đề:

  • Có thể phân trang cho tìm kiếm, theo chuyên mục hay các truy vấn có điều kiện
  • Cách sử dụng tốt hơn
  • Cấu trúc hướng đối tượng đẹp hơn

Sau đây là lớp phân trang:

class Paging{
    private $table;
    public $limit;
    private $condition;
    private $getcons;
    private $_total;
    private $_pages;
    private $_curpage;
    public $start;
   
    public function __construct($table, $limit, $condition='', $geturl=''){
        $this->table = $table;
        $this->limit = $limit;
        $this->condition = $condition;
        $this->getcons = $geturl;
        $this->findTotal();
        $this->findPages();
        $this->rowStart();
    }
   
    /**
     * Phương thức tính tổng số mẫu tin
     * DES: Nếu thông tin tổng số trang được lưu trên thanh URL  thì lấy xuống, ngược lại nếu chưa có thì truy vấn trong CSDL
     */
  
    private function findTotal(){
        if(isset($_GET['total'])){
            $this->_total = $_GET['total'];
        }else{
            $sql = 'SELECT COUNT(*) FROM '.$this->table;
            if(!empty($this->condition)){
                $sql .= $this->condition;
            }
            $result = mysql_query($sql) or die(mysql_error());
            $row = mysql_fetch_array($result);
            $this->_total = $row[0];
        }
    }
   
    /**
     * Phương thức tính tổng số trang từ tổng số mẫu tin
     */
   
    private function findPages(){
        $this->_pages = ceil($this->_total/$this->limit);
    }
   
    /**
     * Phương thức tính vị trí mẫu tin bắt đầu từ vị trí trang
     */
    private function rowStart(){
        $start = (!isset($_GET['page'])) ? 0 : ($_GET['page'] - 1)* $this->limit;
        $this->_curpage = ($start/$this->limit) +1;
        $this->start = $start;
    }
   
    /**
     * Hiển thị phân trang
     * @return string
     */
    public function pagesList(){
       
        $pages = $this->_pages;
        if($pages <=1){return '';}
       
        $page_list ='';
        $curpage = $this->_curpage;
        $total = $this->_total.'&'.$this->getcons;
       
        /**
         * Tạo liên kết tới trang đầu và trang trước
         * Des: Chỉ hiển thị liên kết nếu trang hiện tại không phải là trang đầu tiên
         */
       
        if($curpage > 1){
            $page_list .= '<a href="'.$_SERVER['PHP_SELF']. '?page=1&total=' .$total.'"> First</a>';
            $page_list .= '<a href="'.$_SERVER['PHP_SELF']. '?page='.($curpage-1) .'&total='.$total.'"> < </a>';
        }
       
        /**
         * Tạo liên kết tới các trang
         * Ở trang hiện tại thì hiển thị highlight và không tạo liên kết
         */
        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.'"> '.$i.'</a>';
            }
        }
       
        /**
         *  Tạo liên kết tới trang kế tiếp và trang cuối
         *  Des: Chỉ hiển thị liên kết nếu trang hiện tại không phải là trang cuối
         */
        if($curpage < $pages){
            $page_list .= '<a href="'.$_SERVER['PHP_SEFL'].'?page='. ($curpage +1). '&total='. $total.'"> > </a>';
            $page_list .= '<a href="'.$_SERVER['PHP_SEFL'].'?page='. $pages.'$total='. $total.'">Last</a>';
        }
       
        return $page_list;
    }// End pagesList
}// End class

Ở đây chỉ thêm vào thuộc tính $condition và $getcons nhằm mục đích lưu thông tin về điều kiện truy vấn và thông tin điều kiện cho đường dẫn URL. Phương thức __construct để chạy những cần thiết khi khởi tạo đối tượng. Bây giờ việc sử dụng trở nên đơn giản:

$pagination = new Paging('shops',2,$condition,$geturl);
// Xuất dữ liệu với truy vấn
$sql ='SELECT * FROM shops LIMIT '.$pagination->start.', '.$pagination->limit;
// Xuất phân trang
echo '<p>'.$pagination->pagesList().'</p>';

Khi khởi tạo đối tượng ta đưa thông tin về truy vấn vào biến $condition, ở đây chỉ có phần điều kiện là một chuỗi truy vấn bắt đầu từ " WHERE". Biến $geturl đưa thông tin về điều kiện xẽ hiển thị trên thanh địa chỉ và thông tin này dùng để truy xuất giữ liệu theo điều kiện. Ví dụ:

$condition =' WHERE tieude LIKE "%'.$_GET['textsearch'].'%"';
$geturl = 'textsearch='.$_GET['textsearch'];

Đoạn code trên đương nhiên vẫn còn "chuối", bạn hoàn toàn có thể biến tấu thêm để phân trang chuyên nghiệp hơn.

  • Chia sẻ
comments powered by Disqus