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) ],
12 'scalar --get_set_init' => [ qw(form_params launder_to 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 if ($self->launder_to eq '__INPLACE__') {
45 } elsif ($self->launder_to) {
47 $parse_filter_args{launder_to} = $laundered;
49 $parse_filter_args{no_launder} = 1;
52 my %calculated_params = SL::Controller::Helper::ParseFilter::parse_filter($filter, %parse_filter_args);
53 %calculated_params = $self->merge_args(\%calculated_params, \%filter_args, \%params);
56 if ($self->get_models->controller->can($self->launder_to)) {
57 $self->get_models->controller->${\ $self->launder_to }($laundered);
59 $self->get_models->controller->{$self->launder_to} = $laundered;
63 # Store laundered result in $self->laundered.
64 $self->laundered($laundered // $filter) unless $parse_filter_args{no_launder};
66 # $::lxdebug->dump(0, "get_current_filter_params: ", \%calculated_params);
68 $self->filter_params(\%calculated_params);
70 return %calculated_params;
74 my ($self, %params) = @_;
77 %filter_params = $self->read_params(%params) if $self->is_enabled;
79 # $::lxdebug->dump(0, "GM handler for filtered; params nach modif (is_enabled? " . $self->is_enabled . ")", \%params);
81 return $self->merge_args(\%params, \%filter_params);
88 sub _get_filter_args {
89 my ($self, $spec) = @_;
91 my %filter_args = ref($self->filter_args) eq 'CODE' ? %{ $self->filter_args->($self) }
92 : $self->filter_args ? do { my $sub = $self->filter_args; %{ $self->get_models->controller->$sub() } }
96 sub _callback_handler_for_filtered {
97 my ($self, %params) = @_;
99 if ($self->is_enabled) {
100 my ($flattened) = SL::Controller::Helper::ParseFilter::flatten($self->orig_filter, $self->form_params);
101 %params = (%params, @{ $flattened || [] });
104 # $::lxdebug->dump(0, "CB handler for filtered; params after flatten:", \%params);
109 sub init_form_params {
113 sub init_launder_to {
120 $self->get_models->finalize;
121 return $self->{laundered};
134 SL::Controller::Helper::GetModels::Filtered - Filter handling plugin for GetModels
140 SL::Controller::Helper::GetModels->new(
144 launder_to => HASHREF | SUBNAME | '__INPLACE__',
154 This C<GetModels> plugin enables use of the
155 L<SL::Controller::Helper::ParseFilter> methods. Additional filters can be
156 defined in the database models and filtering can be reduced to a minimum of
159 The underlying functionality that enables the use of more than just
160 the paginate helper is provided by the controller helper
161 C<GetModels>. See the documentation for L<SL::Controller::Helper::GetModels> for
162 more information on it.
170 Optional. Indicates a key in C<source> to be used as filter.
172 Defaults to the value C<filter> if missing.
174 =item * C<launder_to>
176 Optional. Indicates a target for laundered filter arguments in the controller.
177 Can be set to C<undef> to disable laundering, and can be set to method named or
178 hash keys of the controller. In the latter case the laundered structure will be
181 Defaults to the controller. Laundered values will end up in C<SELF.filter> for
184 Setting this to the special value C<__INPLACE__> will cause inplace laundering.
190 See L<SL::Controller::Helper::ParseFilter> for a description of the filter format.
192 =head1 CUSTOM FILTERS
194 C<Filtered> will honor custom filters defined in RDBO managers. See
195 L<SL::DB::Helper::Filtered> for an explanation fo those.
203 Finalizes the object (which causes laundering of the filter structure)
204 and returns a hashref of the laundered filter. If the plugin is
205 configured not to launder then C<undef> will be returned.
213 =item * There is currently no easy way to filter for CVars.
219 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>