Phân trang trong lập trình là điều không thể thiếu, cũng như các framework khác Cakephp cũng hỗ trợ chúng ta phân trang cho dữ liệu, theo mình thấy nó đơn giản hơn Zend hay CodeIgniter… Bài tiếp theo này chúng ta sẽ cùng tìm hiểu về nó.

Yêu cầu: đã xem qua bài Bài 5 – Truy vấn CSDL

Phần 1: Chúng ta sẽ sử dụng table books trong Bài 5 và thêm một số dữ liệu mới

Truy cập phpmyadmin thêm dữ liệu mới vào:


INSERT INTO `books` VALUES ('7', 'Kĩ thuật lập trình', 'Kĩ thuật lập trình');
INSERT INTO `books` VALUES ('8', 'Lập trình C', 'Lap trinh C can ban');
INSERT INTO `books` VALUES ('9', 'Cấu trúc dữ liệu và giả thuật', 'Cau truc du lieu va giai thuat');
INSERT INTO `books` VALUES ('10', 'PHP căn bản', 'php, lap trinh php');
INSERT INTO `books` VALUES ('11', 'PHP Nâng cao', 'php,php nang cao');
INSERT INTO `books` VALUES ('12', 'PHP Framework', 'php, php framework');

Bước 2: Mình sử dụng lại các file model, controller, và thư mục Books trong view, chỉ thêm vào một function danhsach() trong BooksController.php và tạo file danhsach.ctp trong app/View/Books/

Để sử dụng tính năng phân trang trong Cakephp thì cần phải khai báo thành phần helper Paginator


var $helpers = array('Paginator','Html');

và Namespace paginate:

var $paginate = array();

» 2 đoạn code trên chúng ta để đầu file BooksController.php phía sau public $name = “Books”;

» Thêm function danhsach() vào file BooksController.php nội dung là:

function danhsach(){
     $this->paginate = array(
       'limit' => 4,// mỗi page có 4 record
       'order' => array('id' => 'desc'),//giảm dần theo id
     );
     $data = $this->paginate("Book");
     $this->set("data",$data);
}

Ghi chú:

  • Lấy ra tất cả các dữ liệu trong bảng books, với 4 record đầu tiên theo thứ tự giảm dần id.
  • $this->paginate(“Book”) là lấy dữ liệu theo namespace paginate , với  Book  là tên model tương ứng.
  • Với controller chỉ cần như thế là có thể phân trang được rồi.

» Tiếp theo tạo thêm file danhsach.ctp trong app/View/Books/ có nội dung:

<html>
<body>
<?php
    echo $this->Paginator->prev('« Previous ', null, null, array('class' => 'disabled')); //Hiện thj nút Previous
    echo " | ".$this->Paginator->numbers()." | "; //Hiển thi các số phân trang
    echo $this->Paginator->next(' Next »', null, null, array('class' => 'disabled')); //Hiển thị nút next
    echo " Page ".$this->Paginator->counter(); // Hiển thị tổng trang
?>
<?php
  if($data==NULL){
    echo "<h2>Dada Empty</h2>";
  }else{
    echo "<table>
    <tr>
    <td>id</td>
    <td>Title</td>
    <td>Des</td>
    </tr>";
    foreach($data as $item){
      echo "<tr>";
      echo "<td>".$item['Book']['id']."</td>";
      echo "<td><a href='' >".$item['Book']['title']."</a></td>";
      echo "<td>".$item['Book']['description']."</td>";echo "</tr>";
    }
  }
?>
</body>
</html>

Ghi chú: về phần view để hiển thị html phân trang chúng ta chỉ cần đoạn sau, muốn hiển thị phân trang ở đâu chỉ cần copy vào chổ đó.


<?php
// Đoạn này là hiển thị html phân trang, muốn hiển thị ở đâu thì copy vào ngay đó
echo $this->Paginator->prev('« Previous ', null, null, array('class' => 'disabled')); //Hiện thj nút Previous
echo " | ".$this->Paginator->numbers()." | "; //Hiển thi các số phân trang
echo $this->Paginator->next(' Next »', null, null, array('class' => 'disabled')); //Hiển thị nút next
echo " Page ".$this->Paginator->counter(); // Hiển thị tổng trang
?>

Rất đơn giản phải không nào, bài này xin kết thúc tại đây.

Các bạn có thể download tại đây, mình để nguyên thư mục app nhá:

Kết luận

  1. Nếu có thắc mắc gì các bạn để lại comment bên dưới mình sẽ trả lời sớm nhất có thể.
  2. Cảm ơn các bạn đã đọc.

Nongdanit.info
[Cakephp] Bài 6 – Phân trang dữ liệu