Thứ Tư, 15 tháng 10, 2008

Pagination - Phân trang trong cakephp 1.1.x

Đối với cakephp 1.1.x, hiện tại chưa hỗ trợ sẵn việc phân trang giống như trong cakephp 1.2. Đối với cakephp 1.2 bạn chỉ việc dùng sẵn helper là có thể phân trang được. Với bản cakephp 1.1 việc phân trang sẽ do chúng ta tự làm. Sau đây tôi xin hướng dẫn các bạn phân trang trong cakephp bằng components và helper của Andy Dawson.

Cài đặt:


- Bạn lưu file http://i-php.net/2008/10/pagination-component/ thành /app/controllers/components/pagination.php

- Bạn lưu file http://i-php.net/2008/10/pagination-helper/ thành /app/views/helpers/pagination.php

- Bạn lưu file http://i-php.net/2008/10/pagination-element/ thành /app/views/elements/pagination.thtml

Sử dụng trong controller


Trong controller, khi nào muốn sử dụng hàm phân trang thì ta chỉ việc sử dụng components và helper pagination mà chúng ta vừa tạo ra ở trên. Ta sẽ khởi tạo chúng trước khi thực hiện lấy dữ liệu. Ví dụ như chúng ta sẽ sử dụng chúng trong controller Post như sau:
<?php
class PostsController extends AppController
{
var
$name = 'Posts'; // for PHP4 installs
var $components = array ('Pagination'); // Added
var $helpers = array('Pagination'); // Added


function index() {
$criteria=NULL;
list(
$order,$limit,$page) = $this->Pagination->init($criteria); // Added
$data = $this->Post->findAll($criteria, NULL, $order, $limit, $page); // Extra parameters added

$this->set('data',$data);
}
}
?>

Sử dụng trong views


Ta sẽ tạo ra một views post mà sử dụng phân trang ở trên.
<h1>Paginated Posts Index</h1>
<table>
<?php
$pagination
->setPaging($paging); // Initialize the pagination variables
$th = array (
$pagination->sortBy('id'),
$pagination->sortBy('title'),
$pagination->sortBy('created')
);
// Generate the pagination sort links
echo $html->tableHeaders($th); // Create the table headers with sort links if desired


foreach ($data as $output)
{
$tr = array (
$output['Post']['id'],
$html->link($output['Post']['title'], "/Posts/View/{$output['Post']['id']}"),
$output['Post']['created']
);
echo
$html->tableCells($tr,array('class'=>'altRow'),array('class'=>'evenRow'));
}
?>
</table>
<? echo $this->renderElement('pagination'); // Render the pagination element ?>

Trong view trên ta có sử dụng hàm sortBy() trong helper Pagination, hàm này sẽ sắp xếp lại dữ liệu theo các trường trong model khi ta kích vào đấy theo thứ tự tăng dần hoặc giảm dần. Hàm setPaging() sẽ xác định xem hiện ta đang ở trang nào. Việc hiện thị các trang cũng như các tuỳ chọn của trang sẽ được thực hiện qua hàm renderElement(), hàm này sẽ gọi pagination.thml trong element ra để thực hiện hiển thị chức năng phân trang.

4 nhận xét:

  1. Hi anh,
    Anh đã viết một trang tin tưc dùng cakephp chưa vậy?
    em mún hỏi xin anh một source để về nghiên cứu! em chưa bít làm phân trang trong cakephp?
    Mong sớm nhận được hồi âm của anh
    thanks,
    Tan Vinh

    Trả lờiXóa
  2. Hi Vinh,
    Bài này mình viết lâu lắm rồi, hồi đó còn đang dùng cakephp 1.1.x. Hiện tại đã dùng đến phiên bản 1.3.4 Stable & 1.2.8 Stable. Phân trang đã hỗ trợ gần hết rồi, tra cứu cũng đơn giản, nếu bạn mới tìm hiểu thì nên tìm hiểu từ những phiên bản mới nhất vừa có nhiều tài liệu tra cứu lại vừa hỗ trợ đầy đủ. Trong quá trình tìm hiểu bạn mắc chỗ nào cứ đăng câu hỏi, mọi người sẽ giúp.

    Trả lờiXóa
  3. Chào bạn hiện tại mình đang sử dụng bản cake 1.3 và mình cũng đang làm về phần phân trang nhưng vấn đề của mình ở đây là trên một trang mình cần phân trang 2 lần cơ bạn có cách nào ko chỉ giúp mình với nhé! Thanks.

    Trả lờiXóa
  4. chào bạn HongVT.

    Mình chưa sử dụng cake 1.3, nhưng mình nghĩ cũng phân trang như bt, ko khác j` đâu.
    Mình cũng ko hiểu rõ : "trên một trang mình cần phân trang 2 lần" là như thế nào?
    1 trang có list cần được phân trang hay 1 list muốn hiện 1 phân trang ở trên cùng và 1 ở dưới cùng?

    Bạn cứ thử làm như bt đi rồi post lỗi lên mọi người tham khảo.

    Trả lờiXóa