1 package SL::Controller::Helper::ReportGenerator;
6 use List::Util qw(max);
10 use SL::ReportGenerator;
12 use Exporter 'import';
14 action_report_generator_export_as_pdf action_report_generator_export_as_csv
15 action_report_generator_back report_generator_do
16 report_generator_list_objects
19 sub action_report_generator_export_as_pdf {
22 delete $::form->{action_report_generator_export_as_pdf};
24 if ($::form->{report_generator_pdf_options_set}) {
25 my $saved_form = save_form();
27 $self->report_generator_do('PDF');
29 if ($::form->{report_generator_printed}) {
30 restore_form($saved_form);
31 $::form->{MESSAGE} = $::locale->text('The list has been printed.');
32 $self->report_generator_do('HTML');
38 my @form_values = $::form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $::form });
40 $::form->get_lists('printers' => 'ALL_PRINTERS');
41 map { $_->{selected} = $::myconfig{default_printer_id} == $_->{id} } @{ $::form->{ALL_PRINTERS} };
43 $::form->{copies} = max $::myconfig{copies} * 1, 1;
44 $::form->{title} = $::locale->text('PDF export -- options');
46 print $::form->parse_html_template('report_generator/pdf_export_options', {
47 'HIDDEN' => \@form_values,
48 'ALLOW_FONT_SELECTION' => SL::ReportGenerator->check_for_pdf_api, });
51 sub action_report_generator_export_as_csv {
54 delete $::form->{action_report_generator_export_as_csv};
56 if ($::form->{report_generator_csv_options_set}) {
57 $self->report_generator_do('CSV');
61 my @form_values = $::form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $::form });
63 $::form->{title} = $::locale->text('CSV export -- options');
65 print $::form->parse_html_template('report_generator/csv_export_options', { 'HIDDEN' => \@form_values });
68 sub action_report_generator_back {
69 $_[0]->report_generator_do('HTML');
72 sub report_generator_do {
73 my ($self, $format) = @_;
75 my $nextsub = $::form->{report_generator_nextsub};
77 $::form->error($::locale->text('report_generator_nextsub is not defined.'));
80 foreach my $key (split m/ +/, $::form->{report_generator_variable_list}) {
81 $::form->{$key} = $::form->{"report_generator_hidden_${key}"};
84 $::form->{report_generator_output_format} = $format;
86 delete @{$::form}{map { "report_generator_$_" } qw(nextsub variable_list)};
88 $self->_run_action($nextsub);
91 sub report_generator_list_objects {
92 my ($self, %params) = @_;
94 croak "Parameter 'objects' must exist and be an array reference" if ref($params{objects}) ne 'ARRAY';
95 croak "Parameter 'report' must exist and be an instance of SL::ReportGenerator" if ref($params{report}) ne 'SL::ReportGenerator';
96 croak "Parameter 'options', if exists, must be a hash reference" if $params{options} && (ref($params{options}) ne 'HASH');
97 $params{layout} //= 1;
99 my $column_defs = $params{report}->{columns};
100 my @columns = $params{report}->get_visible_columns('HTML');
102 for my $obj (@{ $params{objects} || [] }) {
104 my $def = $column_defs->{$_};
106 raw_data => $def->{raw_data} ? $def->{raw_data}->($obj) : '',
107 data => $def->{sub} ? $def->{sub}->($obj)
108 : $obj->can($_) ? $obj->$_
110 link => $def->{obj_link} ? $def->{obj_link}->($obj) : '',
114 $params{data_callback}->(\%data) if $params{data_callback};
116 $params{report}->add_data(\%data);
119 if ($params{layout}) {
120 return $params{report}->generate_with_headers(%{ $params{options} || {}});
122 my $html = $params{report}->generate_html_content(%{ $params{options} || {}});
123 $self->render(\$html , { layout => 0, process => 0 });
136 SL::Controller::Helper::ReportGenerator - Mixin for controllers that
137 use the L<SL::ReportGenerator> class
141 package SL::Controller::Unicorn;
143 use SL::Controller::Helper::ReportGenerator;
148 # Set up the report generator instance. In this example this is
149 # hidden in "prepare_report".
150 my $report = $self->prepare_report;
152 # Get objects from database.
153 my $orders = SL::DB::Manager::Order->get_all(...);
155 # Let report generator create the output.
156 $self->report_generator_list_objects(
166 =item C<action_report_generator_back>
168 This is the controller action that's called from the one of the report
169 generator's 'export options' pages when the user clicks on the 'back'
172 It is never called from a controller manually and should just work
175 =item C<action_report_generator_export_as_csv>
177 This is the controller action that's called from the generated report
178 when the user wants to export as CSV. First the CSV export options are
179 shown and afterwards the CSV file is generated and offered for
182 It is never called from a controller manually and should just work
185 =item C<action_report_generator_export_as_pdf>
187 This is the controller action that's called from the generated report
188 when the user wants to export as PDF. First the PDF export options are
189 shown and afterwards the PDF file is generated and offered for
192 It is never called from a controller manually and should just work
195 =item C<report_generator_do>
197 This is a common function that's called from
198 L<action_report_generator_back>,
199 L<action_report_generator_export_as_csv> and
200 L<action_report_generator_export_as_pdf>. It handles common options
201 and report generation after options have been set.
203 It is never called from a controller manually and should just work
206 =item C<report_generator_list_objects %params>
208 Iterates over all objects, creates the actual rows of data, hands them
209 over to the report generator and lets the report generator create the
212 C<%params> can contain the following values:
218 Mandatory. An instance of L<SL::ReportGenerator> that has been set up
219 already (column definitions, title, sort handling etc).
223 Mandatory. An array reference of RDBO models to output.
225 =item C<data_callback>
227 Optional. A callback handler (code reference) that gets called for
228 each row before it is passed to the report generator. The row passed
229 will be the handler's first and only argument (a hash reference). It's
230 the same hash reference that's passed to
231 L<SL::ReportGenrator/add_data>.
235 An optional hash reference that's passed verbatim to the function
236 L<SL::ReportGenerator/generate_with_headers>.
248 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>