Phân trang trên CodeIgniter bằng class Pagination

Phân trang là chức năng mà bất kỳ hệ thống nào cũng phải có. Lớp Pagination trên CodeIgniter được hỗ trợ rất hữu ích, giúp chúng ta tùy biến việc phân trang rất hiệu quả. Trong bài này mình sẽ trình bày cách phân trang trên CodeIgniter

Các công cụ cần thiết.

Chúng ta sẽ đi xây dựng môt chương trình phân trang trên CodeIgniter bằng ví dụ cụ thể dưới đây.

1. Tạo mô-đun pagination.

Chúng ta tạo một mô-đun tên là pagination trong thư mục modules với cấu trúc như sau.

Phân trang trên CodeIgniter bằng class Pagination

Trong thư mục controllers chúng ta sẽ tạo một file tên là pagination.php, và copy đoạn code bên dưới vào.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Pagination extends CI_Controller{
	
	public function __construct(){
		parent::__construct();
		ob_start();
		$this->load->helper(array('form', 'url'));
		$this->load->model('pagination_model');
	}
	public function index(){
		$total_books =  $this->pagination_model->i_fGetTotalBooks();
		$perpage	=  5; /* Số books hiển thị trên một page*/
		
               # Tải bộ thư viện Pagination Class của CodeIgniter
		$this->load->library('pagination');
		$config['total_rows']  =  $total_books;
		$config['per_page']  =  $perpage;
		$config['next_link'] =  'Next »';
		$config['prev_link'] =  '« Prev';
		$config['num_tag_open'] =  '';
		$config['num_tag_close'] =  '';
		$config['num_links']	=  5;
		$config['cur_tag_open'] =  '<a class="currentpage">';
		$config['cur_tag_close'] =  '</a>';
		$config['base_url'] =  base_url().'/pagination/';
		$config['uri_segment']	 =  2;
               
                # Khởi tạo phân trang
		$this->pagination->initialize($config); 
		
                # Tạo link phân trang
		$pagination =  $this->pagination->create_links();

                # Lấy offset
		$offset  =  ($this->uri->segment(2)=='') ? 0 : $this->uri->segment(2); 
		
		# Đẩy dữ liệu ra view
		$a_Data['bookList'] =  $this->pagination_model->a_fGetBooks($perpage, $offset);
		$a_Data['pagination'] = $pagination;
		
		$this->load->view('pagination-template', $a_Data);
	}	
}

Giải thích cho đoạn chương trình ở trên:

  • Biến $perpage - Khởi tạo giá trị số lượng phần tử trên một trang.
  • Mảng $config['tham_số'] nhằm tạo các cấu hình cần thiết cho lớp pagination:
  •   + $config['total_rows'] : Tổng số các phần tử.
  •   + $config['per_page']   : Số lượng phần tử hiển thị trên một trang.
  •   + $config['next_link']  : Nhãn tên của nút Next - Tiếp theo.
  •   + $config['prev_link']  : Nhãn tên của nút Previous - Trước đó.
  •   + $config['num_links']  : Số lượng nút hiện thị trước và sau nút đang được chọn ( ví dụ num_links = 2 và nếu đang ở nút số 3 thì đằng trước nó có hai nút 1, 2 và đằng sau có hai nút là 5, 6 )
  •   + $config['base_url'] : Đường dẫn của từng đoạn phân trang ( link của các nút phân trang ).
  • Đoạn code $this->pagination->initialize($config) khởi tạo phân trang.
  • Đoạn code $this->pagination->create_links() sinh ra các nút phân trang
  • Đoạn code $offset = ($this->uri->segment(2)=='') ? 0 : $this->uri->segment(2) thực hiện việc lấy tham số trên đường dẫn url để đưa vào biến $offset.
  • Đoạn code $this->pagination_model->a_fGetBooks($perpage, $offset) lấy dữ liệu trong Database.

Trong thư mục views chúng ta tạo file tên là pagination-template.php để hiển thị danh sách phân trang, với nội dung là

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<title>Title |  Phân trang trên CodeIgniter bằng class Pagination</title>
	<style type="text/css">
	a.currentpage{ font-weight: bold; cursor: pointer; text-decoration: none; text-shadow: 0 0 0 transparent; }
	a.disablelink, a.disablelink:hover{ cursor: default; font-weight: normal !important;}
	a.prevnext{font-weight: normal;}
	a:hover, a:active{color: #333333;}
	</style>
</head>
<body>
	<div style="align:center;">
		<h2> Phân trang trên CodeIgniter bằng class Pagination</h2>
		<table border="1" width="800">
			<thead style="font-weight: bold;">
				<td>STT</td>
				<td>Tên Sách</td>
				<td>Tác giả</tD>
				<td>Giá</td>
			</thead>
			<?php foreach ($bookList as $i_key => $sz_User) {?>
				<tr>
					<td><?php echo $i_key+1;?></td>
					<td><?php echo $sz_User->name;?></td>
					<td><?php echo $sz_User->author;?></td>
					<td><?php echo $sz_User->price;?></td>
				</tr>	
			<?php }?>
			<tr align="center">
				<td colspan="4"">
					<?php echo $pagination;?>
				</td>
			</tr>
		</table>
	</div>
</body>

Trong thư mục models chúng ta tạo file tên là pagination_model.php để truy vấn Database lấy dữ liệu, với nội dung là

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Pagination_model extends CI_Model{
	
	/* Gán tên bảng cần xử lý*/
	private $_name = 'ci_books';
	
	function __construct(){
        parent::__construct();
    } 

    function a_fGetBooks( $perpage, $offset ){
    	$a_User	= $this->db->select()
    					->limit($perpage, $offset)
    					->order_by('name', 'ASC')
					->get($this->_name)
				        ->result();
    	return $a_User;
    }
    
    public function i_fGetTotalBooks()
    {
    	return $this->db->select()->get($this->_name)->num_rows();
    }
  
}

2. Điều hướng lại đường dẫn phân trang.

Ta mở file routes.php trong thư mục config bằng notepad++, và copy đoạn mã sau đây vào.

// Điều hướng cho việc phân trang 
$route['pagination'] = "pagination/index"; 
$route['pagination/([0-9\-]+)'] = "pagination/index/$1";

3. Chạy chương trình trên trình duyệt.

Để kiểm tra chương trình phân trang trên CodeIgniter có hoạt động hay không, chúng ta mở trình duyệt firefox và gõ vào đường link http://localhost/ci-test/pagination

Phân trang trên CodeIgniter bằng class Pagination

Để cụ thể hơn, thì các bạn hãy download file dữ liệu đính kèm bao gồm file database và mô-đun pagination

phan-trang-tren-codeigniter-bang-class-pagination.zip

Chúc các bạn thành công :)

Tags: