06/04/2021, 14:49

Bài 7: Load Library Pagination Trong Codeigniter - Lập trình Codeigniter 3x

Trong bài này bạn sẽ được họ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 ...


Đâ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");
    }
}
Để bắt đầu tiến hành phân trang chúng ta cần phải khai báo một số tham số như sau. Và tất nhiên với các tham số này chỉ là basic thôi nhé các bạn. Để áp dụng vào thực tế thì chúng ta cần phải kết hợp thêm rất nhiều thứ để có thể hoàn chỉnh phân trang cho một action trong controller.
$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
Để giới hạn kết quả trả về chúng ta cần phải thao tác với model, trong ví dụ này tôi sẽ dùng lại file muser.php, cái đầu tiên mà chúng ta cần viết, chính là phải tính tổng số record có bao nhiêu trong database. Ở đây active record hỗ trợ chúng ta hàm count_all() dùng để tính tổng record.
public function countAll(){
        return $this->db->count_all($this->_table); 
}
Tiếp theo tôi sẽ load model ngay trong action index, thông tin đầu tiên mà tôi phải cấu hình chính là tổng số record trong database thông qua phương thức countAll mà tôi vừa viết trong model muser, sau đó cấu hình đường dẫn cho controller & action muốn phân trang, để nạp đường dẫn một cách 9 xác, tôi sẽ dùng hàm base_url() được hỗ trợ trong helper url. Và tất nhiên tôi cũng phải cấu hình bao nhiêu record trong một trang tức là phần per_page đó các bạn. Chúng ta phải bắt buộc truyền biến config vào library pagination để có thể thực thi việc phân trang. Cuối cùng tôi echo trực tiếp hàm create_links() trong controller để show kết quả xem chúng ta phân trang có thành công chưa, nên nhớ việc đổ dữ liệu chỉ nên thao tác trong view thôi nhé.
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();
    }
Nếu màn hình kết quả trả về như sau xem như thao tác thành công.

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();
 }
Muốn thao tác trong việc show danh sách thành viên ta phải gọi phương thức getList() trong controller, truyền vào nó 2 tham số, số record trong một trang & vị trí bắt đầu, muốn có đươc vị trí bắt đầu thì ta phải get được cái đường dẫn của nó, chính là get cái id đó các bạn, trong CI nó có một helper hỗ trợ chúng ta lấy được đường dẫn và khuyến cáo không được sử dụng phương thức $_GET, vì nó không an toàn. phương thức thay thế nó chính là $this->uri->segment(tham số), để có thể lấy đường dẫn một cách chính xác tôi có cách đếm như sau , ví dụ link localhost/citest/index.php/page/index/???, page = controller ứng với vị trí số 1, index = action , và tham số vị trí $start chính là vị trí thứ 3.
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);
    }
Nhiệm vụ của getList là đổ về dữ liệu những cái mảng chứa thông tin user và chúng ta sẽ phải làm việc trong view, tôi tạo file page_view.php, và bên trong nó tôi cũng in dữ liệu trong cặp thẻ pre.
echo "<pre>";
print_r($data);
echo "<pre>";
"; echo $this->pagination->create_links(); Nếu kết quả trả về như trên, chúng ta đã tiến hành phân trang và kiểm soát record trả về thành công.

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;
- Sử dụng theo từng số trang: Bình thường link sẽ lấy tham số là vị trí bắt đầu tức là 3 , sau đó click trang 2 nó sẽ nhảy ra tham số là 9, sử dung phương thức này khi bạn click vào trang 2 nó sẽ hiển thị link như sau localhost/citest/index.php/page/index/2. tức là sử dụng 9 xác vị trí của trang.
$config['use_page_numbers'] = TRUE;
Ngoài ra còn rất nhiều phương thức hỗ trợ chúng ta trong việc phân trang, các bạn tự tìm hiểu sâu hơn nhé, tôi chỉ hướng dẫn đến đây thôi.

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.

 

Trịnh Tiến Mạnh

27 chủ đề

6824 bài viết

Cùng chủ đề
0