NAME
Class::DBI::Pageset - A flexible pager utility for Class::DBI using
Data::Pageset
SYNOPSIS
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;
DESCRIPTION
"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.
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).
EXAMPLE
# 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 %]
...
[% END %]
[% FOREACH num = [ pager.pages_in_set ] %]
[% IF num == pager.current_page %] [[% num %]]
[% ELSE %][% num %][% END %]
[% END %]
[% IF pager.next_set %]
...
[% 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 Class::DBI::Pageset qw(Data::Pageset::Render);
## Then in your code you can use
$pager->html( '%a' );
METHODS
pager()
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.
total_entries()
entries_per_page()
current_page()
entries_on_this_page()
first_page()
last_page()
first()
last()
previous_page()
next_page()
pages_in_navigatio()
pages_per_set()
previous_set()
next_set()
pages_in_set()
See "Data::Pageset".
NOTE
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.
SEE ALSO
"Class::DBI", "Data::Pageset"
Or for alternatives: "Class::DBI::Pager", "DBIx::Class",
"DBIx::Class::ResultSet::Data::Pageset"
BUGS
Please report any bugs or suggestions at
AUTHOR
Mark Grimes
Most of this code was shamelessly taken from the very nice
"Class::DBI::Pager" by Tatsuhiko Miyagawa .
COPYRIGHT AND LICENSE
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.