CakePHPねたです。
——————————————————————————————————————–
CakePHPのページング機能は、1.2から標準で入っているようで、特にコンポーネントを取り込む必要はないようです。これで、通常コントローラで使う分には問題ないです。
//基本的なページングの条件
$this->paginate = array(
'limit' => 25,
'order' => array('User.created' => 'desc'),
'recursive' => 1,
);
// Userモデルの検索条件を設定する。$hogeは、事前に何か設定されていると仮定する。
$conditions = "User.name LIKE '%{$hoge}%'";
// $this->pageneteで、find検索とほぼ同じ。(ただし、設定された整列、条件で検索)
$this->data = $this->paginate('User', $conditions);
で、ビューに下記のコードを書くと・・。
<?php echo $paginator->prev('« Previous ', null, null, array('class' => 'disabled')); ?>
<?php echo $paginator->numbers(); ?>
<?php echo $paginator->next(' Next »', null, null, array('class' => 'disabled')); ?>
こんな感じで表示されます。(それぞれ、リンクが張られます。)
« Previous
1 | 2 | 3
Next »
で、2ページ目をクリックしたとき、URLは、こんな感じで飛んでいきます。
http://~~~.~~~~~.jp/users/view/page:2
——————————————————————————————————————–
しかし、絞込み条件を、Viewから得て$hogeに設定している場合は、問題が出てきます。
こんなふうに、条件をビューから得ると、2ページ目は絞込みがされないで、全件表示されます。prevも、nextも同じ症状となります。
$hoge = $this->data['search'];
何故かというと、ページャの【1 | 2 | 3】や【prev】、【next】は、単なるリンク(a href)でしかないからです。おそらくビューでは、$this->data[‘search’];をするために、form->createして、inputでコントローラに持ってきてますよね。そんで、送信とかボタン押すでしょ。
ページャで自動的に作られる【1 | 2 | 3】や【prev】、【next】は、単なるリンクなので、これをクリックしても、コントローラーでは、$this->dataは空です。(が~ん)
リンクにこんな感じで、’users/view/’. $condition 引数を設定しようとしても、ページャが自動的にリンク作るので、そんなことは、出来ません。(が~ん、が~ん)。
——————————————————————————————————————–
多分、ページャは、絞込み条件で与えられた件数を検索し、limitで割って計算して、page:2とかでその部分を持ってきているだけです。
|------------------------|------------------------|------------------------|
| 1ページ目 | 2ページ目 | 3ページ目 |
|------------------------|------------------------|------------------------|
ですので、ページングするたびに、同じ絞込み条件を与えないと、見た目、変なページングになってしまします。
——————————————————————————————————————–
解決策は、条件をどこに保存しておくか?です。
◆解決案1: データベースに保存しておく。
でも、複数の人が同時にブラウザ操作してたら・・・、工夫が必要ですよね。
◆解決案2: セッションに保存しておく。
これが、一番、現実的な解決方法だと思われます。
下記の2つをうまく組み合わせて、絞込み条件を保存し、ページングするたびに読み出せば、うまくいくはずです。
//セッションデータを読み出す。
if ($this->Session->check('pagecond')) {
$this->data = $this->Session->read('pagecond');
}
//セッションデータを書き出す。
$this->Session->write('pagecond', $this->data);
以上です。