p_chinのおっぱいブログ

UnityとPerlなど

Tengのpager機能使った時のメモ

Tengのsearch_with_pager関数を使えばレンダリングの結果にページャ機能をよしなに付けてくれるらしい

ドキュメントはTeng::Plugin::PagerData::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) );

括弧無い方が見やすいコードになる。