【CakePHP】CakePHP1.3でページングする(paginatorヘルパー)

今更シリーズですが、当時使っていた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">&lt;&lt;</a></span>
結果:
    <<
*/

最後のページのリンクを取得

echo $paginator->last('>>');
/*
最後ページの場合:
    string '' (length=0)
最後ページより前ページの場合:
    <span><a href="/test/page:[maxのページ数]">&gt;&gt;</a></span>
結果:
    >>
*/

前のページのリンクを取得

echo $paginator->prev('<');
/*
初期ページの場合:
    string '' (length=0)
2ページ目以降の場合:
   <span><a href="/test/page:[前ページのページ数]">&lt;</a></span>
結果:
   <
*/

最後のページのリンクを取得

echo $paginator->next('>');
/*
最後ページの場合:
    string '' (length=0)
最後ページより前ページの場合:
    <span><a href="/test/page:[次ページのページ数]">&gt;</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 」のようになってくれます。



投稿日:2018-09-25    更新日:2018-10-02

[スポンサーリンク]

関連記事
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
サイト内検索
プロフィール

プロフィール

[Name : じゃぶじゃぶ(@jbjb_2019)]
都内で社内SEをしているおじさん。
仕事で得られる知識だけでは限界を感じ、 WEBの勉強がてらITブログを開始。
サーバからWEBサイトまでフルスクラッチで開発しました。
現在は勉強のモチベーションを保つために活用中。
興味があることを雑記的に書いていきます。

[スポンサーリンク]

[スポンサードリンク]