Cake1.2でページング

前回はController側の記述をしたので、今回はview側index.ctpファイルを見ていく。

counter

bakeしたファイルindex.ctpを眺めていくと最初に出てくるのはcounterメソッド。

初期状態の表示方法

echo $paginator->counter(array(
'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true)
));

日本語に直した場合はこんな感じ。

echo $paginator->counter(array(
'format' => __('現%page%ページ/全%pages%ページ、%current%件/全%count%件、%start%〜%end%件を表示', true)
));

全部を表示すると長いので、実際に使うのはこんな感じ。

echo $paginator->counter(array(
'format' => __('%start%〜%end%件/全%count%件', true)
));

sort

次に出てくるのはテーブルヘッダのsortメソッド。

<th><?php echo $paginator->sort('id');?></th>
<th><?php echo $paginator->sort('name');?></th>

見出し(列名)クリックでソート順変更になるリンクを出力してくれます。
カラム名と異なる見出しを使いたい場合は、見出し用の文字列を第1引数に、ソートに使用するカラム名を第2引数にします。

<th><?php echo $paginator->sort('番号','id');?></th>
<th><?php echo $paginator->sort('名前','name');?></th>

paging

最後は表組みの下部にあるページングエリア。ここは、prev、numbers、nextメソッドで構成されます。

<div class="paging">
    <?php echo $paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?>
    <?php echo $paginator->numbers();?>
    <?php echo $paginator->next(__('next', true).' >>', array(), null, array('class'=>'disabled'));?>
</div>

まず日本語で書き直してみるとこんな感じ。

<div class="paging">
    <?php echo $paginator->prev('<< '.__('', true), array(), null, array('class'=>'disabled'));?>
    <?php echo $paginator->numbers();?>
    <?php echo $paginator->next(__('', true).' >>', array(), null, array('class'=>'disabled'));?>
</div>

前や次のページがない場合にprevやnext表示をしない場合は、各メソッドの第3引数に空白を渡す。

<div class="paging">
    <?php echo $paginator->prev('<< '.__('previous', true), array(), ' ', array('class'=>'disabled'));?>
    <?php echo $paginator->numbers();?>
    <?php echo $paginator->next(__('next', true).' >>', array(), ' ', array('class'=>'disabled'));?>
</div>

$paginator->numbersの引数で分かったのは、modulusとseparator。

<?php echo $paginator->numbers(array('separator'=>',','modulus'=>'4'));?>

この例では数字の区切り文字に','を使い、表示ページを除く4ページ分(つまり最大5ページ分の数字)を並べるということになります。

表示例
<< previous 1,2,3,4,5 next >>

デフォルトでは下記のように区切り文字'|'で8ページ分(表示ページを含めると9ページ分)を指定したのと同じ表示になります。

<?php echo $paginator->numbers(array('separator'=>'|','modulus'=>'8'));?>