« FormValidatorとDBIx::Class::WebFormの組み合わせはいい。 | メイン | CatalystでTypeKey認証 »

Data::Page::Navigation いい感じのページナビゲーション

Data::Pageとページナビゲーションのコードを微妙にリファクタリング。
Time::Piece::MySQLのようにプラグイン的な使い方ができたらいいかなぁに対応。

Data::Page::Navigationと名前をつけてみたけどどうだろう。

使い方は

use Data::Page::Navigation;
my $total_entries=30;
my $entries_per_page = 5;
my $pages_per_navigation = 5;

Data::Page->pages_per_navigation($pages_per_navigation);

my $pager = Data::Page->new(
    $total_entries,
    $entries_per_page,
    $current_page
);
my @list = $pager->pages_in_navigation($pages_per_navigation);


Data::Page::Navigationをロードしておけば、Data::Pageに、pages_per_navigationとpages_in_navigationが追加されるようになってます。

↓ソース

package Data::Page::Navigation;

use strict;
use warnings;
our $VERSION='0.01';
use Data::Page;

package Data::Page;

use base qw(Class::Data::Inheritable);

__PACKAGE__->mk_classdata('pages_per_navigation'=>10);

sub pages_in_navigation(){
    my $self = shift;
    
    my $pages_per_navigation = shift || $self->pages_per_navigation || 0;
    return ($self->first_page..$self->last_page) if $pages_per_navigation >= $self->last_page;
    
    my $prev = $self->current_page - 1;
    my $next = $self->current_page + 1;
    my @ret = ($self->current_page);
    my $i=0;
    while(@ret < $pages_per_navigation){
        if($i%2){
            unshift(@ret,$prev) if $self->first_page <= $prev;
            --$prev;
        }else{
            push(@ret,$next) if $self->last_page >= $next;
            $next++;
        }
        $i++;
    }
    return @ret;
}


1;


追記:
Data-Page-Navigation-0.01.tar.gz
を置いておきます。上のソースとは若干異なり、pages_per_navigationがObject Methodになってます。PODの英語に自信がなくてなくてなくて。。

コメント

クラスデータではなくてインスタンス変数にしたほうが便利というかつぶしがきくような気がしますが。

初期設定値があると便利かなと思うのでクラスデータにしてみているのですが、つぶしがきくのは確かにインスタンス変数ですね。

TTと組み合わせたときに
[% FOREACH page= c.items.pager.pages_in_navigation(10) %]
と「10」を付けることはあまり面倒ではないとも思ったり

コメントを投稿