Ngu ngơ học làm web (x6) - CakePHP2 - Phân trang

Tiếp theo của: Ngu ngơ học làm web (x5) - CakePHP2 – Tạo home page
------

Phần x6. CakePHP2 – Phân trang


Xem (clip số 12 – chickenrainshop):

Tạo link bằng html helper (phút 1:00).

<h4><?php echo $this->Html->link('Xem thêm','/sach-moi') ?></h4>

Trong đó ‘Xem thêm’ là tên hiển thị, ‘/sach-moi’ là đường dẫn của trang được link.

Tuy nhiên ‘/sach-moi’ không tuân theo cú pháp: ‘/controller/action’, nên cần phải cấu hình một dòng lệnh trong Config/routes.php để ánh xạ từ ‘/sach-moi’ sang cú pháp ‘/controller/action’. Ví dụ,

Router::connect('/sach-moi', ['controller' => 'books', 'action' => 'latest_books']);

Do chưa có action latest_books, nên phải vào controller Books để tạo action này.

Sử dụng phương thức $this->paginate() trong controller để lấy dữ liệu cho phân trang (phút 5:17).

Số mẩu tin mặc định của paginate() trả về là 20.

Có thể tùy biến, thiết lập thêm các tham số cho biến $paginate ở đầu controller, Ví dụ,

public $paginate = [
                                    'order' => ['created' => 'desc'],
                                    'limit' => 5
                        ];

Hoặc có thể tùy biến, thiết lập thêm các tham số cho biến $paginate ngay trong action, ví dụ,

public function latest_books() {
                        $this->paginate = [
                                    'fields' => ['id', 'title', 'slug', 'image', 'sale_price'],
                                    'order' => ['created' => 'desc'],
                                    'limit' => 5,
                                    'contain' => ['Writer' => ['name', 'slug']
                                                ],
                                    'conditions' => ['published' => 1]
                        ];
                        $books = $this->paginate();
                        $this->set('books', $books);    
            }

Tạo thêm view latest_books.ctp.

<div class="books index">
            <h2><?php echo __('Sách mới'); ?></h2>
            <?php foreach($books as $book): ?>
                        <?php echo $book['Book']['title']; ?> <br>
                        <?php echo $this->Html->image($book['Book']['image'], ['width' => '60px', 'height' => '80px']); ?> <br>
                        Giá bán:<?php echo $this->Number->currency($book['Book']['sale_price'],' VND',['places' => 0,'wholePosition' => 'after']); ?> <br>
                        <?php foreach($book['Writer'] as $writer): ?>
                                    <?php echo $writer['name'].' '; ?>
                        <?php endforeach; ?>
                        <br>
                        <br>
                        <hr>
                        <br>
            <?php endforeach; ?>
</div>

Xem (clip số 12b – chickenrainshop):


Sử dụng helper paginator để phân trang (phút 0:00).

Để tạo link nhằm sắp xếp các item trên một trang, sử dụng hàm sort() của helper paginator, ví dụ, trong view latest_books, dưới đoạn mã:

<div class="books index">
            <h2><?php echo __('Sách mới'); ?></h2>

thêm đoạn mã sau:

<p>
<?php echo $this->paginator->sort('title','Sắp xếp theo tên sách'); ?>
</p>

Cú pháp của hàm sort:

sort(‘trường được sử dụng để sắp xếp’, ‘dòng thông báo hiển thị ở giao diện’

Để xuất thông tin về trang hiện tại sử dụng hàm counter() của helper paginator, ví dụ, trong view latest_books, trước thẻ </div> ở cuối tập tin, thêm đoạn mã sau:

<p>
            <?php echo $this->paginator->counter("Trang {:page}/{:pages}, hiển thị {:current} quyển sách trong tổng số {:count} quyển."); ?>
</p>

Trong đó, các biến có sẵn của paginator có ý nghĩa như sau:

- {:page}: trang hiện tại

- {:pages}: tổng số trang

- {:current}: số item trên trang hiện tại

- {:count}: tổng số item

Để hiển thị danh sách các trang, nút bấm để đi đến trang trước, trang sau; sử dụng các hàm tương ứng: numbers(), prev(), next() của helper paginator. Ví dụ,

<p>
            <?php echo $this->paginator->counter("Trang {:page}/{:pages}, hiển thị {:current} quyển sách trong tổng số {:count} quyển."); ?> <br>
            <?php echo $this->paginator->prev('<< Trang trước'); ?>
            <?php echo $this->paginator->numbers(); ?>
            <?php echo $this->paginator->next('Trang sau >>'); ?>
</p>

Để chuyển URL “dạng phân trang” sang “dạng GET”:

Ví dụ URL “dạng phân trang”,


chuyển sang “dạng GET”,


cần thêm tùy chọn ‘paramType’ => ‘querystring’ vào biến paginate, cụ thể,

$this->paginate = [
                                    'fields' => ['id', 'title', 'slug', 'image', 'sale_price'],
                                    'order' => ['created' => 'desc'],
                                    'limit' => 5,
                                    'contain' => ['Writer' => ['name', 'slug']
                                                ],
                                    'conditions' => ['published' => 1],
                                    'paramType' => 'querystring'

                        ];
-----------
Cập nhật 24/4/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web
Ngu ngơ học làm web (x7) - CakePHP2 - Bài tập Phân trang