Revision 5e45f456
Von Moritz Bunkus vor mehr als 12 Jahren hinzugefügt
SL/Controller/Helper/Paginated.pm | ||
---|---|---|
use strict;
|
||
|
||
use Exporter qw(import);
|
||
our @EXPORT = qw(make_paginated get_paginate_spec get_current_paginate_params _save_current_paginate_params _get_models_handler_for_paginated _callback_handler_for_paginated);
|
||
our @EXPORT = qw(make_paginated get_paginate_spec get_current_paginate_params _save_current_paginate_params _get_models_handler_for_paginated _callback_handler_for_paginated disable_pagination);
|
||
|
||
use constant PRIV => '__paginatedhelper_priv';
|
||
|
||
... | ... | |
$specs{FORM_PARAMS} ||= [ qw(page per_page) ];
|
||
$specs{ONLY} ||= [];
|
||
$specs{ONLY} = [ $specs{ONLY} ] if !ref $specs{ONLY};
|
||
$specs{ONLY_MAP} = @{ $specs{ONLY} } ? { map { ($_ => 1) } @{ $specs{ONLY} } } : { '__ALL__' => 1 };
|
||
|
||
$controller_paginate_spec = \%specs;
|
||
|
||
... | ... | |
|
||
my $spec = $self->get_paginate_spec;
|
||
|
||
my $priv = $self->{PRIV()} || {};
|
||
my $priv = _priv($self);
|
||
$params{page} = $priv->{page} unless defined $params{page};
|
||
$params{per_page} = $priv->{per_page} unless defined $params{per_page};
|
||
|
||
... | ... | |
per_page => ($params{per_page} * 1) || $spec->{PER_PAGE},
|
||
);
|
||
|
||
my $paginate_args = ref($spec->{PAGINATE_ARGS}) eq 'CODE' ? $spec->{PAGINATE_ARGS}->($self)
|
||
: $spec->{PAGINATE_ARGS} ? do { my $sub = $spec->{PAGINATE_ARGS}; $self->$sub() }
|
||
: {};
|
||
my $calculated_params = "SL::DB::Manager::$spec->{MODEL}"->paginate(%paginate_params, args => $paginate_args);
|
||
my %paginate_args = ref($spec->{PAGINATE_ARGS}) eq 'CODE' ? %{ $spec->{PAGINATE_ARGS}->($self) }
|
||
: $spec->{PAGINATE_ARGS} ? do { my $sub = $spec->{PAGINATE_ARGS}; %{ $self->$sub() } }
|
||
: ();
|
||
my $calculated_params = "SL::DB::Manager::$spec->{MODEL}"->paginate(%paginate_params, args => \%paginate_args);
|
||
%paginate_params = (
|
||
%paginate_params,
|
||
num_pages => $calculated_params->{max},
|
||
... | ... | |
return %paginate_params;
|
||
}
|
||
|
||
sub disable_pagination {
|
||
my ($self) = @_;
|
||
_priv($self)->{disabled} = 1;
|
||
}
|
||
|
||
#
|
||
# private functions
|
||
#
|
||
... | ... | |
sub _save_current_paginate_params {
|
||
my ($self) = @_;
|
||
|
||
return if !_is_enabled($self);
|
||
|
||
my $paginate_spec = $self->get_paginate_spec;
|
||
$self->{PRIV()} = {
|
||
page => $::form->{ $paginate_spec->{FORM_PARAMS}->[0] } || 1,
|
||
... | ... | |
|
||
sub _callback_handler_for_paginated {
|
||
my ($self, %params) = @_;
|
||
my $priv = $self->{PRIV()} || {};
|
||
my $priv = _priv($self);
|
||
|
||
if ($priv->{page}) {
|
||
if (_is_enabled($self) && $priv->{page}) {
|
||
my $paginate_spec = $self->get_paginate_spec;
|
||
$params{ $paginate_spec->{FORM_PARAMS}->[0] } = $priv->{page};
|
||
$params{ $paginate_spec->{FORM_PARAMS}->[1] } = $priv->{per_page} if $priv->{per_page};
|
||
... | ... | |
|
||
sub _get_models_handler_for_paginated {
|
||
my ($self, %params) = @_;
|
||
$params{model} ||= $self->get_paginate_spec->{MODEL};
|
||
my $spec = $self->get_paginate_spec;
|
||
$params{model} ||= $spec->{MODEL};
|
||
|
||
"SL::DB::Manager::$params{model}"->paginate($self->get_current_paginate_params, args => \%params);
|
||
"SL::DB::Manager::$params{model}"->paginate($self->get_current_paginate_params, args => \%params) if _is_enabled($self);
|
||
|
||
# $::lxdebug->dump(0, "GM handler for paginated; params nach modif:", \%params);
|
||
# $::lxdebug->dump(0, "GM handler for paginated; params nach modif (is_enabled? " . _is_enabled($self) . ")", \%params);
|
||
|
||
return %params;
|
||
}
|
||
|
||
sub _priv {
|
||
my ($self) = @_;
|
||
$self->{PRIV()} ||= {};
|
||
return $self->{PRIV()};
|
||
}
|
||
|
||
sub _is_enabled {
|
||
my ($self) = @_;
|
||
return !_priv($self)->{disabled} && ($self->get_paginate_spec->{ONLY_MAP}->{$self->action_name} || $self->get_paginate_spec->{ONLY_MAP}->{'__ALL__'});
|
||
}
|
||
|
||
1;
|
||
__END__
|
||
|
||
... | ... | |
to L<make_paginated> after normalization (hash reference construction,
|
||
applying default parameters etc).
|
||
|
||
=item C<disable_pagination>
|
||
|
||
Disable pagination for the duration of the current action. Can be used
|
||
when using the attribute C<ONLY> to L<make_paginated> does not
|
||
cover all cases.
|
||
|
||
=back
|
||
|
||
=head1 BUGS
|
Auch abrufbar als: Unified diff
Paginate-Controller-Helper: Paginaten innerhalb einer Action abstellen können