検索条件や一覧の表示件数を引き継いでページング処理をしたいときって、結構あると思います。
例えば、「テスト」という検索ワードを保持してページ遷移したいとする。
<?php $paginator->options('url' => array('word' => 'テスト')) ?>
viewファイルに上記の一文を書いておくと、ページ遷移したときに配列の中身が飛んでくるので、それを使えば良い。確か飛んできた値は$this->params[‘named’]だか何だかに入ってるはず。なので上のワードを保持して2ページ目に遷移すると
[params] => array(
[named] => array(
[page] => 2
[word] => テスト
)
)
配列の中身はこうなるので、これを使えば良い。
$word = $this->params['named']['word'];
$conditions['OR'] = array("User.name LIKE '%$word%', User.profile LIKE '%$word%'");
$this->set('data', $this->paginate('User', $conditions));
ユーザーテーブルに名前とプロフィールというカラムがあったとして、そこからテストという文字列が入っているデータをOR検索で抽出すると、たぶんこんな感じのソースになると思う。これなら他のページに移動しても検索条件を引き継いだまま、常にテストという単語が入っているデータだけを取ってきてくれる。
・・・はずなんですけど。
いや、はずっていうか、確かにそうなるんだけど、この書き方だとローカルでは動くのにサーバーにあげたりすると正常に機能しなくなるケースがあるらしくって・・・まさに現在の僕がその状態におかれているんですけれども、まさか$paginator->optionsに問題があるなんて思わなくて、解決するまでに無駄に時間を消費したさ。PHP4だと上手く動かないとかあるのかな?
何が問題だったかというと、上記の例でいうなら、ちゃんと$this->params[‘named’]の中に値は入っているのに、ページリンクにそれが反映されていないというもの。だから他のページに遷移すると、当然のように検索条件がリセットされてしまう。
なぜそうなるのかという原因は、今現在も分からないままなんだけど、とりあえず解決方法としては、ページリンクを表示させている方に、つまり$paginator->numbersの方に直接条件をつっこんでやればいいみたい。
<?php echo $paginator->numbers(array('url' => array('word' => 'テスト'))) ?>
previewとかnextについても同様
<?php echo $paginator->prev('<<',array('url' => array('word' => 'テスト'))) ?>
<?php echo $paginator->next('>>',array('url' => array('word' => 'テスト'))) ?>
時間があればどうしてoptionsの方だと上手くいかないのかも調べようと思ってるけど、まあたぶん調べないままになってしまうんじゃないかしら・・・。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。