CakePHP3でモデルを使わないページネーション

スポンサーリンク

CakePHP3 のプロジェクトで、モデル(DBテーブル)を使わないデータのコレクションをページングさせて表示させたい機会がありました。GitHub で見つけた jasongrimes/php-paginator を使って解決しました。感謝!

https://github.com/jasongrimes/php-paginator

— 環境 —
CakePHP 3.1.1
PHP 5.5.19
jasongrimes/paginator 1.0.2

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

デフォルトの PaginatorComponent ソースを読んでみた

まずは、CakePHP3にデフォルトでバンドルされている PaginatorComponent を使って実現できないか調べました。ソースを読んでみたところ、デフォルトの PaginatorComponent でのページネーションは、モデルを使うことを前提としているっぽい…。深追いしてないんであまり自信ないですけど。

vendor/cakephp/cakephp/src/Controller/Component/PaginatorComponent.php

Controller::paginate() の実装で、$query->all() または $query->count() を使ってページングに必要なデータの総件数を取得してあります。独自コンポーネントを作って、paginate() メソッドをモデルを使わずに動くようにオーバーライドする方法でも良いかもしれませんけど、面倒なのでやめました。

ページネーション — CakePHP Cookbook 3.x ドキュメント

デフォルトの PaginatorComponent を使って、モデルなしのデータ集合のページングを実現できる方法があれば、ぜひご教授下さい。

jasongrimes/paginator でページネーション実装

代わりに GitHub で探したところ、良さ気な Paginator ライブラリを発見してこれで一発解決しました。

https://github.com/jasongrimes/php-paginator

Twitter Bootstrap にも対応してて綺麗に表示されます。README 通りに進めればOKです。

まずは、Composer でインストール。

CakePHP アプリケーションのコントローラーにページング実装。

src/Controller/ItemsController.php

README を参考に書いてますけど、実際には $totalItems, $currentPage などの値はデータ集合やパラメータなどから動的に取得します。

ページング用の $currentPage の値は URL パスのパラメータから取得するので、ルーティング設定が必要。以下のような感じです。

config/routes.php

最後に、ビューで $paginator を出力。

src/Template/items/index.ctp

以上で終了。CakePHP でモデルを使わないデータ集合の pagination を実装できました。

スポンサーリンク
私は Ruby on Rails の前は、PHP & CakePHP を使っていました(今も使いますけど)。PHP についてはオライリーの本を中心に軽く10冊以上は読み込みました。
 
スポンサーリンク

Leave Your Message!