CakePHPでPEAR::Pagerを使わずにページング
準備するもの
必要なファイルは3つ
- http://bakery.cakephp.org/articles/view/pagination-element
- http://bakery.cakephp.org/articles/view/pagination-helper
- http://bakery.cakephp.org/articles/view/pagination-component
それぞれのソースコードをファイルに保存します。
実際の記述
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']);