こんにちは、Taroです。
寒くなってきた今日この頃、室内外の寒暖差でとても眠くなります。
寒くなってきた今日この頃、室内外の寒暖差でとても眠くなります。
Ruby on RailsのkaminariというGem(ライブラリ)に触れる機会を得ました。
何を今更、有名なGemじゃないか、と言わないでください。
確かに非常にページングが簡潔にできました。
普段PHPで頑張って書いている私からしたら感動です。
何を今更、有名なGemじゃないか、と言わないでください。
確かに非常にページングが簡潔にできました。
普段PHPで頑張って書いている私からしたら感動です。
私はPHPのフレームワークとしてはFuelPHP、CakePHPに触れたことがあるのですが、どちらでもページングのクラスやライブラリを使っていなかった(勉強していなかった)と思い、この機に再確認しようと思った次第です。
なお、今回はRuby on RailsとFuelPHPを取り上げさせてください。
(普段はもう少し古いバージョンを使用していますが、とりあえず現在の最新ドキュメントを参考にしております。)
なお、今回はRuby on RailsとFuelPHPを取り上げさせてください。
(普段はもう少し古いバージョンを使用していますが、とりあえず現在の最新ドキュメントを参考にしております。)
フレームワーク名 | バージョン | ページングライブラリ | ドキュメント |
---|---|---|---|
Ruby on Rails | 5.0 | kaminari | https://github.com/amatsuda/kaminari |
FuelPHP | 1.7 | Paginationクラス | http://fuelphp.jp/docs/1.7/classes/pagination.html |
サンプル
説明しやすいよう下記のようなテーブルを使用します。
商品名、値段、説明を管理しているitemsです。
商品名、値段、説明を管理しているitemsです。
id | name | price | description | created_at | updated_at |
---|---|---|---|---|---|
ID | 商品名 | 値段 | 説明 | 作成日 | 更新日 |
Ruby on Rails(kaminari)
# 2ページ目を取得(デフォルトは1ページ25件です。)
@items = Item.page(2);
pageメソッドで取得できるのはいいですね!
とはいえ、1ページあたりの表示件数を10件にしたい、などサービスごとに要望があるかと思います。
各コントローラーで制御もできるようですが、基本値はコンフィグにまとめるのが良いかな、と思います。
ビューにページング番号を出す際には、下記でOKです。
これでいちいちページング番号をループさせて表示させるような面倒とはおさらばです。
とはいえ、1ページあたりの表示件数を10件にしたい、などサービスごとに要望があるかと思います。
各コントローラーで制御もできるようですが、基本値はコンフィグにまとめるのが良いかな、と思います。
rails g kaminari:config
これでkaminari用のコンフィグファイルが生成されます。Kaminari.configure do |config|
# config.default_per_page = 25 ページあたりの表示件数(デフォルトは25)
# config.max_per_page = nil ページあたりの表示件数の最大(デフォルトはnil=>無限)
# config.window = 4 表示中のページの左右何ページ分のリンクを表示するかを指定(デフォルトは4)
# config.outer_window = 0 先頭ページ、及び最終ページから何ページ分のリンクを表示するかを指定(デフォルトは0)
# config.left = 0 先頭ページから何ページ分のリンクを表示するかを指定(デフォルトは0)
# config.right = 0 最終ページから何ページ分のリンクを表示するかを指定(デフォルトは0)
# config.page_method_name = :page モデルに追加されるページ番号を指定するスコープの名前(デフォルトはpage)
# config.param_name = :page ページ番号を渡すために使用するリクエストパラメータの名前(デフォルトはpage)
end
なお、それぞれの値は各コントローラーで再度記載することで上書きすることも可能です。ビューにページング番号を出す際には、下記でOKです。
これでいちいちページング番号をループさせて表示させるような面倒とはおさらばです。
<%= paginate(@items) %>
参考資料:TECHSCORE BLOG
FuelPHP
FuelPHPにはPaginationクラスがあります。
このクラスのインスタンスを使用することで、ページャーを設定することができます。
以下、ドキュメントを参考にしました。
なお、バージョン1.7では過去のページネーションの設定だとうまくいかないようなので、1.7以前を使用する際には気をつけてください。
セグメントからページ番号を取得するため、パラメータをわざわざ受け取る必要はありません。
ただ、基本設定をいちいちコントローラーに書くのも面倒なので、コンフィグファイルにまとめてしまって、適宜呼び出すのが良いかと思います。
このクラスのインスタンスを使用することで、ページャーを設定することができます。
以下、ドキュメントを参考にしました。
// 基本値の設定
$config = array(
// ページネーションの対象URLを設定できます。(特に指定がなければnullにしておくのが良いかと思います。)
'pagination_url' => null,
// URLのどのセグメントがページ番号か?(ItemsControllerのinsexメソッドであれば、items/index/3と3つ目のセグメントになります。)
'uri_segment' => 3,
// 表示するリンクの総数
// 'num_links' => 5
// 対象の総数。基本はcount()した結果になります。
// 'total_items' => 10,
// 1ページあたりの表示件数
'per_page' => 5,
// trueかつ最初のページではない場合に '最初のページヘ' のリンクが生成されます。
'show_first' => true,
// trueかつ最後のページではない場合に '最後のページヘ' のリンクが生成されます。
'show_last' => true,
);
// 'mypagination' という名前のpaginationインスタンスを作る
$pagination = Pagination::forge('mypagination', $config);
// クエリ発行
$data['example_data'] = DB::select('id', 'name', 'price', 'description')
->from('pagination')
->limit($pagination->per_page)
->offset($pagination->offset)
->execute()
->as_array();
// オブジェクトをビューに渡す
$data['pagination'] = $pagination;
// ビューを返す
return \View::forge('welcome/index', $data);
設定値にてインスタンスを作成することで、その後のクエリビルダーにて使用することができます。なお、バージョン1.7では過去のページネーションの設定だとうまくいかないようなので、1.7以前を使用する際には気をつけてください。
セグメントからページ番号を取得するため、パラメータをわざわざ受け取る必要はありません。
ただ、基本設定をいちいちコントローラーに書くのも面倒なので、コンフィグファイルにまとめてしまって、適宜呼び出すのが良いかと思います。
Config::load('pagination');
ビュー側でページ番号を出すのは楽です。
render(); ?>
0 件のコメント:
コメントを投稿