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の英語に自信がなくてなくてなくて。。
Data-Page-Navigation-0.01.tar.gz
を置いておきます。上のソースとは若干異なり、pages_per_navigationがObject Methodになってます。PODの英語に自信がなくてなくてなくて。。
コメント
クラスデータではなくてインスタンス変数にしたほうが便利というかつぶしがきくような気がしますが。
投稿者: miyagawa | 2005年11月28日 14:30
初期設定値があると便利かなと思うのでクラスデータにしてみているのですが、つぶしがきくのは確かにインスタンス変数ですね。
TTと組み合わせたときに
[% FOREACH page= c.items.pager.pages_in_navigation(10) %]
と「10」を付けることはあまり面倒ではないとも思ったり
投稿者: かぜぶろ | 2005年11月28日 16:45