cakePHPでページング(Pear_Pager)
久しぶりにcakePHPで遊んでいる(もちろん仕事だが)。
「とある業態のウェブサイトでは、必要とされる機能が決まりきっているから、機能を一式作って格安にすれば絶対売れる」とそそのかされたから。mojaviで構築しようか迷ったが、PHP4と5両対応にしたいのでcakePHPにした。
基本機能はなんといってもbake.php!。いやぁ、もうbakeサマ様さま。基本部分をbakeしてしまえば、なんとまぁ早いこと!。入力操作は基本的にウェブサイト管理者しかやらないので、確認画面もなしにした(JavaScriptのアラートくらいは出すかもしれない)。
今回ページング処理を入れたのだが、decorate.phpを使用しなかったのはコードが煩雑になりすぎるから。decorateするとindex()の行数が300行近くになり、これはもう見にくい!。検索機能もとりあえずいらないのでbake.php+Pagerでいくことにした。
これがまぁ簡単。以下が出来上がったスクリプト。
function index($page=null) {
$perPage=20;
if(!is_numeric($page)){$page=1;}
$pagerParam=array();
$pagerParam[‘totalItems’]=$this->[モデル名]->findCount();
$pagerParam[‘perPage’]=$perPage;
$pagerParam[‘delta’]=5;
$pagerParam[‘mode’]=’sliding';
$pagerParam[‘currentPage’]=$page;
$pagerParam[‘append’]=false;
$pagerParam[‘path’]=FULL_BASE_URL . strip_plugin($this->base, $this->plugin) . ‘/[コントローラー名]/index/';
$pagerParam[‘fileName’]=”%d”;
$pager=Pager::factory($pagerParam);
$thisPage=$pager->getCurrentPageID();
$linkTags=$pager->getLinks();
$this->set(‘paging’, $linkTags[‘all’]);
$this->[モデル名]->recursive = 0;
$this->set(‘data’, $this->[モデル名]->findAll(”,”,’id DESC’,$perPage,$thisPage));
}
要点はこんな感じ。
・$pageでページ番号を受け取る。
・findCount()で総レコード数を取得。
・pagerに与えるパラメータでpathとfileNameを与える。
・pathの呼び出し方。
このコード、cakePHPやる人には絶対おすすめ(自画自賛だけどそのくらいスマート!)。