[Catalyst] Re: OT: Better TT pager?
Oliver Charles
oliver.g.charles at googlemail.com
Thu Jan 22 15:48:58 GMT 2009
I might as well join in with this :) Here's what we use at work:
[% IF pager %]
<ul class="paginator">
<li class="counter">Page [% pager.current_page %] of [%
pager.last_page %]</li>
<li><a href="[% c.req.uri_with( page => pager.first_page )
%]">«</a></li>
[% IF pager.previous_page %]
<li><a href="[% c.req.uri_with( page =>
pager.previous_page ) %]"><</a></li>
[% END %]
[% start = (pager.current_page - 3) > 0 ? (pager.current_page - 3) : 1;
FOREACH page IN [ start .. pager.last_page ] %]
[% LAST IF loop.count > 6 %]
<li[% IF pager.current_page == page; ' class="current"'; END %]>
<a href="[% c.req.uri_with( page => page ) %]">[% page %]</a>
</li>
[% END %]
[% IF pager.next_page %]
<li><a href="[% c.req.uri_with( page => pager.next_page )
%]">></a></li>
[% END %]
<li><a href="[% c.req.uri_with( page => pager.last_page )
%]">»</a></li>
</ul>
[% END %]
Though my colleague rightly suggested we subclass Data::Page and
perform the sliding window in there. This shows first page, previous
page, the current page surrounded by near-by pages. Seems to do the
job so far!
On Thu, Jan 22, 2009 at 12:54 PM, David Schmidt <davewood at gmx.at> wrote:
> On Thu, Dec 25, 2008 at 12:18 AM, Aristotle Pagaltzis <pagaltzis at gmx.de> wrote:
>> * Jesse Sheidlower <jester at panix.com> [2008-12-23 12:45]:
>>> Does someone have a model I can steal from?
>>
>> I have something pretty close to that. Not entirely happy insofar
>> as that I want to add the ability show a few links to skip 10 and
>> 20 pages as appropriate, and it's not abstracted as it should be,
>> but as a starting point it should work.
>>
>> USE decimal = format('%d') ;
>> BLOCK pagination ;
>> IF NOT page ; page = 0 ; END ;
>> last_page = decimal( ( num_trials - 1 ) / per_page );
>>
>> IF last_page ;
>> %]<div class="pagination">[%
>> %]<a href="[% c.req.uri_with( page = [] ) %]"[% ' class="current"' IF NOT page %]>1</a>[%
>>
>> linked_page = page - 4 ;
>> IF linked_page < 1 ; linked_page = 1 ; END ;
>>
>> until_page = linked_page + 7 ;
>> IF last_page <= until_page ;
>> until_page = last_page - 1 ;
>> linked_page = until_page - 7 ;
>> IF linked_page < 1 ; linked_page = 1 ; END ;
>> END ;
>>
>> '<i>…</i>' IF 1 < linked_page ;
>>
>> WHILE ( linked_page <= until_page ) AND ( linked_page < last_page ) ;
>> %]<a href="[% c.req.uri_with( page = linked_page ) %]"[% ' class="current"' IF page == linked_page %]>[% linked_page + 1 %]</a>[%
>> linked_page = linked_page + 1 ;
>> END ;
>>
>> '<i>…</i>' IF linked_page < last_page ;
>> %]<a href="[% c.req.uri_with( page = last_page ) %]"[% ' class="current"' IF page == last_page %]>[% last_page + 1 %]</a>[%
>>
>> %]</div>[%
>> END ;
>> END ;
>>
>> This is also a perfect demonstration of why I say that TT sucks.
>> This should by all rights be handled in the template since it's
>> display logic, but writing it in that TT mini-language rather
>> than Perl is fugly. And PERL and RAWPERL blocks have their own
>> problems. Anyway. Someday I'll quit yapping and write some code.
>>
>> The CSS for styling that looks like this:
>>
>> div.pagination {
>> margin: 1.1em 0 0.5em;
>> text-align: right;
>> padding: 0.2em 0;
>> }
>>
>> div.pagination i {
>> font-style: normal;
>> }
>>
>> div.pagination a:link,
>> div.pagination a:visited {
>> border: 1px solid #359;
>> background-color: #f0f0e6;
>> padding: 0.1em 0.3em;
>> margin: 0 0.2em;
>> }
>>
>> div.pagination a.current,
>> div.pagination a:focus,
>> div.pagination a:hover,
>> div.pagination a:active {
>> background-color: #47b;
>> color: #fff;
>> }
>>
>> I'm not sure how selfcontained that is, but I can't be bothered
>> to dig through the rest of my stylesheets right now.
>>
>> Regards,
>> --
>> Aristotle Pagaltzis // <http://plasmasturm.org/>
>>
>> _______________________________________________
>> List: Catalyst at lists.scsys.co.uk
>> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
>> Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
>> Dev site: http://dev.catalyst.perl.org/
>>
>
> I adapted one of the proposals and felt I should share it with you.
>
> in my Controller:
> sub index :Path :Args(0) {
> my ( $self, $c ) = @_;
> my $page = $c->req->param('page') || 1;
> my $rows = $c->req->param('rows') || 3;
> my $where = { };
> my $attr = { page => $page, rows => $rows, order_by => "created desc" };
> my $rs = $c->model('DB::Pictures')->search( $where, $attr );
> my $pager = $rs->pager();
> $c->stash->{pager} = $pager;
> $c->stash->{pictures} = [$rs->all];
> $c->stash->{template} = 'pictures/list.tt2';
> }
>
>
> in my template.tt2:
> </div>
> [% IF pager.current_page() != pager.first_page() -%]
> <a href="[% c.request.uri_with( page => pager.first_page() )
> -%]"><<</a>
> [% END -%]
>
> [% IF pager.previous_page -%]
> <a href="[% c.request.uri_with( page => pager.previous_page() )
> -%]"> <</a>
> [% END -%]
>
> [% IF pager.next_page -%]
> <a href="[% c.request.uri_with( page => pager.next_page() ) -%]"> ></a>
> [% END -%]
>
> [% IF pager.current_page != pager.last_page() -%]
> <a href="[% c.request.uri_with( page => pager.last_page() )-%]">
> >></a>
> [% END -%]
> </div>
> <div>
> [% IF pager.total_entries() > 0 -%]
> [% pager.total_entries() -%] pictures found |
> Showing page <b>[% pager.current_page() -%]</b> of [% pager.last_page() -%]
> [% END -%]
> </div>
>
> Works fine so far.
>
> david
>
> --
> David Schmidt | http://www.fm5.at
>
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/
>
More information about the Catalyst
mailing list