From: Dobrica Pavlinusic Date: Wed, 22 Apr 2009 10:14:56 +0000 (+0000) Subject: r1784@llin: dpavlin | 2009-04-22 12:14:51 +0200 X-Git-Url: http://git.rot13.org/?p=webpac2;a=commitdiff_plain;h=f85c81e14185233d0ea5f32ac731ad95562c9421 r1784@llin: dpavlin | 2009-04-22 12:14:51 +0200 implement pager using Data::Page git-svn-id: svn+ssh://mjesec/home/dpavlin/svn/webpac2/trunk@1138 07558da8-63fa-0310-ba24-9fe276d99e06 --- diff --git a/vhost/webpac2.cgi b/vhost/webpac2.cgi index c8e6d3e..7b18776 100755 --- a/vhost/webpac2.cgi +++ b/vhost/webpac2.cgi @@ -8,6 +8,11 @@ use CGI::Carp qw/fatalsToBrowser/; use File::Slurp; use YAML; use Search::Estraier; +use Data::Page; +use Data::Dump qw/dump/; + +my $range_around = 5; +my $entries_per_page = 30; print header; @@ -16,6 +21,38 @@ sub dump_yaml { print qq|
# $name\n|, YAML::Dump( @_ ), qq|
|; } +sub show_pages { + my ($pager,$coderef) = @_; + + my @show_pages; + my $after_current = 0; + + if ( $pager->current_page <= $range_around + 2 ) { + @show_pages = ( $pager->first_page .. $pager->current_page ); + $after_current = $range_around - $pager->current_page; + } else { + @show_pages = ( $pager->first_page, '', $pager->current_page - $range_around .. $pager->current_page ); + } + + if ( $pager->current_page + $range_around + 1 >= $pager->last_page ) { + push @show_pages, ( $pager->current_page + 1 .. $pager->last_page ); + } else { + push @show_pages, ( $pager->current_page + 1 .. $pager->current_page + $after_current + $range_around, '', $pager->last_page ); + } + + warn "## show_pages = ",dump( @show_pages ); + + return join( ' ', map { + if ( $_ == $pager->current_page ) { + qq|$_|; + } elsif ( $_ eq '' ) { + qq|...|; + } else { + $coderef->( $_ ); + } + } @show_pages ); +} + my $path = $ENV{PATH_INFO} || 'ecas'; my $dir = $0; $dir =~ s{/[^/]+.cgi}{}; @@ -54,7 +91,9 @@ print # -linebreak => 0, ), textfield( -name => 'search' ), - submit + submit, + textfield( -name => 'entries_per_page', -default => $entries_per_page ), + textfield( -name => 'current_page', -default => 1 ), ; print end_form; @@ -68,18 +107,39 @@ if ( my $search = param('search') ) { croak_on_error => 1, ); + param( 'entries_per_page', $entries_per_page ) unless param('entries_per_page'); # FIXME not needed? + my $cond = Search::Estraier::Condition->new; $cond->set_phrase( $search ); + $cond->set_skip( param('current_page') ); + $cond->set_max( param('entries_per_page') ); my $nres = $node->search( $cond, 0 ); + my $pager = Data::Page->new( $nres->hits, param('entries_per_page'), param('current_page') ); + if ( ! $nres ) { my $no_results = "No results for search '%s'"; printf qq|
$no_results
|, $search; } else { + my $results = "Got %d results for search '%s'"; printf qq|
$results
|, $nres->hits, $search; - print qq|
    |; + print + qq|
    |, + show_pages( $pager, + sub { + my ($page) = @_; + param( 'current_page', $page ); + my $url = self_url( -query => 1 ); + qq|$_|; + } + ), + qq|
    | + ; + + my $start = $pager->first; + print qq|
      |; foreach my $i ( 1 .. $nres->doc_num ) { my $rdoc = $nres->get_doc( $i - 1 ); @@ -101,6 +161,9 @@ if ( my $search = param('search') ) { print qq|
    |; } print qq||; + + dump_yaml( 'pager', $pager ); + } dump_yaml( 'estraier', $estraier );