【CakePHP】CakePHP1.3でページングする(paginatorヘルパー)
-
カテゴリ:
- PHP
-
タグ:
- #CakePHP
今更シリーズですが、当時使っていたCakePHP1.3系のページングのやり方をメモしておきます。ページングは自前で作ると結構面倒など思いますが、CakePHPがデフォルトで持っているページング機能を使えばラクチンです。
まずコントローラ側でページングするためデータの準備をします。 普通ならモデルを呼んで、配列を受け取って、画面に渡して、、、などしますが、 まずはpaginatorヘルパーに必要なオプション情報を渡して、ページング用のデータを取得します。
サンプルソース
コントローラー
<?php
/*
'conditions' => 検索条件(array or string)。
'fields' => 取得カラム(array or string)。
'page' => 初回に表示するページ数(int)。デフォルトは1。
'limit' => 1ページに表示するデータ数(int)。デフォルトは20。
'sort' => ソースするカラム(string)。
'direction' => 昇順か降順か(string [asc or desc])。デフォルトはasc。
'recursive' => 正直なんだかよくわかってない。。。(findAllにするかどうか?)
*/
$this->paginate=array(
'conditions' => array("name" => "TEST", "age >=" => "10"),
'fields' => array("id","name","age","sort"),
'page' => 1,
'limit' => 10,
'sort' => "sort",
'direction' => "asc",
);
/*[補足]モデルを指定したい場合は、「 $paginate = array([モデル名] => array());」とする */
?>
コントローラーでデータ取得後、ビューでは以下の通りに書くだけでページングのリンクが取得できます。
最初のページのリンクを取得
echo $paginator->first('<<');
/*
初期ページの場合:
string '' (length=0)
2ページ目以降の場合:
<span><a href="/test/page:1"><<</a></span>
結果:
<<
*/
最後のページのリンクを取得
echo $paginator->last('>>');
/*
最後ページの場合:
string '' (length=0)
最後ページより前ページの場合:
<span><a href="/test/page:[maxのページ数]">>></a></span>
結果:
>>
*/
前のページのリンクを取得
echo $paginator->prev('<');
/*
初期ページの場合:
string '' (length=0)
2ページ目以降の場合:
<span><a href="/test/page:[前ページのページ数]"><</a></span>
結果:
<
*/
最後のページのリンクを取得
echo $paginator->next('>');
/*
最後ページの場合:
string '' (length=0)
最後ページより前ページの場合:
<span><a href="/test/page:[次ページのページ数]">></a></span>
結果:
>
*/
各ページのリンクを取得
echo $paginator->numbers();
/*
出力されるHTML:
<span class="current">1</span> |
<span><a href="/test/page:2">2</a></span> |
<span><a href="/test/page:3">3</a></span> |
<span><a href="/test/page:4">4</a></span> |
<span><a href="/test/page:5">5</a></span> |
<span><a href="/test/page:6">6</a></span> |
<span><a href="/test/page:7">7</a></span> |
<span><a href="/test/page:8">8</a></span>
結果:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
*/
最初と最後のリンク数を指定して取得
$paginator->numbers(array('first' => 2, 'last' => 2)
/*
出力されるHTML:
<span class="current">1</span> |
<span><a href="/test/page:2">2</a></span> ...
<span><a href="/test/page:4">4</a></span> |
<span><a href="/test/page:5">5</a></span> |
<span><a href="/test/page:6">6</a></span> ...
<span><a href="/test/page:7">7</a></span> | <
span><a href="/test/page:8">8</a></span>
結果:
1 | 2 | ... 4 | 5 | 6 ... 7 | 8
*/
// オプションの利用
/*
%page% - 現在表示しているページ
%pages% - ページ総数
%current% - 表示している現在のレコード数
%count% - 結果セットのレコード総数
%start% - 表示している最初のレコードの数
%end% - 表示している最後のレコードの数
*/
echo $paginator->counter(array(
'format' => 'Page %page% of %pages%,
showing %current% records out of %count% total,
starting on record %start%, ending on %end%'
));
中の動きとしては、$paginatorに情報を渡すと、カラム情報や検索条件を基にクエリを発行して、取得したデータを「limit」オプションで指定した件数ずつ小分けにし、「page」オプションで対象ページのデータの塊をビューに渡している感じです。デフォルトで取得するページは「1」になっています。
paginatorが作成したリンクのURLにはページ数がついており(URL/page:[ページ数])、リンクをクリックされた際、コントローラではそのページ数がpaginatorに勝手に渡され、対象ページのデータとnext/prevのリンクを都度作成してビューに返す仕組みになっています。
ただ注意したいのが、paginatorが作成するURLリンクは「表示した画面URL+/paga:[ページ数]」となっているため、検索条件をURLパラメータで渡していた場合は、検索条件がクリアされた状態で処理されてしまいます。
その際は、検索条件をセッションで保持するようにするか、「$paginator->options(array('url' => 'keyword:' . urlencode('hogehoge')));」とすると「 …/page:2/keyword:hogehoge 」のようになってくれます。