Class::DBI::Pageset - A flexible pager utility for Class::DBI using Data::Pageset
package CD; use base qw(Class::DBI); use Class::DBI::Pageset; # just use it __PACKAGE__->set_db(...); # then, in client code! package main; use CD; my $pager = CD->pager( { entries_per_page => 20, current_page => 1, pages_per_set => 10, } ); my @disks = $pager->retrieve_all;
Class::DBI::Pageset is a plugin for Class::DBI that integrates Data::Pageset into Class::DBI with minimal fuss. This enables you to search via Class::DBI and grouping results into pages and page sets.
Class::DBI::Pageset
Class::DBI
Data::Pageset
This module is very similar to Tatsuhiko Miyagawa's very nice Class::DBI::Pager module, but uses Data::Pageset (or any module that inherits from Data::Pageset, such as Data::Pageset::Render) to create the pager. Data::Pageset provides a more flexible pager, which is better suited to searches that return many pages. This is not necessarily very efficient (see NOTE below for more).
Class::DBI::Pager
Data::Pageset::Render
NOTE
# Controller: (MVC's C) my $query = CGI->new; my $template = Template->new; my $pager = Film->pager({ entries_per_page => 20, current_page => $query->param('page') || 1, pages_per_set => 5, }); my $movies = $pager->retrieve_all; $template->process($input, { movies => $movies, pager => $pager, }); # View: (MVC's V) Matched [% pager.total_entries %] items. [% WHILE (movie = movies.next) %] Title: [% movie.title | html %] [% END %] ### navigation like: ... 5 [6] 7 8 9 ... [% IF pager.previous_set %] <a href="display?page=[% pager.previous_set %]">...</a> [% END %] [% FOREACH num = [ pager.pages_in_set ] %] [% IF num == pager.current_page %] [[% num %]] [% ELSE %]<a href="display?page=[% num %]">[% num %]</a>[% END %] [% END %] [% IF pager.next_set %] <a href="display?page=[% pager.next_set %]">...</a> [% END %]
To use one of the modules that inherit from Data::Pageset (such as Data::Pageset::Render) just include the module name as part of the use statement.
use
use Class::DBI::Pageset qw(Data::Pageset::Render); ## Then in your code you can use $pager->html( '<a href="index?page=%s">%a</a>' );
my $pager = Film->pager({ entries_per_page => 20, current_page => $query->param('page') || 1, pages_per_set => 5, mode => 'slide', });
This is the constructor for the pager. See Data::Pageset for more on the parameters. The $pager object can then be used as a normal Class::DBI object for searching.
$pager
See Data::Pageset.
This modules internally retrieves itertors, then creates Data::Page object for paging utility. Using SQL clauses LIMIT and/or OFFSET with DBIx::Pager might be more memory efficient. As this module is geared to searches that return many pages of results, it maybe more prone to inefficiencies than Class::DBI::Pager.
I had originally wanted to patch Class::DBI::Pager to use different pagers, ie, Data::Page, Data::Pageset, or Data::Pageset::Render, but the constructors for Data::Page and Data::Pageset are incompatible and jamming them together didn't seem like a good fix.
Data::Page
Class::DBI, Data::Pageset
Or for alternatives: Class::DBI::Pager, DBIx::Class, DBIx::Class::ResultSet::Data::Pageset
DBIx::Class
DBIx::Class::ResultSet::Data::Pageset
Please report any bugs or suggestions at http://rt.cpan.org/NoAuth/Bugs.html?Dist=Class-DBI-Pageset
Mark Grimes <mgrimes@cpan.org>
Most of this code was shamelessly taken from the very nice Class::DBI::Pager by Tatsuhiko Miyagawa <miyagawa@bulknews.net>.
Copyright (C) 2008 by mgrimes
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.2 or, at your option, any later version of Perl 5 you may have available.
To install Class::DBI::Pageset, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Class::DBI::Pageset
CPAN shell
perl -MCPAN -e shell install Class::DBI::Pageset
For more information on module installation, please visit the detailed CPAN module installation guide.