しばらく前に「CakePHPのPaginatorに独自のパラメータを追加」なんて記事を書きましたが、あれから2年もたちまして、PaginatorHelperも少しインターフェースが変わりました。ということで、同じことをCakePHP2.3系で書いたらどうなるかというのを書いてみましょう。
※ 詳しくは拙書「はじめてのCakePHP」(p.163)に書いておりますのでそちらをご覧ください。
【今回の要件】
例えば、会議予定の一覧画面で、[全て|今日の会議だけ]みたいなスイッチで絞り込みをしたいとしましょう。
やり方は色々あるのですが、どうせなら通常「http://あああ.com/・・・/index/page:2/sort:name/derection:asc」とかなってるURLにさらに「/today:1」みたいな独自のパラメータが追加できればいいですよね。
【namedパラメータが途中で消えないようにしよう(View編)】
この場合は Viewファイルに
<?php // 絞り込み条件リンクを作成 // 初期値セット $isOnlyToday = false; if (isset($this->params['named']['today'])) { $isOnlyToday= $this->params['named']['today']; } // リンク作成 if ($isOnlyToday== true ) { $str1 = $this->Paginator->link('全て', array('today'=>true)); $str2 = '今日の会議だけ'; } else { $str1 = '全て'; $str2 = $this->Paginator->link('今日の会議だけ', array('today'=>false)); } echo sprintf("絞り込み条件:[ %s | %s ]", $str1, $str2); ?>
と書きます。これでページが変わろうとソート順が変わろうと、絞り込み条件はパラメータとして引き継がれ続けます。
もちろん同じような絞り込み条件を複数書いても、両方のパラメータがセットされます。でなきゃ実戦で使えませんからね(笑。
【引き継がれた条件で絞り込み検索(Controller編)】
次はコントローラ側です。ここではリクエストパラメータを受け取って絞り込み検索を行います。Bakeで焼いただけの自動生成されたソースでは
$this->set('modelNames', $this->paginate());
となっていると思います。これを
// 「今日分だけ」パラメータがセットされていれば条件追加 // リスト6-11 (p.164) $scope = array(); if (isset($this->request->params['named']['today']) && $this->request->params['named']['today'] == true) { $today_str = date('Y-m-d'); // 今日の日付 $scope = array('start_time LIKE '=> $today_str . ' %'); } $this->Meeting->recursive = 0; $this->set('meetings', $this->paginate(null, $scope));
といった感じで書き換えればOKです。