Phân trang cho tìm kiếm, theo chuyên mục...

Phân trang cho tìm kiếm, theo chuyên mục...

Phân trang cho tìm kiếm, theo chuyên mục...

Kế thừa từ bài viết phân trang đơn giản với PHP trước kia, có người hỏi về cách làm thế nào để phân trang cho các trường hợp như tìm kiếm hay theo chuyên mục từ lớp phân trang đó. Có nhiều cách viết phân trang, bạn có thể sử dụng framework hoặc không là tùy, ở bài viết trước chỉ là một phương pháp phân trang đơn giản, điều quan trọng là bạn phát triển nó theo ý mình như thế nào, nếu bạn đã hiểu rõ giải thuật phân trang thì việc phát triển nó cũng không mấy khó khăn.

Bài viết này tôi sẽ cải tiến 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 đưa các thao tác bên ngoài vào trong lớp cho chặt chẽ hơn nhưng cũng rất hiệu quả nhằm 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
  • Sử dụng ngắn gọn và đơn giản hơn
  • Cấu trúc chặt chẽ 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

Giải thuật thế nào bài viết trước đã nói, ở đâ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 thanh địa chỉ URL. Phương thức __construct để chạy các thuộc tính và các phương thức cần thiết khi khởi tạo đối tượng. Đoạn code trên cũng có chú thích từng đoạn nên chắc cũng không nói thêm nhiều nữa. Bây giờ việc sử dụng là quá giễ dàng:

$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'];

Tất nhiên đây vẫn chưa phải là cách tối ưu nhất, bạn hoàn toàn có thể biến tấu thêm 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

 
This screenshot is from the soon-to-be-launched LauraScott.net

Tạo chủ đề trong 1 columns: Drupal Floater Theme

As a part of wanting to throw out some of the outdated design furniture of the 20th century, I created a new theme to simply float content elements against each other.

Biểu tượng chọn Profile nằm cạnh bar “New Tab”.

Trình duyệt Chrome 16 hỗ trợ nhiều tài khoản

Để khởi động tính năng này, người dùng click vào biểu tượng cờ lê ở bên phải, sau đó đến Personal stuff rồi Add new users và đặt tên.

Drupal 8.1 và những tính năng Drupal's Future

Drupal 8.1 và những tính năng Drupal's Future

At that time, it was estimated that a new version with new features could be released every 6 months

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

 

Diet con trung