2008年3月25日 星期二

CakePHP Pagination (分頁功能)

原本 1.1 版本是沒有分頁功能,但可以藉由 Bakery 上的討論區找到寫好的 Component 和 Helper。到了1.2版之後,CakePHP很貼心地內建了這項功能。在開發網站上,分頁是一項很常用的功能,有了這項功能,更可以讓開發的速度加快。

分頁的功能,官網上面已經有說明了,Bakery 上也有很多相關的說明,都可以參考。我寫了一個簡單的範例程式來說明CakePHP的pagination如何使用。

Controller:post_controller.php

class PostController extends AppController {

public $name = 'Post';
public $uses = null;

function all() {
$this->paginate = array(
'fields' => array('Article.id', 'Article.title', 'Article.created'), /* 選擇要顯示的資料庫欄位 */
'limit' => 3, /* 每頁幾筆資料 */
'order' => 'Article.created desc' /* 預設的排序方式 */
);

$this->loadModel("Article"); /* 載入 Model */
//$this->Article->recursive = false; /* 如果 Model 有 hasOne, hasMany 等對應關係,且不需要時,把 recursive 設成 false */

$this->Article->recursive = 0; /* 如果 Model 有 hasOne, hasMany 等對應關係,且不需要時,把 recursive 設成 0 */

$this->set('articles', $this->paginate($this->Article,"Article.user_id='".$this->UserID."'")); /* 使用 paginate 函式取得資料,第二個參數可設定條件 */
}// all

}

View: all.ctp

<table border='1' bordercolor='#cccccc' cellspacing='0' cellpadding='5' width='80%' align='center'>
<?php
$th = array($paginator->sort("標題", "title"), $paginator->sort("建立時間", "created"), "操作"); /* 在版型的標題上,加入可以針對欄位做排序的功能 */
echo $html->tableHeaders($th);

$size = count($articles);
for($i = 0; $i < $size; $i++) {
$tr = array($articles[$i]["Article"]["title"], $articles[$i]["Article"]["created"], "<a href='/post/edit/".$articles[$i]["Article"]["id"]."'>編輯</a>"); /* 顯示資料 */
echo $html->tableCells($tr, array("bgcolor"=>"#999999"), array("bgcolor"=>"white"));

}// end for
?>
</table>
<center>
<?php
echo $paginator->first('第一頁'). ' ';
echo $paginator->prev('<< 前一頁').' ';
echo $paginator->numbers(array('separator'=>' - '));
echo ' '.$paginator->next('下一頁 >>');
echo ' '.$paginator->last("最後一頁");
?>
<br>
<?php
echo $paginator->counter(array(
'format' => '目前在第 %page% 頁 / 總共 %pages% 頁, 每頁 %current% 筆資料, 總共 %count% 筆, 目前是第 %start% 至 %end% 筆資料'
));
?>
</center>

最後得到的HTML碼會是:

<table border='1' bordercolor='#cccccc' cellspacing='0' cellpadding='5' width='80%' align='center'>
<tr><th><a href="/post/all/page:1/sort:title/direction:asc">標題</a></th>

<th><a href="/post/all/page:1/sort:created/direction:desc">建立時間</a></th>

<th>操作</th>

</tr>

<tr bgcolor="#999999>資料顯示在這邊(略)</tr></table>
<center>
<span class="current">1</span> - <span><a href="/post/all/page:2">2</a></span> - <span><a href="/post/all/page:3">3</a></span> - <span><a href="/post/all/page:4">4</a></span> <a href="/post/all/page:2">下一頁 &gt;&gt;</a> <span><a href="/post/all/page:4">最後一頁</a></span><br>
目前在第 1 頁 / 總共 4 頁, 每頁 3 筆資料, 總共 12 筆, 目前是第 1 至 3 筆資料</center>

由上面的HTML可以發現CakePHP已經將分頁的功能,自動做好了,而且分頁的參數是以 /page:n 的方式產生。在標題的部分,也做好排序的功能,可以試著點選看看,會自動做遞增、遞減的排序。

參考資料:

官網上有關 Pagination 說明:http://book.cakephp.org/view/164/pagination

Bakery上的討論:

http://bakery.cakephp.org/articles/view/basic-pagination-overview-3

http://bakery.cakephp.org/articles/view/advanced-pagination-1-2

http://bakery.cakephp.org/articles/view/pagination-recall

張貼留言