1 package C4::Labels::Layout;
6 use Sys::Syslog qw(syslog);
14 use version; our $VERSION = qv('1.0.0_1');
17 # FIXME: Consider this style parameter verification instead...
21 # if (exists $default{$lc})
22 # { $default{$lc} = $param{$_};
25 # { print STDERR "Unknown parameter $_ , not used \n";
31 my @valtmpl_id_params = (
43 my %given_params = @_;
44 foreach my $key (keys %given_params) {
45 if (!(grep m/$key/, @valtmpl_id_params)) {
46 syslog("LOG_ERR", "C4::Labels::Layout : (Multiple parameters) Unrecognized parameter type of \"%s\".", $key);
52 if (!(grep m/$_/, @valtmpl_id_params)) {
53 syslog("LOG_ERR", "C4::Labels::Layout : (Single parameter) Unrecognized parameter type of \"%s\".", $_);
62 if (_check_params(@_) eq 1) {
65 my $type = ref($invocant) || $invocant;
67 barcode_type => 'CODE39',
68 printing_type => 'BAR',
69 layout_name => 'DEFAULT',
75 format_string => 'title, author, isbn, issn, itemtype, barcode, callnumber',
85 my $type = ref($invocant) || $invocant;
86 my $query = "SELECT * FROM labels_layouts WHERE layout_id = ?";
87 my $sth = C4::Context->dbh->prepare($query);
88 $sth->execute($opts{'layout_id'});
90 syslog("LOG_ERR", "Database returned the following error: %s", $sth->errstr);
93 my $self = $sth->fetchrow_hashref;
102 my $query_param = '';
104 $self = shift; # check to see if this is a method call
105 $call_type = 'C4::Labels::Layout->delete';
106 $query_param = $self->{'layout_id'};
110 $call_type = 'C4::Labels::Layout::delete';
111 $query_param = $opts{'layout_id'};
113 if ($query_param eq '') { # If there is no layout id then we cannot delete it
114 syslog("LOG_ERR", "%s : Cannot delete layout as the layout id is invalid or non-existant.", $call_type);
117 my $query = "DELETE FROM labels_layouts WHERE layout_id = ?";
118 my $sth = C4::Context->dbh->prepare($query);
119 $sth->execute($query_param);
121 syslog("LOG_ERR", "%s : Database returned the following error: %s", $call_type, $sth->errstr);
129 if ($self->{'layout_id'}) { # if we have an id, the record exists and needs UPDATE
131 my $query = "UPDATE labels_layouts SET ";
132 foreach my $key (keys %{$self}) {
133 next if $key eq 'layout_id';
134 push (@params, $self->{$key});
135 $query .= "$key=?, ";
137 $query = substr($query, 0, (length($query)-2));
138 $query .= " WHERE layout_id=?;";
139 push (@params, $self->{'layout_id'});
140 my $sth = C4::Context->dbh->prepare($query);
141 #local $sth->{TraceLevel} = "3"; # enable DBI trace and set level; outputs to STDERR
142 $sth->execute(@params);
144 syslog("LOG_ERR", "C4::Labels::Layout : Database returned the following error: %s", $sth->errstr);
147 return $self->{'layout_id'};
149 else { # otherwise create a new record
151 my $query = "INSERT INTO labels_layouts (";
152 foreach my $key (keys %{$self}) {
153 push (@params, $self->{$key});
156 $query = substr($query, 0, (length($query)-2));
157 $query .= ") VALUES (";
158 for (my $i=1; $i<=(scalar keys %$self); $i++) {
161 $query = substr($query, 0, (length($query)-1));
163 my $sth = C4::Context->dbh->prepare($query);
164 $sth->execute(@params);
166 syslog("LOG_ERR", "C4::Labels::Layout : Database returned the following error: %s", $sth->errstr);
169 my $sth1 = C4::Context->dbh->prepare("SELECT MAX(layout_id) FROM labels_layouts;");
171 my $id = $sth1->fetchrow_array;
178 if (_check_params(@_) eq 1) {
182 if (exists($self->{$attr})) {
183 return $self->{$attr};
193 if (_check_params(@_) eq 1) {
197 foreach my $attrib (keys(%attrs)) {
198 $self->{$attrib} = $attrs{$attrib};
203 sub get_text_wrap_cols {
209 my $textlimit = $params{'label_width'} - ( 3 * $params{'left_text_margin'});
211 while ($strwidth < $textlimit) {
214 $strwidth = C4::Labels::PDF->StrWidth( $string, $self->{'font'}, $self->{'font_size'} );
224 C4::Labels::Layout -A class for creating and manipulating layout objects in Koha
228 This module provides methods for creating, retrieving, and otherwise manipulating label layout objects used by Koha to create and export labels.
234 Invoking the I<new> method constructs a new layout object containing the default values for a layout.
235 The following parameters are optionally accepted as key => value pairs:
237 C<barcode_type> Defines the barcode type to be used on labels. NOTE: At present only the following barcode types are supported in the label creator code:
245 CODE39MOD = Code 3 of 9 with modulo 43 checksum
248 CODE39MOD10 = Code 3 of 9 with modulo 10 checksum
251 COOP2OF5 = A varient of 2 of 5 barcode based on NEC's "Process 8000" code
254 INDUSTRIAL2OF5 = The standard 2 of 5 barcode (a binary level bar code developed by Identicon Corp. and Computer Identics Corp. in 1970)
258 C<printing_type> Defines the general layout to be used on labels. NOTE: At present there are only five printing types supported in the label creator code:
263 BIB = Only the bibliographic data is printed
266 BARBIB = Barcode proceeds bibliographic data
269 BIBBAR = Bibliographic data proceeds barcode
272 ALT = Barcode and bibliographic data are printed on alternating labels
275 BAR = Only the barcode is printed
279 C<layout_name> The descriptive name for this layout.
280 C<guidebox> Setting this to '1' will result in a guide box being drawn around the labels marking the edge of each label
281 C<font> Defines the type of font to be used on labels. NOTE: The following fonts are available by default on most systems:
295 TBI = Times Bold Italic
304 CO = Courier Oblique (Italic)
307 CBO = Courier Bold Oblique
316 HBO = Helvetical Bold Oblique
320 C<font_size> Defines the size of the font in postscript points to be used on labels
321 C<callnum_split> Setting this to '1' will enable call number splitting on labels
322 C<text_justify> Defines the text justification to be used on labels. NOTE: The following justification styles are currently supported by label creator code:
337 C<format_string> Defines what fields will be printed and in what order they will be printed on labels. These include any of the data fields that may be mapped
338 to your MARC frameworks. Specify MARC subfields as a 4-character tag-subfield string: ie. 254a Enclose a whitespace-separated list of fields
339 to concatenate on one line in double quotes. ie. "099a 099b" or "itemcallnumber barcode" Static text strings may be entered in single-quotes:
340 ie. 'Some static text here.'
343 C<my $layout = Layout->new(); # Creates and returns a new layout object>
345 C<my $layout = C4::Labels::Layout->new(barcode_type => 'CODE39', printing_type => 'BIBBAR', font => 'C', font_size => 6); # Creates and returns a new layout object using
346 the supplied values to override the defaults>
348 B<NOTE:> This layout is I<not> written to the database until save() is invoked. You have been warned!
350 =head2 retrieve(layout_id => layout_id)
352 Invoking the I<retrieve> method constructs a new layout object containing the current values for layout_id. The method returns a new object upon success and 1 upon failure.
353 Errors are logged to the syslog.
356 C<my $layout = Layout->retrieve(layout_id => 1); # Retrieves layout record 1 and returns an object containing the record>
360 Invoking the delete method attempts to delete the layout from the database. The method returns 0 upon success and -1 upon failure. Errors are logged to the syslog.
361 NOTE: This method may also be called as a function and passed a key/value pair simply deleteing that template from the database. See the example below.
364 C<my $exitstat = $layout->delete(); # to delete the record behind the $layout object>
365 C<my $exitstat = Layout->delete(layout_id => 1); # to delete layout record 1>
369 Invoking the I<save> method attempts to insert the layout into the database if the layout is new and update the existing layout record if the layout exists.
370 The method returns the new record id upon success and -1 upon failure (This avoids conflicting with a record id of 1). Errors are logged to the syslog.
373 C<my $exitstat = $layout->save(); # to save the record behind the $layout object>
375 =head2 get_attr($attribute)
377 Invoking the I<get_attr> method will return the value of the requested attribute or -1 on errors.
380 C<my $value = $layout->get_attr($attribute);>
382 =head2 set_attr(attribute => value, attribute_2 => value)
384 Invoking the I<set_attr> method will set the value of the supplied attributes to the supplied values. The method accepts key/value pairs separated by
388 C<$layout->set_attr(attribute => value);>
390 =head2 get_text_wrap_cols()
392 Invoking the I<get_text_wrap_cols> method will return the number of columns that can be printed on the label before wrapping to the next line.
395 C<my $text_wrap_cols = $layout->get_text_wrap_cols();>
399 Chris Nighswonger <cnighswonger AT foundations DOT edu>
403 Copyright 2009 Foundations Bible College.
407 This file is part of Koha.
409 Koha is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software
410 Foundation; either version 2 of the License, or (at your option) any later version.
412 You should have received a copy of the GNU General Public License along with Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
413 Suite 330, Boston, MA 02111-1307 USA
415 =head1 DISCLAIMER OF WARRANTY
417 Koha is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
418 A PARTICULAR PURPOSE. See the GNU General Public License for more details.