CakePHPでPEAR::Pagerを使わずにページング

準備するもの

必要なファイルは3つ

それぞれのソースコードをファイルに保存します。

  • /app/views/elements/pagination.thtml
  • /app/views/helpers/pagination.php
  • /app/controllers/components/pagination.php

実際の記述

controller

コンポーネントの追加

var $components = array('Pagination');

Pagenation呼び出し

$this->Pagination->modelClass = 'Customer';
$this->Pagination->sortBy = 'created';
$this->Pagination->direction = 'DESC';
$this->Pagination->show = 20;
$this->Pagination->page = $page;
list($order,$limit,$page) = $this->Pagination->init($condition);
$data = $this->Customer->findAll($condition,NULL,$order, $limit, $page);
view
$pagination->setPaging($paging);
echo $this->renderElement('pagination');

表示のカスタマイズ

ページ切り替え

/app/views/elements/pagination.thtmlをそのまま使うと、next,prevの部分が固定のイメージファイルになっているので、好みに応じて編集します。例えば、「<<前の○件」「次の○件>>」としたい場合
編集前:

$leftArrow = $html->image("nav/arrowleft.gif", Array('height'=>15));
$rightArrow = $html->image("nav/arrowright.gif", Array('height'=>15));

編集後

$leftArrow = h('<<前の' . $row_count . '');
$rightArrow = h('次の' . $row_count . '件>>');

※$row_countは1ページあたりの件数が固定であればベタ打ちでもいいが、可変の場合はcontroller側でsetするのを忘れずに。

$this->set('row_count', 20);
総ヒット件数

ヒット件数や「21〜40件」というような表示。

echo $pagination->result());

デフォルトのままだと「Results: 21-40 of 100」のような英語表記になります。

日本語にする場合は、パラメータを指定します。

echo $pagination->result('結果:','/','〜'));

この例では「結果:21〜40/100」となります。


もし総ヒット件数だけでいいという場合は、/app/views/helpers/pagination.phpの150行目あたりのresultの中を編集します。
編集前

if($this->_pageDetails['pageCount'] > 1)
{
	$start_row = (($this->_pageDetails['page']-1)*$this->_pageDetails['show'])+1;
	$end_row = min ((($this->_pageDetails['page'])*$this->_pageDetails['show']),($this->_pageDetails['total']));
	$t = $t.$start_row.$inbetween.$end_row.$of.$this->_pageDetails['total'];
}
else
{
	$t .= $this->_pageDetails['total'];
}

編集後:

$t .= $this->_pageDetails['total'];


カンマ区切りにしたい場合もここ(/app/views/helpers/pagination.phpの150行目付近)を編集します。

$t .= number_format($this->_pageDetails['total']);