--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Hiển thị các bài đăng có nhãn Phân trang. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Phân trang. Hiển thị tất cả bài đăng

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