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>