1 package SL::Controller::Helper::ReportGenerator;
6 use List::Util qw(max);
11 use SL::ReportGenerator;
13 use Exporter 'import';
15 action_report_generator_export_as_pdf action_report_generator_export_as_csv
16 action_report_generator_back report_generator_do
17 report_generator_list_objects
20 sub action_report_generator_export_as_pdf {
22 if ($::form->{report_generator_pdf_options_set}) {
23 my $saved_form = save_form();
25 $self->report_generator_do('PDF');
27 if ($::form->{report_generator_printed}) {
28 restore_form($saved_form);
29 $::form->{MESSAGE} = $::locale->text('The list has been printed.');
30 $self->report_generator_do('HTML');
36 my @form_values = $::form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $::form });
38 $::form->get_lists('printers' => 'ALL_PRINTERS');
39 map { $_->{selected} = $::myconfig{default_printer_id} == $_->{id} } @{ $::form->{ALL_PRINTERS} };
41 $::form->{copies} = max $::myconfig{copies} * 1, 1;
42 $::form->{title} = $::locale->text('PDF export -- options');
44 print $::form->parse_html_template('report_generator/pdf_export_options', {
45 'HIDDEN' => \@form_values,
46 'ALLOW_FONT_SELECTION' => SL::ReportGenerator->check_for_pdf_api, });
49 sub action_report_generator_export_as_csv {
51 if ($::form->{report_generator_csv_options_set}) {
52 $self->report_generator_do('CSV');
56 my @form_values = $::form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $::form });
58 $::form->{title} = $::locale->text('CSV export -- options');
60 print $::form->parse_html_template('report_generator/csv_export_options', { 'HIDDEN' => \@form_values });
63 sub action_report_generator_back {
64 $_[0]->report_generator_do('HTML');
67 sub report_generator_do {
68 my ($self, $format) = @_;
70 my $nextsub = $::form->{report_generator_nextsub};
72 $::form->error($::locale->text('report_generator_nextsub is not defined.'));
75 foreach my $key (split m/ +/, $::form->{report_generator_variable_list}) {
76 $::form->{$key} = $::form->{"report_generator_hidden_${key}"};
79 $::form->{report_generator_output_format} = $format;
81 delete @{$::form}{map { "report_generator_$_" } qw(nextsub variable_list)};
83 $self->_run_action($nextsub);
86 sub report_generator_list_objects {
87 my ($self, %params) = @_;
89 croak "Parameter 'objects' must exist and be an array reference" if ref($params{objects}) ne 'ARRAY';
90 croak "Parameter 'report' must exist and be an instance of SL::ReportGenerator" if ref($params{report}) ne 'SL::ReportGenerator';
91 croak "Parameter 'options', if exists, must be a hash reference" if $params{options} && (ref($params{options}) ne 'HASH');
92 $params{layout} //= 1;
94 my $column_defs = $params{report}->{columns};
95 my @columns = $params{report}->get_visible_columns;
97 for my $obj (@{ $params{objects} || [] }) {
99 my $def = $column_defs->{$_};
101 raw_data => $def->{raw_data} ? $def->{raw_data}->($obj) : '',
102 data => $def->{sub} ? $def->{sub}->($obj)
103 : $obj->can($_) ? $obj->$_
105 link => $def->{obj_link} ? $def->{obj_link}->($obj) : '',
109 $params{data_callback}->(\%data) if $params{data_callback};
111 $params{report}->add_data(\%data);
114 if ($params{layout}) {
115 return $params{report}->generate_with_headers(%{ $params{options} || {}});
117 my $html = $params{report}->generate_html_content(%{ $params{options} || {}});
118 $self->render(\$html , { layout => 0, process => 0 });
131 SL::Controller::Helper::ReportGenerator - Mixin for controllers that
132 use the L<SL::ReportGenerator> class
136 package SL::Controller::Unicorn;
138 use SL::Controller::Helper::ReportGenerator;
143 # Set up the report generator instance. In this example this is
144 # hidden in "prepare_report".
145 my $report = $self->prepare_report;
147 # Get objects from database.
148 my $orders = SL::DB::Manager::Order->get_all(...);
150 # Let report generator create the output.
151 $self->report_generator_list_objects(
161 =item C<action_report_generator_back>
163 This is the controller action that's called from the one of the report
164 generator's 'export options' pages when the user clicks on the 'back'
167 It is never called from a controller manually and should just work
170 =item C<action_report_generator_export_as_csv>
172 This is the controller action that's called from the generated report
173 when the user wants to export as CSV. First the CSV export options are
174 shown and afterwards the CSV file is generated and offered for
177 It is never called from a controller manually and should just work
180 =item C<action_report_generator_export_as_pdf>
182 This is the controller action that's called from the generated report
183 when the user wants to export as PDF. First the PDF export options are
184 shown and afterwards the PDF file is generated and offered for
187 It is never called from a controller manually and should just work
190 =item C<report_generator_do>
192 This is a common function that's called from
193 L<action_report_generator_back>,
194 L<action_report_generator_export_as_csv> and
195 L<action_report_generator_export_as_pdf>. It handles common options
196 and report generation after options have been set.
198 It is never called from a controller manually and should just work
201 =item C<report_generator_list_objects %params>
203 Iterates over all objects, creates the actual rows of data, hands them
204 over to the report generator and lets the report generator create the
207 C<%params> can contain the following values:
213 Mandatory. An instance of L<SL::ReportGenerator> that has been set up
214 already (column definitions, title, sort handling etc).
218 Mandatory. An array reference of RDBO models to output.
220 =item C<data_callback>
222 Optional. A callback handler (code reference) that gets called for
223 each row before it is passed to the report generator. The row passed
224 will be the handler's first and only argument (a hash reference). It's
225 the same hash reference that's passed to
226 L<SL::ReportGenrator/add_data>.
230 An optional hash reference that's passed verbatim to the function
231 L<SL::ReportGenerator/generate_with_headers>.
243 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>