このエントリーをはてなブックマークに追加

2016年11月9日水曜日

Paginatorについて再確認(Ruby on Rails、FuelPHP)

こんにちは、Taroです。
寒くなってきた今日この頃、室内外の寒暖差でとても眠くなります。
Ruby on RailsのkaminariというGem(ライブラリ)に触れる機会を得ました。
何を今更、有名なGemじゃないか、と言わないでください。
確かに非常にページングが簡潔にできました。
普段PHPで頑張って書いている私からしたら感動です。
私はPHPのフレームワークとしてはFuelPHP、CakePHPに触れたことがあるのですが、どちらでもページングのクラスやライブラリを使っていなかった(勉強していなかった)と思い、この機に再確認しようと思った次第です。
なお、今回は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です。
id name price description created_at updated_at
ID 商品名 値段 説明 作成日 更新日

Ruby on Rails(kaminari)

# 2ページ目を取得(デフォルトは1ページ25件です。)
@items = Item.page(2);
pageメソッドで取得できるのはいいですね!
とはいえ、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クラスがあります。
このクラスのインスタンスを使用することで、ページャーを設定することができます。
以下、ドキュメントを参考にしました。
// 基本値の設定
$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 件のコメント:

コメントを投稿