[Catalyst] paging with Data::Page

Anne Wainwright anotheranne at fables.co.za
Tue Jul 28 18:57:06 GMT 2009

Hi, Ian

See below,

On Mon, 27 Jul 2009 21:32:36 +0100
Ian Sillitoe <ian at sillit.com> wrote:

> >
> > Could be wrong, but I think the former is causing the resultset to
> > be evaluated as an array and is therefore returning all the entries
> > before the pager is being applied.
> >
> Apologies - I was talking rubbish about the usage of stash being the
> cause (although I do think the resultset is being reset somewhere
> along the line).
> Noting the following, I agree that the 'pager' code is probably
> correct
> > and the 'result' code seems to be the gremlin. How they interact is
> > beyond me
> $result is a DBIx::Class::ResultSet object and is being returned from
> the call to $c->model('Address::Addresses')->search(). This resultset
> object has a method called $result->page($page_number) which sets up
> the database query with the correct start and stop for the given page
> number and entries per page (default=10). It also has a
> $result->pager() method which returns a Data::Page object - this just
> provides a useful container for accessing page-related information of
> the related DB query.
> http://search.cpan.org/~ribasushi/DBIx-Class-0.08108/lib/DBIx/Class/ResultSet.pm
> If the $pager is telling you the correct information (that the query
> only has 10 entries) but this is changing by the time it is being
> rendered in your template then perhaps another call is being made to
> the database (i.e. because something else is changing
> $c->stash->result). Have you tried setting DBIC_TRACE=1 in your
> environment and looking at the logs to check that the database
> queries look sensible?
> You could also check that the resultset at least has the correct
> number of entries just before you leave your search function:
>   $c->log->info( "Current Page: " . $page );
>   $c->log->info( "Results: " . $result->count ); # NB: this will
> perform a DB query
>   $c->log->info( "Leaving 'search' method..." );

this produces 2 items of note if I put it after the search

1.	'Use of uninitialized value $page in concatenation (.) or
	string at ....'
($page is declared in the line  .... = @_)

2.	[info] Current Page: 
	[info] Results: 11
	[info] Leaving 'search' method...

but if I put it after this line
    $page = 1 ; #if($page !~ /^\d+$/);

I get

1.	'Use of uninitialized value $page in pattern match (m//)
at ... '
(a SELECT COUNT( * ) FROM occurs immediately after this )

lower down, we get the run of outputs from
SELECT me.id,

which match up fine to the records expected and delivered, ( I set
DBIC_TRACE=1). Should these not show up before the pattern match

2.	then just at the end

	[info] Current Page: 1
	[info] Results: 11
	[info] Leaving 'search' method...

so pages are assigned in the pager code, but the no of results is
carried over from the search code

These things have a way of getting more complex, so if this info does
not indicate a clear solution, then I don't want to waste valuable time,
rather I might find more in the new book, and must advance further in my
perl studies (not very far into Intermediate Perl at present). Although
I hate being beaten, TIMTOWTDI (whatever)


> I note that Bindlex used to bring up a warning when the catalyst
> > development server was started, but I do not see this now. Has
> > Bindlex perhaps been un-deprecated?
> >
> Nope -
> http://search.cpan.org/~mstrout/Catalyst-Controller-BindLex-0.05/lib/Catalyst/Controller/BindLex.pm
> Cheers,
> Ian

More information about the Catalyst mailing list