GetModels-Controller-Helper: Weitere URL-Parameter für Callbacks übergeben können
authorMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 4 Sep 2012 13:26:51 +0000 (15:26 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 5 Sep 2012 07:01:27 +0000 (09:01 +0200)
SL/Controller/Helper/GetModels.pm

index 00ef310..e353657 100644 (file)
@@ -3,7 +3,7 @@ package SL::Controller::Helper::GetModels;
 use strict;
 
 use Exporter qw(import);
-our @EXPORT = qw(get_callback get_models);
+our @EXPORT = qw(get_models_url_params get_callback get_models);
 
 use constant PRIV => '__getmodelshelperpriv';
 
@@ -21,6 +21,22 @@ sub register_get_models_handlers {
   map { push @{ $registered_handlers{$_} }, $additional_handlers{$_} if $additional_handlers{$_} } keys %registered_handlers;
 }
 
+sub get_models_url_params {
+  my ($class, $sub_name_or_code) = @_;
+
+  my $code     = (ref($sub_name_or_code) || '') eq 'CODE' ? $sub_name_or_code : sub { shift->$sub_name_or_code(@_) };
+  my $callback = sub {
+    my ($self, %params)   = @_;
+    my @additional_params = $code->($self);
+    return (
+      %params,
+      (scalar(@additional_params) == 1) && (ref($additional_params[0]) eq 'HASH') ? %{ $additional_params[0] } : @additional_params,
+    );
+  };
+
+  push @{ $registered_handlers{callback} }, $callback;
+}
+
 sub get_callback {
   my ($self, %override_params) = @_;
 
@@ -102,6 +118,19 @@ in L<get_callback>.
 
 =over 4
 
+=item C<get_models_url_params $class, $sub>
+
+Register one of the controller's subs to be called whenever an URL has
+to be generated (e.g. for sort and pagination links). This is a way
+for the controller to add additional parameters to the URL (e.g. for
+filter parameters).
+
+The C<$sub> parameter can be either a code reference or the name of
+one of the controller's functions.
+
+The value returned by this C<$sub> must be either a single hash
+reference or a hash of key/value pairs to add to the URL.
+
 =item C<register_get_models_handlers $class, %handlers>
 
 This function should only be called from other controller helpers like