File: | C4/Creators/Lib.pm |
Coverage: | 10.7% |
line | stmt | bran | cond | sub | time | code |
---|---|---|---|---|---|---|
1 | package C4::Creators::Lib; | |||||
2 | ||||||
3 | # Copyright 2009 Foundations Bible College. | |||||
4 | # | |||||
5 | # This file is part of Koha. | |||||
6 | # | |||||
7 | # Koha is free software; you can redistribute it and/or modify it under the | |||||
8 | # terms of the GNU General Public License as published by the Free Software | |||||
9 | # Foundation; either version 2 of the License, or (at your option) any later | |||||
10 | # version. | |||||
11 | # | |||||
12 | # Koha is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
13 | # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||||
14 | # A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||||
15 | # | |||||
16 | # You should have received a copy of the GNU General Public License along | |||||
17 | # with Koha; if not, write to the Free Software Foundation, Inc., | |||||
18 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |||||
19 | ||||||
20 | 7 7 7 | 33 13 191 | use strict; | |||
21 | 7 7 7 | 32 9 294 | use warnings; | |||
22 | ||||||
23 | 7 7 7 | 10180 817 95 | use autouse 'Data::Dumper' => qw(Dumper); | |||
24 | ||||||
25 | 7 7 7 | 1008 26 82 | use C4::Context; | |||
26 | 7 7 7 | 46 48 686 | use C4::Debug; | |||
27 | ||||||
28 | BEGIN { | |||||
29 | 7 7 7 7 | 485 6918 86 58 | use version; our $VERSION = qv('1.0.0_1'); | |||
30 | 7 7 7 | 816 16 944 | use base qw(Exporter); | |||
31 | 7 | 19152 | our @EXPORT = qw(get_all_templates | |||
32 | get_all_layouts | |||||
33 | get_all_profiles | |||||
34 | get_all_image_names | |||||
35 | get_batch_summary | |||||
36 | get_label_summary | |||||
37 | get_card_summary | |||||
38 | get_barcode_types | |||||
39 | get_label_types | |||||
40 | get_font_types | |||||
41 | get_text_justification_types | |||||
42 | get_output_formats | |||||
43 | get_column_names | |||||
44 | get_table_names | |||||
45 | get_unit_values | |||||
46 | html_table | |||||
47 | ); | |||||
48 | } | |||||
49 | ||||||
50 - 54 | =head1 NAME C4::Creators::Lib =cut | |||||
55 | ||||||
56 - 58 | =head1 FUNCTIONS =cut | |||||
59 | ||||||
60 | #=head2 C4::Creators::Lib::_SELECT() | |||||
61 | # | |||||
62 | # This function returns a recordset upon success and 1 upon failure. Errors are logged to the Apache log. | |||||
63 | # | |||||
64 | # examples: | |||||
65 | # | |||||
66 | # my $field_value = _SELECT(field_name, table_name, condition); | |||||
67 | # | |||||
68 | #=cut | |||||
69 | ||||||
70 | sub _SELECT { | |||||
71 | 0 | my @params = @_; | ||||
72 | 0 | my $query = "SELECT $params[0] FROM $params[1]"; | ||||
73 | 0 | $params[2] ? $query .= " WHERE $params[2];" : $query .= ';'; | ||||
74 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
75 | # $sth->{'TraceLevel'} = 3; | |||||
76 | 0 | $sth->execute(); | ||||
77 | 0 | if ($sth->err) { | ||||
78 | 0 | warn sprintf('Database returned the following error: %s', $sth->errstr); | ||||
79 | 0 | return 1; | ||||
80 | } | |||||
81 | 0 | my $record_set = []; | ||||
82 | 0 | while (my $row = $sth->fetchrow_hashref()) { | ||||
83 | 0 | push(@$record_set, $row); | ||||
84 | } | |||||
85 | 0 | return $record_set; | ||||
86 | } | |||||
87 | ||||||
88 | my $barcode_types = [ | |||||
89 | {type => 'CODE39', name => 'Code 39', desc => 'Translates the characters 0-9, A-Z, \'-\', \'*\', \'+\', \'$\', \'%\', \'/\', \'.\' and \' \' to a barcode pattern.', selected => 0}, | |||||
90 | {type => 'CODE39MOD', name => 'Code 39 + Modulo43', desc => 'Translates the characters 0-9, A-Z, \'-\', \'*\', \'+\', \'$\', \'%\', \'/\', \'.\' and \' \' to a barcode pattern. Encodes Mod 43 checksum.', selected => 0}, | |||||
91 | {type => 'CODE39MOD10', name => 'Code 39 + Modulo10', desc => 'Translates the characters 0-9, A-Z, \'-\', \'*\', \'+\', \'$\', \'%\', \'/\', \'.\' and \' \' to a barcode pattern. Encodes Mod 10 checksum.', selected => 0}, | |||||
92 | {type => 'COOP2OF5', name => 'COOP2of5', desc => 'Creates COOP2of5 barcodes from a string consisting of the numeric characters 0-9', selected => 0}, | |||||
93 | # {type => 'EAN13', name => 'EAN13', desc => 'Creates EAN13 barcodes from a string of 12 or 13 digits. The check number (the 13:th digit) is calculated if not supplied.', selected => 0}, | |||||
94 | # {type => 'EAN8', name => 'EAN8', desc => 'Translates a string of 7 or 8 digits to EAN8 barcodes. The check number (the 8:th digit) is calculated if not supplied.', selected => 0}, | |||||
95 | # {type => 'IATA2of5', name => 'IATA2of5', desc => 'Creates IATA2of5 barcodes from a string consisting of the numeric characters 0-9', selected => 0}, | |||||
96 | {type => 'INDUSTRIAL2OF5', name => 'Industrial2of5', desc => 'Creates Industrial2of5 barcodes from a string consisting of the numeric characters 0-9', selected => 0}, | |||||
97 | # {type => 'ITF', name => 'Interleaved2of5', desc => 'Translates the characters 0-9 to a barcodes. These barcodes could also be called 'Interleaved2of5'.', selected => 0}, | |||||
98 | # {type => 'MATRIX2OF5', name => 'Matrix2of5', desc => 'Creates Matrix2of5 barcodes from a string consisting of the numeric characters 0-9', selected => 0}, | |||||
99 | # {type => 'NW7', name => 'NW7', desc => 'Creates a NW7 barcodes from a string consisting of the numeric characters 0-9', selected => 0}, | |||||
100 | # {type => 'UPCA', name => 'UPCA', desc => 'Translates a string of 11 or 12 digits to UPCA barcodes. The check number (the 12:th digit) is calculated if not supplied.', selected => 0}, | |||||
101 | # {type => 'UPCE', name => 'UPCE', desc => 'Translates a string of 6, 7 or 8 digits to UPCE barcodes. If the string is 6 digits long, '0' is added first in the string. The check number (the 8:th digit) is calculated if not supplied.', selected => 0}, | |||||
102 | ]; | |||||
103 | ||||||
104 | my $label_types = [ | |||||
105 | {type => 'BIB', name => 'Biblio', desc => 'Only the bibliographic data is printed.', selected => 0}, | |||||
106 | {type => 'BARBIB', name => 'Barcode/Biblio', desc => 'Barcode proceeds bibliographic data.', selected => 0}, | |||||
107 | {type => 'BIBBAR', name => 'Biblio/Barcode', desc => 'Bibliographic data proceeds barcode.', selected => 0}, | |||||
108 | {type => 'ALT', name => 'Alternating', desc => 'Barcode and bibliographic data are printed on alternating labels.', selected => 0}, | |||||
109 | {type => 'BAR', name => 'Barcode', desc => 'Only the barcode is printed.', selected => 0}, | |||||
110 | ]; | |||||
111 | ||||||
112 | my $font_types = [ | |||||
113 | {type => 'TR', name => 'Times-Roman', selected => 0}, | |||||
114 | {type => 'TB', name => 'Times-Bold', selected => 0}, | |||||
115 | {type => 'TI', name => 'Times-Italic', selected => 0}, | |||||
116 | {type => 'TBI', name => 'Times-Bold-Italic', selected => 0}, | |||||
117 | {type => 'C', name => 'Courier', selected => 0}, | |||||
118 | {type => 'CB', name => 'Courier-Bold', selected => 0}, | |||||
119 | {type => 'CO', name => 'Courier-Oblique', selected => 0}, | |||||
120 | {type => 'CBO', name => 'Courier-Bold-Oblique', selected => 0}, | |||||
121 | {type => 'H', name => 'Helvetica', selected => 0}, | |||||
122 | {type => 'HB', name => 'Helvetica-Bold', selected => 0}, | |||||
123 | {type => 'HBO', name => 'Helvetica-Bold-Oblique', selected => 0}, | |||||
124 | ]; | |||||
125 | ||||||
126 | my $text_justification_types = [ | |||||
127 | {type => 'L', name => 'Left', selected => 0}, | |||||
128 | {type => 'C', name => 'Center', selected => 0}, | |||||
129 | {type => 'R', name => 'Right', selected => 0}, | |||||
130 | # {type => 'F', name => 'Full', selected => 0}, | |||||
131 | ]; | |||||
132 | ||||||
133 | my $unit_values = [ | |||||
134 | {type => 'POINT', desc => 'PostScript Points', value => 1, selected => 0}, | |||||
135 | {type => 'AGATE', desc => 'Adobe Agates', value => 5.1428571, selected => 0}, | |||||
136 | {type => 'INCH', desc => 'US Inches', value => 72, selected => 0}, | |||||
137 | {type => 'MM', desc => 'SI Millimeters', value => 2.83464567, selected => 0}, | |||||
138 | {type => 'CM', desc => 'SI Centimeters', value => 28.3464567, selected => 0}, | |||||
139 | ]; | |||||
140 | ||||||
141 | my $output_formats = [ | |||||
142 | {type => 'pdf', desc => 'PDF File'}, | |||||
143 | {type => 'csv', desc => 'CSV File'}, | |||||
144 | ]; | |||||
145 | ||||||
146 - 152 | =head2 C4::Creators::Lib::get_all_templates() my $templates = get_all_templates(); This function returns a reference to a hash containing all templates upon success and 1 upon failure. Errors are logged to the Apache log. =cut | |||||
153 | ||||||
154 | sub get_all_templates { | |||||
155 | 0 | my %params = @_; | ||||
156 | 0 | my @templates = (); | ||||
157 | 0 | my $query = "SELECT " . ($params{'field_list'} ? $params{'field_list'} : '*') . " FROM creator_templates"; | ||||
158 | 0 | $query .= ($params{'filter'} ? " WHERE $params{'filter'};" : ';'); | ||||
159 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
160 | 0 | $sth->execute(); | ||||
161 | 0 | if ($sth->err) { | ||||
162 | 0 | warn sprintf('Database returned the following error: %s', $sth->errstr); | ||||
163 | 0 | return -1; | ||||
164 | } | |||||
165 | ADD_TEMPLATES: | |||||
166 | 0 | while (my $template = $sth->fetchrow_hashref) { | ||||
167 | 0 | push(@templates, $template); | ||||
168 | } | |||||
169 | 0 | return \@templates; | ||||
170 | } | |||||
171 | ||||||
172 - 178 | =head2 C4::Creators::Lib::get_all_layouts() my $layouts = get_all_layouts(); This function returns a reference to a hash containing all layouts upon success and 1 upon failure. Errors are logged to the Apache log. =cut | |||||
179 | ||||||
180 | sub get_all_layouts { | |||||
181 | 0 | my %params = @_; | ||||
182 | 0 | my @layouts = (); | ||||
183 | 0 | my $query = "SELECT " . ($params{'field_list'} ? $params{'field_list'} : '*') . " FROM creator_layouts"; | ||||
184 | 0 | $query .= ($params{'filter'} ? " WHERE $params{'filter'};" : ';'); | ||||
185 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
186 | 0 | $sth->execute(); | ||||
187 | 0 | if ($sth->err) { | ||||
188 | 0 | warn sprintf('Database returned the following error: %s', $sth->errstr); | ||||
189 | 0 | return -1; | ||||
190 | } | |||||
191 | ADD_LAYOUTS: | |||||
192 | 0 | while (my $layout = $sth->fetchrow_hashref) { | ||||
193 | 0 | push(@layouts, $layout); | ||||
194 | } | |||||
195 | 0 | return \@layouts; | ||||
196 | } | |||||
197 | ||||||
198 - 210 | =head2 C4::Creators::Lib::get_all_profiles() my $profiles = get_all_profiles(); my $profiles = get_all_profiles(field_list => field_list, filter => filter_string); This function returns an arrayref whose elements are hashes containing all profiles upon success and 1 upon failure. Errors are logged to the Apache log. Two parameters are accepted. The first limits the field(s) returned. This parameter should be string of comma separted fields. ie. "field_1, field_2, ...field_n" The second limits the records returned based on a string containing a valud SQL 'WHERE' filter. NOTE: Do not pass in the keyword 'WHERE.' =cut | |||||
211 | ||||||
212 | sub get_all_profiles { | |||||
213 | 0 | my %params = @_; | ||||
214 | 0 | my @profiles = (); | ||||
215 | 0 | my $query = "SELECT " . ($params{'field_list'} ? $params{'field_list'} : '*') . " FROM printers_profile"; | ||||
216 | 0 | $query .= ($params{'filter'} ? " WHERE $params{'filter'};" : ';'); | ||||
217 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
218 | # $sth->{'TraceLevel'} = 3 if $debug; | |||||
219 | 0 | $sth->execute(); | ||||
220 | 0 | if ($sth->err) { | ||||
221 | 0 | warn sprintf('Database returned the following error: %s', $sth->errstr); | ||||
222 | 0 | return -1; | ||||
223 | } | |||||
224 | ADD_PROFILES: | |||||
225 | 0 | while (my $profile = $sth->fetchrow_hashref) { | ||||
226 | 0 | push(@profiles, $profile); | ||||
227 | } | |||||
228 | 0 | return \@profiles; | ||||
229 | } | |||||
230 | ||||||
231 - 233 | =head2 C4::Creators::Lib::get_all_image_names() =cut | |||||
234 | ||||||
235 | sub get_all_image_names { | |||||
236 | 0 | my $image_names = []; | ||||
237 | 0 | my $query = "SELECT image_name FROM creator_images"; | ||||
238 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
239 | # $sth->{'TraceLevel'} = 3 if $debug; | |||||
240 | 0 | $sth->execute(); | ||||
241 | 0 | if ($sth->err) { | ||||
242 | 0 | warn sprintf('Database returned the following error: %s', $sth->errstr); | ||||
243 | 0 | return -1; | ||||
244 | } | |||||
245 | 0 0 0 | grep {push @$image_names, {type => $$_[0], name => $$_[0], selected => 0}} @{$sth->fetchall_arrayref([0])}; | ||||
246 | 0 | return $image_names; | ||||
247 | } | |||||
248 | ||||||
249 - 261 | =head2 C4::Creators::Lib::get_batch_summary() my $batches = get_batch_summary(); my $batches = get_batch_summary(filter => filter_string); This function returns an arrayref whose elements are hashes containing the batch_ids of current batches along with the item count for each batch upon success and 1 upon failure. Item counts are stored under the key '_item_count' Errors are logged to the Apache log. One parameter is accepted which limits the records returned based on a string containing a valud SQL 'WHERE' filter. NOTE: Do not pass in the keyword 'WHERE.' =cut | |||||
262 | ||||||
263 | sub get_batch_summary { | |||||
264 | 0 | my %params = @_; | ||||
265 | 0 | my @batches = (); | ||||
266 | 0 | my $query = "SELECT DISTINCT batch_id FROM creator_batches WHERE creator=?"; | ||||
267 | 0 | $query .= ($params{'filter'} ? " AND $params{'filter'};" : ';'); | ||||
268 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
269 | # $sth->{'TraceLevel'} = 3; | |||||
270 | 0 | $sth->execute($params{'creator'}); | ||||
271 | 0 | if ($sth->err) { | ||||
272 | 0 | warn sprintf('Database returned the following error on attempted SELECT: %s', $sth->errstr); | ||||
273 | 0 | return -1; | ||||
274 | } | |||||
275 | ADD_BATCHES: | |||||
276 | 0 | while (my $batch = $sth->fetchrow_hashref) { | ||||
277 | 0 | my $query = "SELECT count(batch_id) FROM creator_batches WHERE batch_id=? AND creator=?;"; | ||||
278 | 0 | my $sth1 = C4::Context->dbh->prepare($query); | ||||
279 | 0 | $sth1->execute($batch->{'batch_id'}, $params{'creator'}); | ||||
280 | 0 | if ($sth1->err) { | ||||
281 | 0 | warn sprintf('Database returned the following error on attempted SELECT count: %s', $sth1->errstr); | ||||
282 | 0 | return -1; | ||||
283 | } | |||||
284 | 0 | my $count = $sth1->fetchrow_arrayref; | ||||
285 | 0 | $batch->{'_item_count'} = @$count[0]; | ||||
286 | 0 | push(@batches, $batch); | ||||
287 | } | |||||
288 | 0 | return \@batches; | ||||
289 | } | |||||
290 | ||||||
291 - 303 | =head2 C4::Creators::Lib::get_label_summary() my $labels = get_label_summary(); my $labels = get_label_summary(items => @item_list); This function returns an arrayref whose elements are hashes containing the label_ids of current labels along with the item count for each label upon success and 1 upon failure. Item counts are stored under the key '_item_count' Errors are logged to the Apache log. One parameter is accepted which limits the records returned based on a string containing a valud SQL 'WHERE' filter. NOTE: Do not pass in the keyword 'WHERE.' =cut | |||||
304 | ||||||
305 | sub get_label_summary { | |||||
306 | 0 | my %params = @_; | ||||
307 | 0 | my $label_number = 0; | ||||
308 | 0 | my @label_summaries = (); | ||||
309 | 0 | my $query = " SELECT b.title, b.author, bi.itemtype, i.barcode, i.biblionumber, i.itype | ||||
310 | FROM creator_batches AS c LEFT JOIN items AS i ON (c.item_number=i.itemnumber) | |||||
311 | LEFT JOIN biblioitems AS bi ON (i.biblioitemnumber=bi.biblioitemnumber) | |||||
312 | LEFT JOIN biblio AS b ON (bi.biblionumber=b.biblionumber) | |||||
313 | WHERE itemnumber=? AND batch_id=?; | |||||
314 | "; | |||||
315 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
316 | 0 0 | foreach my $item (@{$params{'items'}}) { | ||||
317 | 0 | $label_number++; | ||||
318 | 0 | $sth->execute($item->{'item_number'}, $params{'batch_id'}); | ||||
319 | 0 | if ($sth->err) { | ||||
320 | 0 | warn sprintf('Database returned the following error on attempted SELECT: %s', $sth->errstr); | ||||
321 | 0 | return -1; | ||||
322 | } | |||||
323 | 0 | my $record = $sth->fetchrow_hashref; | ||||
324 | 0 | my $label_summary; | ||||
325 | 0 | $label_summary->{'_label_number'} = $label_number; | ||||
326 | 0 | $record->{'author'} =~ s/[^\.|\w]$// if $record->{'author'}; # strip off ugly trailing chars... but not periods or word chars | ||||
327 | 0 | $record->{'title'} =~ s/\W*$//; # strip off ugly trailing chars | ||||
328 | # FIXME contructing staff interface URLs should be done *much* higher up the stack - for the most part, C4 module code | |||||
329 | # should not know that it's part of a web app | |||||
330 | 0 | $record->{'title'} = '<a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=' . $record->{'biblionumber'} . '"> ' . $record->{'title'} . '</a>'; | ||||
331 | 0 | $label_summary->{'_summary'} = $record->{'title'} . " | " . ($record->{'author'} ? $record->{'author'} : 'N/A'); | ||||
332 | 0 | $label_summary->{'_item_type'} = C4::Context->preference("item-level_itypes") ? $record->{'itype'} : $record->{'itemtype'}; | ||||
333 | 0 | $label_summary->{'_barcode'} = $record->{'barcode'}; | ||||
334 | 0 | $label_summary->{'_item_number'} = $item->{'item_number'}; | ||||
335 | 0 | $label_summary->{'_label_id'} = $item->{'label_id'}; | ||||
336 | 0 | push (@label_summaries, $label_summary); | ||||
337 | } | |||||
338 | 0 | return \@label_summaries; | ||||
339 | } | |||||
340 | ||||||
341 - 353 | =head2 C4::Creators::Lib::get_card_summary() my $cards = get_card_summary(); my $cards = get_card_summary(items => @item_list); This function returns an arrayref whose elements are hashes containing the label_ids of current cards along with the item count for each card upon success and 1 upon failure. Item counts are stored under the key '_item_count' Errors are logged to the Apache log. One parameter is accepted which limits the records returned based on a string containing a valud SQL 'WHERE' filter. NOTE: Do not pass in the keyword 'WHERE.' =cut | |||||
354 | ||||||
355 | sub get_card_summary { | |||||
356 | 0 | my %params = @_; | ||||
357 | 0 | my $card_number = 0; | ||||
358 | 0 | my @card_summaries = (); | ||||
359 | 0 | my $query = "SELECT CONCAT_WS(', ', surname, firstname) AS name, cardnumber FROM borrowers WHERE borrowernumber=?;"; | ||||
360 | 0 | my $sth = C4::Context->dbh->prepare($query); | ||||
361 | 0 0 | foreach my $item (@{$params{'items'}}) { | ||||
362 | 0 | $card_number++; | ||||
363 | 0 | $sth->execute($item->{'borrower_number'}); | ||||
364 | 0 | if ($sth->err) { | ||||
365 | 0 | warn sprintf('Database returned the following error on attempted SELECT: %s', $sth->errstr); | ||||
366 | 0 | return -1; | ||||
367 | } | |||||
368 | 0 | my $record = $sth->fetchrow_hashref; | ||||
369 | 0 | my $card_summary->{'_card_number'} = $card_number; | ||||
370 | 0 | $card_summary->{'_summary'} = $record->{'name'}; | ||||
371 | 0 | $card_summary->{'borrowernumber'} = $item->{'borrower_number'}; | ||||
372 | 0 | $card_summary->{'_label_id'} = $item->{'label_id'}; | ||||
373 | 0 | push (@card_summaries, $card_summary); | ||||
374 | } | |||||
375 | 0 | return \@card_summaries; | ||||
376 | } | |||||
377 | ||||||
378 - 384 | =head2 C4::Creators::Lib::get_barcode_types() my $barcode_types = get_barcode_types(); This function returns a reference to an array of hashes containing all barcode types along with their name and description. =cut | |||||
385 | ||||||
386 | sub get_barcode_types { | |||||
387 | 0 | return $barcode_types; | ||||
388 | } | |||||
389 | ||||||
390 - 396 | =head2 C4::Creators::Lib::get_label_types() my $label_types = get_label_types(); This function returns a reference to an array of hashes containing all label types along with their name and description. =cut | |||||
397 | ||||||
398 | sub get_label_types { | |||||
399 | 0 | return $label_types; | ||||
400 | } | |||||
401 | ||||||
402 - 408 | =head2 C4::Creators::Lib::get_font_types() my $font_types = get_font_types(); This function returns a reference to an array of hashes containing all font types along with their name and description. =cut | |||||
409 | ||||||
410 | sub get_font_types { | |||||
411 | 0 | return $font_types; | ||||
412 | } | |||||
413 | ||||||
414 - 420 | =head2 C4::Creators::Lib::get_text_justification_types() my $text_justification_types = get_text_justification_types(); This function returns a reference to an array of hashes containing all text justification types along with their name and description. =cut | |||||
421 | ||||||
422 | sub get_text_justification_types { | |||||
423 | 0 | return $text_justification_types; | ||||
424 | } | |||||
425 | ||||||
426 - 434 | =head2 C4::Creators::Lib::get_unit_values() my $unit_values = get_unit_values(); This function returns a reference to an array of hashes containing all unit types along with their description and multiplier. NOTE: All units are relative to a PostScript Point. There are 72 PS points to the inch. =cut | |||||
435 | ||||||
436 | sub get_unit_values { | |||||
437 | 0 | return $unit_values; | ||||
438 | } | |||||
439 | ||||||
440 - 446 | =head2 C4::Creators::Lib::get_output_formats() my $label_output_formats = get_output_formats(); This function returns a reference to an array of hashes containing all label output formats along with their description. =cut | |||||
447 | ||||||
448 | sub get_output_formats { | |||||
449 | 0 | return $output_formats; | ||||
450 | } | |||||
451 | ||||||
452 - 456 | =head2 C4::Creators::Lib::get_column_names($table_name) Return an arrayref of an array containing the column names of the supplied table. =cut | |||||
457 | ||||||
458 | sub get_column_names { | |||||
459 | 0 | my $table = shift; | ||||
460 | 0 | my $dbh = C4::Context->dbh(); | ||||
461 | 0 | my $column_names = []; | ||||
462 | 0 | my $sth = $dbh->column_info(undef,undef,$table,'%'); | ||||
463 | 0 | while (my $info = $sth->fetchrow_hashref()){ | ||||
464 | 0 | $$column_names[$info->{'ORDINAL_POSITION'}] = $info->{'COLUMN_NAME'}; | ||||
465 | } | |||||
466 | 0 | return $column_names; | ||||
467 | } | |||||
468 | ||||||
469 - 473 | =head2 C4::Creators::Lib::get_table_names($search_term) Return an arrayref of an array containing the table names which contain the supplied search term. =cut | |||||
474 | ||||||
475 | sub get_table_names { | |||||
476 | 0 | my $search_term = shift; | ||||
477 | 0 | my $dbh = C4::Context->dbh(); | ||||
478 | 0 | my $table_names = []; | ||||
479 | 0 | my $sth = $dbh->table_info(undef,undef,"%$search_term%"); | ||||
480 | 0 | while (my $info = $sth->fetchrow_hashref()){ | ||||
481 | 0 | push (@$table_names, $info->{'TABLE_NAME'}); | ||||
482 | } | |||||
483 | 0 | return $table_names; | ||||
484 | } | |||||
485 | ||||||
486 - 522 | =head2 C4::Creators::Lib::html_table() This function returns an arrayref of an array of hashes contianing the supplied data formatted suitably to be passed off as a T::P template parameter and used to build an html table. my $table = html_table(header_fields, array_of_row_data); $template->param( TABLE => $table, ); html example: <table> <!-- TMPL_LOOP NAME="TABLE" --> <!-- TMPL_IF NAME="header_fields" --> <tr> <!-- TMPL_LOOP NAME="header_fields" --> <th><!-- TMPL_VAR NAME="field_label" --></th> <!-- /TMPL_LOOP --> </tr> <!-- TMPL_ELSE --> <tr> <!-- TMPL_LOOP NAME="text_fields" --> <!-- TMPL_IF NAME="select_field" --> <td align="center"><input type="checkbox" name="action" value="<!-- TMPL_VAR NAME="field_value" -->" /></td> <!-- TMPL_ELSIF NAME="field_value" --> <td><!-- TMPL_VAR NAME="field_value" --></td> <!-- TMPL_ELSE --> <td> </td> <!-- /TMPL_IF --> <!-- /TMPL_LOOP --> </tr> <!-- /TMPL_IF --> <!-- /TMPL_LOOP --> </table> =cut | |||||
523 | ||||||
524 | sub html_table { | |||||
525 | 0 | my $headers = shift; | ||||
526 | 0 | my $data = shift; | ||||
527 | 0 | return undef if scalar(@$data) == 0; # no need to generate a table if there is not data to display | ||||
528 | 0 | my $table = []; | ||||
529 | 0 | my $fields = []; | ||||
530 | 0 | my @table_columns = (); | ||||
531 | 0 | my ($row_index, $col_index) = (0,0); | ||||
532 | 0 | my $cols = 0; # number of columns to wrap on | ||||
533 | 0 | my $field_count = 0; | ||||
534 | 0 | my $select_value = undef; | ||||
535 | 0 | my $link_field = undef; | ||||
536 | POPULATE_HEADER: | |||||
537 | 0 | foreach my $header (@$headers) { | ||||
538 | 0 | my @key = keys %$header; | ||||
539 | 0 | if ($key[0] eq 'select' ) { | ||||
540 | 0 | push (@table_columns, $key[0]); | ||||
541 | 0 | $$fields[$col_index] = {hidden => 0, select_field => 0, field_name => ($key[0]), field_label => $header->{$key[0]}{'label'}}; | ||||
542 | # do special formatting stuff.... | |||||
543 | 0 | $select_value = $header->{$key[0]}{'value'}; | ||||
544 | } | |||||
545 | else { | |||||
546 | # do special formatting stuff.... | |||||
547 | 0 | $link_field->{$key[0]} = ($header->{$key[0]}{'link_field'} == 1 ? 1 : 0); | ||||
548 | 0 | push (@table_columns, $key[0]); | ||||
549 | 0 | $$fields[$col_index] = {hidden => 0, select_field => 0, field_name => ($key[0]), field_label => $header->{$key[0]}{'label'}}; | ||||
550 | } | |||||
551 | 0 | $field_count++; | ||||
552 | 0 | $col_index++; | ||||
553 | } | |||||
554 | 0 | $$table[$row_index] = {header_fields => $fields}; | ||||
555 | 0 | $cols = $col_index; | ||||
556 | 0 | $field_count *= scalar(@$data); # total fields to be displayed in the table | ||||
557 | 0 | $col_index = 0; | ||||
558 | 0 | $row_index++; | ||||
559 | 0 | $fields = []; | ||||
560 | POPULATE_TABLE: | |||||
561 | 0 | foreach my $db_row (@$data) { | ||||
562 | POPULATE_ROW: | |||||
563 | 0 | foreach my $table_column (@table_columns) { | ||||
564 | 0 0 | if (grep {$table_column eq $_} keys %$db_row) { | ||||
565 | 0 | $$fields[$col_index] = {hidden => 0, link_field => $link_field->{$table_column}, select_field => 0, field_name => ($table_column . "_tbl"), field_value => $db_row->{$table_column}}; | ||||
566 | 0 | $col_index++; | ||||
567 | 0 | next POPULATE_ROW; | ||||
568 | } | |||||
569 | elsif ($table_column =~ m/^_((.*)_(.*$))/) { # this a special case | |||||
570 | 0 | my $table_name = get_table_names($2); | ||||
571 | 0 | my $record_set = _SELECT($1, @$table_name[0], $2 . "_id = " . $db_row->{$2 . "_id"}); | ||||
572 | 0 | $$fields[$col_index] = {hidden => 0, link_field => $link_field->{$table_column}, select_field => 0, field_name => ($table_column . "_tbl"), field_value => $$record_set[0]{$1}}; | ||||
573 | 0 | $col_index++; | ||||
574 | 0 | next POPULATE_ROW; | ||||
575 | } | |||||
576 | elsif ($table_column eq 'select' ) { | |||||
577 | 0 | $$fields[$col_index] = {hidden => 0, select_field => 1, field_name => 'select', field_value => $db_row->{$select_value}}; | ||||
578 | } | |||||
579 | } | |||||
580 | 0 | $$table[$row_index] = {text_fields => $fields}; | ||||
581 | 0 | $col_index = 0; | ||||
582 | 0 | $row_index++; | ||||
583 | 0 | $fields = []; | ||||
584 | } | |||||
585 | 0 | return $table; | ||||
586 | } | |||||
587 | ||||||
588 | 1; |