Paginate-Controller-Helper: Paginaten innerhalb einer Action abstellen können
authorMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 5 Sep 2012 07:00:35 +0000 (09:00 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 5 Sep 2012 07:01:27 +0000 (09:01 +0200)
SL/Controller/Helper/Paginated.pm

index 5792f63..d3da20d 100644 (file)
@@ -3,7 +3,7 @@ package SL::Controller::Helper::Paginated;
 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';
 
@@ -18,6 +18,7 @@ sub make_paginated {
   $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;
 
@@ -45,7 +46,7 @@ sub get_current_paginate_params {
 
   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};
 
@@ -54,10 +55,10 @@ sub get_current_paginate_params {
     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},
@@ -69,6 +70,11 @@ sub get_current_paginate_params {
   return %paginate_params;
 }
 
+sub disable_pagination {
+  my ($self)               = @_;
+  _priv($self)->{disabled} = 1;
+}
+
 #
 # private functions
 #
@@ -76,6 +82,8 @@ sub get_current_paginate_params {
 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,
@@ -87,9 +95,9 @@ sub _save_current_paginate_params {
 
 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};
@@ -102,15 +110,27 @@ sub _callback_handler_for_paginated {
 
 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__
 
@@ -294,6 +314,12 @@ Returns a hash reference to the paginate spec structure given in the call
 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