CakePHPにはPaginatorというページネーション用のヘルパーが用意されています。
使い方は簡単で、例えばコントローラにて次のように呼び出します。
$this->paginate = array(
'conditions' => $cond,
'order' => array('id'=>'DESC'),
);
$result = $this->paginate($tb_name);
ビューでは次のようにして出力することができます。
<?php echo($this->Paginator->numbers()); ?>
ここではページネーションと、一覧部分もキャッシュします。
それと、全ページをキャッシュするのもなんですので、一番PVが多そうな1ページ目だけキャッシュします。
キャッシュはCacheヘルパーを使います。ページネーション含めたコードは下記になります。
// 現在のURLを取得
$url = $this->params->url;
// 1ページ目であればURLをキーにして、それ以外はfalseに設定
$key = preg_match("/page:(\d)+/", $url, $key) ? false : $url;
// ビューに$keyを渡します
$this->set("key", $key);
// キャッシュがあればキャッシュが返す値をビューに設定
if ( $key && $result = Cache::read($key) ){
$this->set('items', $result);
return;
}
// ページネーション
$this->paginate = array(
'conditions' => $cond,
'order' => array('id'=>'DESC'),
);
$result = $this->paginate($tb_name);
// キャッシュの記録
Cache::write($key, $result);
ビューは次のようになります。まずページネーション部分です。
<?
// キャッシュがある場合はキャッシュのページネーションを出力
if ( isset($key) && $key != null && $p = Cache::read($key."paging")) {
echo($p);
} else {
// キャッシュがない場合はPaginatorを使ってページネーションを出力
php echo($this->Paginator->numbers());
if ( isset($key) ) Cache::write($key."paging", $p." ");
}
?>
一覧は次のようになります。
<?php if (isset($items) && count($items)): ?> <ul> <?php foreach ($items as $v): ?> <li><?php eh($v['...']['...']) ?></li> <?php endforeach; ?> </ul>