X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FHelper%2FGetModels.pm;h=8e2ede133af541cfd8dd433c38fcd6511c51667d;hb=0b9a3ff04bb468d94dd33e87ee499138630f639e;hp=00ef31017d8db686066db7b9689f0bdc2b89d2da;hpb=36b5dead243946c4447e9a854ebd67e613853f88;p=kivitendo-erp.git diff --git a/SL/Controller/Helper/GetModels.pm b/SL/Controller/Helper/GetModels.pm index 00ef31017..8e2ede133 100644 --- a/SL/Controller/Helper/GetModels.pm +++ b/SL/Controller/Helper/GetModels.pm @@ -3,11 +3,11 @@ 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'; -my %registered_handlers = ( callback => [], get_models => [] ); +my $registered_handlers = {}; sub register_get_models_handlers { my ($class, %additional_handlers) = @_; @@ -18,7 +18,24 @@ sub register_get_models_handlers { $class->run_before(sub { $_[0]->{PRIV()} = { current_action => $_[1] }; }, %hook_params); - map { push @{ $registered_handlers{$_} }, $additional_handlers{$_} if $additional_handlers{$_} } keys %registered_handlers; + my $handlers = _registered_handlers($class); + map { push @{ $handlers->{$_} }, $additional_handlers{$_} if $additional_handlers{$_} } keys %$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($class)->{callback} }, $callback; } sub get_callback { @@ -32,9 +49,8 @@ sub get_callback { sub get_models { my ($self, %override_params) = @_; - my %default_params = _run_handlers($self, 'get_models'); + my %params = _run_handlers($self, 'get_models', %override_params); - my %params = (%default_params, %override_params); my $model = delete($params{model}) || die "No 'model' to work on"; return "SL::DB::Manager::${model}"->get_all(%params); @@ -47,7 +63,7 @@ sub get_models { sub _run_handlers { my ($self, $handler_type, %params) = @_; - foreach my $sub (@{ $registered_handlers{$handler_type} }) { + foreach my $sub (@{ _registered_handlers(ref $self)->{$handler_type} }) { if (ref $sub eq 'CODE') { %params = $sub->($self, %params); } elsif ($self->can($sub)) { @@ -60,6 +76,10 @@ sub _run_handlers { return %params; } +sub _registered_handlers { + $registered_handlers->{$_[0]} //= { callback => [], get_models => [] } +} + 1; __END__ @@ -102,6 +122,19 @@ in L. =over 4 +=item C + +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 This function should only be called from other controller helpers like