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) ],
12 'scalar --get_set_init' => [ qw(form_params launder_to) ],
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 = $params{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 # $::lxdebug->dump(0, "get_current_filter_params: ", \%calculated_params);
65 $self->filter_params(\%calculated_params);
67 return %calculated_params;
71 my ($self, %params) = @_;
74 %filter_params = $self->read_params(%params) if $self->is_enabled;
76 # $::lxdebug->dump(0, "GM handler for filtered; params nach modif (is_enabled? " . $self->is_enabled . ")", \%params);
78 return $self->merge_args(\%params, \%filter_params);
85 sub _get_filter_args {
86 my ($self, $spec) = @_;
88 my %filter_args = ref($self->filter_args) eq 'CODE' ? %{ $self->filter_args->($self) }
89 : $self->filter_args ? do { my $sub = $self->filter_args; %{ $self->get_models->controller->$sub() } }
93 sub _callback_handler_for_filtered {
94 my ($self, %params) = @_;
96 if ($self->is_enabled) {
97 my ($flattened) = SL::Controller::Helper::ParseFilter::flatten($self->orig_filter, $self->form_params);
98 %params = (%params, @{ $flattened || [] });
101 # $::lxdebug->dump(0, "CB handler for filtered; params after flatten:", \%params);
106 sub init_form_params {
110 sub init_launder_to {
125 SL::Controller::Helper::GetModels::Filtered - Filter handling plugin for GetModels
131 SL::Controller::Helper::GetModels->new(
135 launder_to => HASHREF | SUBNAME | '__INPLACE__',
146 This C<GetModels> plugin enables use of the
147 L<SL::Controller::Helper::ParseFilter> methods. Additional filters can be
148 defined in the database models and filtering can be reduced to a minimum of
151 The underlying functionality that enables the use of more than just
152 the paginate helper is provided by the controller helper
153 C<GetModels>. See the documentation for L<SL::Controller::Helper::GetModels> for
154 more information on it.
162 Optional. Indicates a key in C<source> to be used as filter.
164 Defaults to the value C<filter> if missing.
166 =item * C<launder_to>
168 Optional. Indicates a target for laundered filter arguments in the controller.
169 Can be set to C<undef> to disable laundering, and can be set to method named or
170 hash keys of the controller. In the latter case the laundered structure will be
173 Defaults to the controller. Laundered values will end up in C<SELF.filter> for
176 Setting this to the special value C<__INPLACE__> will cause inplace laundering.
182 See L<SL::Controller::Helper::ParseFilter> for a description of the filter format.
184 =head1 CUSTOM FILTERS
186 C<Filtered> will honor custom filters defined in RDBO managers. See
187 L<SL::DB::Helper::Filtered> for an explanation fo those.
193 =item * There is currently no easy way to filter for CVars.
199 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>