cakephp1.2 paginateを使用する時のまとめ

cakephpでページング使用と思って、久しぶりだったので何を使えばよいか忘れてしまっていてpearのpagerにしようかと思ったけどやっぱりcakephp標準のpaginateにしようかと思ってやってみたんだけど実装までに4時間もかかってしまって鬱になってイラッと来たので次回からは5分以内に実装するため今回つまずいた点全部まとめる。

まずcakephpのpaginateは覚えれば便利だけど、つまずく点が多いので注意すること。
これまでのpaginate関連の記事を参考までに
cakephpのpaginateでINNER JOINをしたい - 技術ブログ
cakephp1.2 paginateのgroup by対策 - 技術ブログ
cakephp1.2 paginateでunbindModelする時は第2引数にfalseを設定すること - 技術ブログ

久しぶりの場合、この辺をさらっと読むこと
よくある検索画面でPaginationを使う - cakephperの日記(CakePHP, Laravel, PHP)
要はいつも忘れるんだけどページャーでパラメーター取得するためにpassedArgs使えよってこと。

controller側

$conditions = array('cancel_flg' => 0 );
// 検索でIDの指定がある場合、部分一致で検索
// 最初のpostは$this->dataで取得し、ページャーからはpassedArgsで取得
$id = "";
if (isset($this->data['id'])) {
    $id = $this->data['id'];
} else if (isset($this->passedArgs['id'])) {
    $id = $this->passedArgs['id'];
}
if ($id != "") {
    $conditions['id like'] = '%'. $id. '%';
}
$this->paginate['conditions'] = $conditions;
$this->paginate['order'] = 'Order.id'; // 連結先のカラムも指定できる
$this->paginate['recursive'] = 1;
$this->paginate['limit'] = 10;
$users = $this->paginate('User');
// ページャーのURLパラメーターを設定
$option = array(
    'url' => array(
        'id' => $id
    )
);
$this->set( 'users', $users );
$this->set( 'id', $id );
$this->set( 'option', $option );

view側

<!-- 検索フォーム -->
<form action="/controllers/action" method="post">
<input type="search" name="data[id]" value="<?php e(h(@$id));?>">
<input type="submit" value="検索">
</form>
<!-- ページング部分 -->
<?php if($paginator->params['paging']['User']['count'] > 10): // 全データ数が11件以上の場合のみ表示?>
<?php e($paginator->options($option)); ?>
<ul>
  <li><?php e($paginator->prev('&laquo;', array('escape'=>false), '&laquo', array('tag'=>'span','escape'=>false))); ?></li>
  <?php e($paginator->numbers(array('separator'=>'','tag'=>'li','modulus'=>4))); ?>
  <li><?php e($paginator->next('&raquo;', array('escape'=>false), '&raquo', array('tag'=>'span','escape'=>false))); ?></li>
</ul>
<?php endif;?>

prev(next)の第一引数はデフォルトでタグが無効になるため、オプションでescape=falseを指定する。第三引数は1ページ目でも表示したい場合に指定。第4引数はそのオプション。
numbersはセパレートがデフォルト「|」であるため、separator=''で指定無しにしている。デフォルトspanタグで囲まれるためtag=liでliタグに変更できる。modulusには1度に表示するページ数を指定。
ページングが発生する件数以上の場合のみ表示したいといった場合、$paginator->params['paging']['User']['count']で全体の件数がとれるぽい。これはpr($paginator)をして分かった。limitの値も同様に取れるんだけど一行が長くなりすぎるのでひとまずリテラル(10)としておく。
optionsはページャーでパラメータを引き継ぐのに必要。

URLはこんな感じになる。

http://sample.com/controllers/action/page:2/id:33

16/5/22追記
パラメーター名をidにすると何故か「id:33」とならずに「/33/page:2」のような形になってしまった。注意すること。

ページャー部分の参考画像
f:id:nkawamura:20160206214310p:plain

詳細はcake側ソースも参考にすること
cake/libs/view/helpers/paginator.php

この辺のサイトが詳しい
ページネーションを利用する | CakePHP2.1初心者メモ
Paginatorの使い方。CakePHP1.2 - CPA-LABテクニカル

numbersのカスマイズの参考
CakePHPのページャーでnumbersメソッドを色々カスタマイズしたい | システムサポート技術ブログ
CakePHP Pagenatorの使い方まとめ-ITかあさん
ページャーに関してはcake1もcake2もそんなには変わらないぽいので細かい仕様は公式サイトも参考にすること。
公式サイト
PaginatorHelper — CakePHP Cookbook 2.x ドキュメント

低予算で始められるおすすめのFX口座を紹介しています。
http://s2fx.com/ranking/856.html