paginateでページングした時に欲しいページ関連の値
CakePHP1.2からはpaginate標準で使えるらしく使ってみた。
<?php $this->paginate = array( 'limit' => 10 ); $this->set('videos', $this->Paginate()); ?>
規約どおりにvideoモデルをページングさせたいだけなので、これだけでviewで使える。
でも問題があって、view側で簡単にpage関連の情報を扱うことができない。例えば現在のページとか、全部で何ページあるのかとか・・・。
viewから何とかして値を取ろうとすると
$this->params['paging']['Videos']['page'];
てなって、大変深くなってしまう。ので、helperを拡張してページングすると勝手に使えるようになるpaginatorHelperから
$paginator->paging('page');
で欲しい値が引けるようにしてみる。まず、appフォルダ以下にapp_helper.phpを作成
<?php class AppHelper extends Helper { var $helpers = array('Html'); public function paging($key){ $paging = $this->params['paging'][$this->defaultModel()]; if($key == "start") return ife($paging['count'] >= 1, ($paging['page'] - 1) * ($paging['options']['limit']) + 1, '0'); else if($key == "end"){ $start = ife($paging['count'] >= 1, ($paging['page'] - 1) * ($paging['options']['limit']) + 1, '0'); return ife(($paging['count'] < ($start + $paging['options']['limit'] - 1)), $paging['count'], ($start + $paging['options']['limit'] - 1)); } return $paging[$key]; } public function paging_url($page){ return $this->Html->url(array('page' => $page)); } }
をコピペ。そうすると、各種viewから
<?php $paginator->paging('page');//現在のページ $paginator->paging('pageCount');//トータルのページ数 $paginator->paging('count');//全アイテム数 $paginator->paging('start');//現在のページの最初のアイテムのインデックス $paginator->paging('end');//現在のページの最後のアイテムのインデックス ?>
となる。もっといい方法があれば教えてください。ちなみの別ページへのリンクをはる場合は、
<a href="<?= $paginator->paging_url(2);">2ページ目</a>
でどうぞ!