Tengのpager機能使った時のメモ
Tengのsearch_with_pager関数を使えばレンダリングの結果にページャ機能をよしなに付けてくれるらしい
ドキュメントはTeng::Plugin::PagerとData::Page::NoTotalEntries見れば雰囲気つかめると思う
Controllerのコード見る
sub list :Local { my($self, $c) = @_; my $page = $c->req->param('page') || 1; # (1) my ($rows, $pager) = $teng->hoge_list(page => $page); # (2) $c->stash->{hoge_list} = $rows; $c->forward( $c->view('Xslate') ); }
コード解説
(1)
- urlの
?page=n
に渡された引数を$pageに格納(localhost:oppai/content/list?page=1みたいな感じ) - localhost:oppai/content/listみたいに?pageに引数が渡されてなかった場合には、デフォルトで1を$page入れる(「||」はデフォルトの値を設定する意味)
ResultSet側のコードを見る
sub hoge_list { my($class, %page) = @_; my ($rows, $pager) = $teng->search_with_pager({ id => {">=", 0} },{ order_by => 'published_at', page => $page{page}, #(2) rows => 10 #(3) }); return ($rows, $pager); }
コード解説
(1)
- search_with_pagerはsearch関数とは違い、新たに$pagerというオブジェクトが返えされる
- $pagerはData::Page::NoTotalEntriesクラスのインスタンスだと思われる(現在のページの中にあるlistの数を見れたりする)
- $tengのTengインスタンスは頑張って作って下さい
(2)
- 表示させたいページを指定する
(3)
- 1ページに表示させるテーブルのレコード件数を設定
補足(コンテキストの話?)
$teng->hoge_list(page => $page);
の様に引数を渡してる箇所は、hashの書き方だが、引数は全てリストで関数に値を渡している事になってる(関数側の引数リスト@_
の中に格納されるから)- 関数側で
my($class, %page) = @_;
と、%pageでhashをリストからを受け取れば、ちゃんとhashとして値を渡す事が出来るし、分かりやすい。
最初は下記のようにhashなので括弧を付けていたが、その必要は無い様だ。
$teng->hoge_list( (page => $page) );
括弧無い方が見やすいコードになる。