1 package SL::Controller::Helper::GetModels::Filtered;
4 use parent 'SL::Controller::Helper::GetModels::Base';
6 use Exporter qw(import);
7 use SL::Controller::Helper::ParseFilter ();
8 use List::MoreUtils qw(uniq);
10 use Rose::Object::MakeMethods::Generic (
11 scalar => [ qw(filter_args filter_params orig_filter filter no_launder) ],
12 'scalar --get_set_init' => [ qw(form_params laundered) ],
16 my ($self, %specs) = @_;
18 $self->set_get_models(delete $specs{get_models});
19 $self->SUPER::init(%specs);
21 $self->get_models->register_handlers(
22 callback => sub { shift; $self->_callback_handler_for_filtered(@_) },
25 # $::lxdebug->dump(0, "CONSPEC", \%specs);
29 my ($self, %params) = @_;
31 return %{ $self->filter_params } if $self->filter_params;
32 my $source = $self->get_models->source;
34 my $filter = $self->filter // $source->{ $self->form_params } // {};
35 $self->orig_filter($filter);
37 my %filter_args = $self->_get_filter_args;
38 my %parse_filter_args = (
39 class => $self->get_models->manager,
40 with_objects => $params{with_objects},
43 # Store laundered result in $self->laundered.
45 if (!$self->no_launder) {
47 $parse_filter_args{launder_to} = $self->laundered;
49 $self->laundered(undef);
50 $parse_filter_args{no_launder} = 1;
53 my %calculated_params = SL::Controller::Helper::ParseFilter::parse_filter($filter, %parse_filter_args);
54 %calculated_params = $self->merge_args(\%calculated_params, \%filter_args, \%params);
56 # $::lxdebug->dump(0, "get_current_filter_params: ", \%calculated_params);
58 $self->filter_params(\%calculated_params);
60 return %calculated_params;
64 my ($self, %params) = @_;
67 %filter_params = $self->read_params(%params) if $self->is_enabled;
69 # $::lxdebug->dump(0, "GM handler for filtered; params nach modif (is_enabled? " . $self->is_enabled . ")", \%params);
71 return $self->merge_args(\%params, \%filter_params);
78 sub _get_filter_args {
79 my ($self, $spec) = @_;
81 my %filter_args = ref($self->filter_args) eq 'CODE' ? %{ $self->filter_args->($self) }
82 : $self->filter_args ? do { my $sub = $self->filter_args; %{ $self->get_models->controller->$sub() } }
86 sub _callback_handler_for_filtered {
87 my ($self, %params) = @_;
89 if ($self->is_enabled) {
90 my ($flattened) = SL::Controller::Helper::ParseFilter::flatten($self->orig_filter, $self->form_params);
91 %params = (%params, @{ $flattened || [] });
94 # $::lxdebug->dump(0, "CB handler for filtered; params after flatten:", \%params);
99 sub init_form_params {
106 $self->get_models->finalize;
107 return $self->{laundered};
120 SL::Controller::Helper::GetModels::Filtered - Filter handling plugin for GetModels
126 SL::Controller::Helper::GetModels->new(
140 This C<GetModels> plugin enables use of the
141 L<SL::Controller::Helper::ParseFilter> methods. Additional filters can be
142 defined in the database models and filtering can be reduced to a minimum of
145 The underlying functionality that enables the use of more than just
146 the paginate helper is provided by the controller helper
147 C<GetModels>. See the documentation for L<SL::Controller::Helper::GetModels> for
148 more information on it.
156 Optional. Indicates a key in C<source> to be used as filter.
158 Defaults to the value C<filter> if missing.
160 =item * C<no_launder>
162 Optional. If given and trueish then laundering is disabled.
168 See L<SL::Controller::Helper::ParseFilter> for a description of the filter format.
170 =head1 CUSTOM FILTERS
172 C<Filtered> will honor custom filters defined in RDBO managers. See
173 L<SL::DB::Helper::Filtered> for an explanation of those.
181 Finalizes the object (which causes laundering of the filter structure)
182 and returns a hashref of the laundered filter. If the plugin is
183 configured not to launder then C<undef> will be returned.
191 =item * There is currently no easy way to filter for CVars.
197 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>