JUST FOR FUN

Twitter:@okwra GitHub:@tearon4

Data::Page ~ ページングの基本モジュールを見る

はじめに

これはData::Page モジュールの紹介記事です。

http://perldoc.jp/docs/modules/Data-Page-1.01/Page.pod

実験

< Sorce >

< Output >

                 First page: 1
                  Last page: 6

              Previous page: 3
               Current page: 4
                  Next page: 5

First entry on current page: 10
 Last entry on current page: 12

       Current page entries: hoge10
       Current page entries: hoge11
       Current page entries: hoge12

(改行はよしなに入れてます)

うーん、シンプルで便利!

勉強

module本体のコードの中身もシンプルです。(VERSIONは2.02)

以下moduleを読んで気になったことのメモ。

sub new {
    my $class = shift;
    my $self  = {};
    bless( $self, $class );

    my ( $total_entries, $entries_per_page, $current_page ) = @_;
    $self->total_entries( $total_entries       || 0 );
    $self->entries_per_page( $entries_per_page || 10 );
    $self->current_page( $current_page         || 1 );
    return $self;
}

entries_per_pageはデフォルトで10エントリーなんですね!

sub first_page {
    my $self = shift;

    return 1;
}

まあそうなんだけど…これいるのかな感(;´∀`)…

# This method would probably be better named 'select' or 'slice' or
# something, because it doesn't modify the array the way
# CORE::splice() does.
sub splice {
    my ( $self, $array ) = @_;
    my $top = @$array > $self->last ? $self->last : @$array;
    return () if $top == 0;    # empty
    return @{$array}[ $self->first - 1 .. $top - 1 ];
}

ほうほう…。たしかにperlのコア機能であるspliceとはぜんぜん違う機能ですね(笑)

taiga.hatenadiary.com

sub skipped {
    my $self = shift;

    my $skipped = $self->first - 1;
    return 0 if $skipped < 0;
    return $skipped;
}

これはなんだろう?今あるページの一番最初のエントリーの1個前…?と思ったらDescriptionsのところに説明がありました。(Perldocにはなかった)

This method is useful paging through data in a database using SQL
LIMIT clauses. 
It is simply $page->first - 1:

  $sth = $dbh->prepare(
    q{SELECT * FROM table ORDER BY rec_date LIMIT ?, ?}
  );
  $sth->execute($page->skipped, $page->entries_per_page);

なるほど、LIMIT句使うときに使う想定なのね。

とはいえ上にもあるけど$page->first - 1で十分そう。

sub change_entries_per_page {
    my ( $self, $new_epp ) = @_;

    use integer;
    croak("Fewer than one entry per page!") if $new_epp < 1;
    my $new_page = 1 + ( $self->first / $new_epp );
    $self->entries_per_page($new_epp);
    $self->current_page($new_page);
}

果たしてコードの途中で変更することってあるんだろうか…(・∀・)?

(出会ったことがない)

さいごに

It has been said before that this code is "too simple" for CPAN, but I must disagree. I have seen people write this kind of code over and over again and they always get it wrong. Perhaps now they will spend more time getting the rest of their code right...

いい言葉。ゴリゴリでバリバリに便利である必要はない。
みんなの作業が少しずつ楽になればいい。