Bài 7: Load Library Pagination Trong Codeigniter
Trong bài này bạn sẽ được học:
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.
- Các thao tác xử lý với phân trang.
- Các vấn đề mở rộng trong pagination.
Lưu ý:
Tôi sử dụng Codeigniter version 2.1.4.
Tên folder của tôi là citest cho bài viết này.
Đây là một library cũng khá là phổ biến, hay được sử dụng trong quá trình xây dựng ứng dụng website, nó có nhiệm vụ giúp chúng ta phân trang một cách dễ dàng. Bản chất của library pagination là nó chỉ tạo ra những đường link, chứ nó không hỗ trợ chúng ta giới hạn kết quả trả về, để làm được điều đó chúng ta phải thực thi thao tác với model, tức là phải đụng tới database & sử dụng active record đấy các bạn.
Load Library pagination
Cũng giống như các library trước, để có thể thao tác với nó chúng ta phải load nó trong controller. Ở bài viết này chắc các bạn đã hiểu rõ cách tạo controller cũng như action trong CI rồi nhé, nên tôi sẽ không nhắc lại nửa, tôi có controller là page và action là index, và trong ví dụ này tôi chỉ sử dụng duy nhất một action , nên tôi sẽ gọi library ngay tại action index, và ngay tại constructor tôi cũng phải load helper url ra để có thể khai báo đường dẫn đến controller và action muốn phân trang, helper là gì thì ở bài sau tôi sẽ giải thích sau.
class Page extends CI_Controller{ public function __construct(){ parent::__construct(); $this->load->helper("url"); } public function index(){ $this->load->library("pagination"); } }
$config['base_url'] = "Đường dẫn controller & action muốn phân trang"; $config['total_rows'] = "Tổng số record"; $config['per_page'] = "Số record trên một trang"; $this->pagination->initialize($config); // Chạy phân trang
public function countAll(){ return $this->db->count_all($this->_table); }
public function index(){ $this->load->model("Muser"); $config['total_rows'] = $this->Muser->countAll(); $config['base_url'] = base_url()."index.php/page/index"; $config['per_page'] = 3; $this->load->library('pagination', $config); echo $this->pagination->create_links(); }
1 2 3 > Last ›
Để hình dung cho việc tại sao không thấy danh sách thành viên ở đâu cả, trả lời để có thể thấy được danh sách thì chúng ta phải xử lý thêm vài thao tác trong model ví dụ như dùng result_array() lấy toàn bộ record đổ nó ra một cái mảng, truyền tham số vào view & show dữ liệu ngay trong view. Tất nhiên là phải giới hạn kết quả, mà muốn giới hạn kết quả thì phải dùng limit() và nhớ rằng trong CI phần limit nó khác một xíu chính là lấy từ tổng số record rồi mới đến vị trí bắt đầu.
public function getList($total, $start){ $this->db->limit($total, $start); $query=$this->db->get("user"); return $query->result_array(); }
public function index(){ $this->load->model("Muser"); $config['total_rows'] = $this->Muser->countAll(); $config['base_url'] = base_url()."index.php/page/index"; $config['per_page'] = 3; $start=$this->uri->segment(3); $this->load->library('pagination', $config); $data['data']= $this->Muser->getList($config['per_page'], $start); $this->load->view("page_view", $data); }
echo "<pre>"; print_r($data); echo "<pre>";
Array
(
[0] => Array
(
[id] => 1
[username] => admin
[password] => 123456
[level] => 2
)[1] => Array
(
[id] => 2
[username] => alibaba
[password] => 123456
[level] => 1
)
[2] => Array
(
[id] => 3
[username] => vicky
[password] => 123456
[level] => 1
)
)
1 2 3 > Last ›
Các vấn đề mở rộng trong pagination
- Độ phân giản của link: khi bạn click vào link 3 thì phía nó hiển thị như sau 1 2 3 4 5.
$config['num_links'] = 2;
$config['use_page_numbers'] = TRUE;
Kết:
Để có thể phân trang cho một action nào đó, các bạn cần phải nắm rõ những phương thức mà tôi vừa nêu ở trên, thật ra nó rất là đơn giản, nhưng cái user guide của nó viết chung chung quá, khiến quá trình tìm hiểu của chúng ta gặp khó khăn, nhưng chỉ cần làm giống những gì tôi vừa trình bày ở trên là có thể phân trang bất cứ action nào mà bạn mong muốn.