------
Phần x6. CakePHP2
– Phân trang
Xem thêm:
- Tổng hợp các bài viết về Ngu ngơ học làm web
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
-----------
- Ngu ngơ học làm web (x7) - CakePHP2 - Bài tập Phân trang