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 if ($self->laundered) {
57 if ($self->get_models->controller->can('filter')) {
58 $self->get_models->controller->filter($self->laundered);
60 $self->get_models->controller->{filter} = $self->laundered;
64 # $::lxdebug->dump(0, "get_current_filter_params: ", \%calculated_params);
66 $self->filter_params(\%calculated_params);
68 return %calculated_params;
72 my ($self, %params) = @_;
75 %filter_params = $self->read_params(%params) if $self->is_enabled;
77 # $::lxdebug->dump(0, "GM handler for filtered; params nach modif (is_enabled? " . $self->is_enabled . ")", \%params);
79 return $self->merge_args(\%params, \%filter_params);
86 sub _get_filter_args {
87 my ($self, $spec) = @_;
89 my %filter_args = ref($self->filter_args) eq 'CODE' ? %{ $self->filter_args->($self) }
90 : $self->filter_args ? do { my $sub = $self->filter_args; %{ $self->get_models->controller->$sub() } }
94 sub _callback_handler_for_filtered {
95 my ($self, %params) = @_;
97 if ($self->is_enabled) {
98 my ($flattened) = SL::Controller::Helper::ParseFilter::flatten($self->orig_filter, $self->form_params);
99 %params = (%params, @{ $flattened || [] });
102 # $::lxdebug->dump(0, "CB handler for filtered; params after flatten:", \%params);
107 sub init_form_params {
114 $self->get_models->finalize;
115 return $self->{laundered};
128 SL::Controller::Helper::GetModels::Filtered - Filter handling plugin for GetModels
134 SL::Controller::Helper::GetModels->new(
148 This C<GetModels> plugin enables use of the
149 L<SL::Controller::Helper::ParseFilter> methods. Additional filters can be
150 defined in the database models and filtering can be reduced to a minimum of
153 The underlying functionality that enables the use of more than just
154 the paginate helper is provided by the controller helper
155 C<GetModels>. See the documentation for L<SL::Controller::Helper::GetModels> for
156 more information on it.
164 Optional. Indicates a key in C<source> to be used as filter.
166 Defaults to the value C<filter> if missing.
168 =item * C<no_launder>
170 Optional. If given and trueish then laundering is disabled.
176 See L<SL::Controller::Helper::ParseFilter> for a description of the filter format.
178 =head1 CUSTOM FILTERS
180 C<Filtered> will honor custom filters defined in RDBO managers. See
181 L<SL::DB::Helper::Filtered> for an explanation fo those.
189 Finalizes the object (which causes laundering of the filter structure)
190 and returns a hashref of the laundered filter. If the plugin is
191 configured not to launder then C<undef> will be returned.
199 =item * There is currently no easy way to filter for CVars.
205 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>