1 package C4::Creators::Layout;
6 use autouse 'Data::Dumper' => qw(Dumper);
10 use C4::Creators::PDF;
13 use version; our $VERSION = qv('1.0.0_1');
16 # FIXME: Consider this style parameter verification instead...
20 # if (exists $default{$lc})
21 # { $default{$lc} = $param{$_};
24 # { print STDERR "Unknown parameter $_ , not used \n";
30 my @valtmpl_id_params = (
41 'layout_xml', # FIXME: all layouts should be stored in xml format to greatly simplify handling -chris_n
45 my %given_params = @_;
46 foreach my $key (keys %given_params) {
47 if (!(grep m/$key/, @valtmpl_id_params)) {
48 warn sprintf('(Multiple parameters) Unrecognized parameter type of "%s".', $key);
54 if (!(grep m/$_/, @valtmpl_id_params)) {
55 warn sprintf('(Single parameter) Unrecognized parameter type of "%s".', $_);
65 if (_check_params(@_) eq 1) {
68 my $type = ref($invocant) || $invocant;
69 if (grep {$_ eq 'Labels'} @_) {
71 barcode_type => 'CODE39',
72 printing_type => 'BAR',
73 layout_name => 'DEFAULT',
79 format_string => 'title, author, isbn, issn, itemtype, barcode, callnumber',
83 elsif (grep {$_ eq 'Patroncards'} @_) {
85 layout_xml => '<opt>Default Layout</opt>',
96 my $type = ref($invocant) || $invocant;
97 my $query = "SELECT * FROM creator_layouts WHERE layout_id = ? AND creator = ?";
98 #warn "QUERY: $query\n"; #XXX Remove
99 #warn "PARAMS: layout_id=" . $opts{'layout_id'} . " creator=" . $opts{'creator'} . "\n"; #XXX Remove
100 my $sth = C4::Context->dbh->prepare($query);
101 $sth->execute($opts{'layout_id'}, $opts{'creator'});
103 warn sprintf('Database returned the following error: %s', $sth->errstr);
106 my $self = $sth->fetchrow_hashref;
107 bless ($self, $type);
117 $self = shift; # check to see if this is a method call
118 $call_type = 'C4::Labels::Layout->delete';
119 push @params, $self->{'layout_id'}, $self->{'creator'};
124 $call_type = $class . '::delete';
125 push @params, $opts{'layout_id'}, $opts{'creator'};
127 if (scalar(@params) < 2) { # If there is no layout id or creator type then we cannot delete it
128 warn sprintf('%s : Cannot delete layout as the profile id is invalid or non-existant.', $call_type) if !$params[0];
129 warn sprintf('%s : Cannot delete layout as the creator type is invalid or non-existant.', $call_type) if !$params[1];
132 my $query = "DELETE FROM creator_layouts WHERE layout_id = ? AND creator = ?";
133 my $sth = C4::Context->dbh->prepare($query);
134 $sth->execute(@params);
136 warn sprintf('Database returned the following error on attempted DELETE: %s', $sth->errstr);
143 if ($self->{'layout_id'}) { # if we have an id, the record exists and needs UPDATE
145 my $query = "UPDATE creator_layouts SET ";
146 foreach my $key (keys %{$self}) {
147 next if ($key eq 'layout_id') || ($key eq 'creator');
148 push (@params, $self->{$key});
149 $query .= "$key=?, ";
151 $query = substr($query, 0, (length($query)-2));
152 $query .= " WHERE layout_id=? AND creator = ?;";
153 push (@params, $self->{'layout_id'}, $self->{'creator'});
154 my $sth = C4::Context->dbh->prepare($query);
155 #local $sth->{TraceLevel} = "3"; # enable DBI trace and set level; outputs to STDERR
156 $sth->execute(@params);
158 warn sprintf('Database returned the following error: %s', $sth->errstr);
161 return $self->{'layout_id'};
163 else { # otherwise create a new record
165 my $query = "INSERT INTO creator_layouts (";
166 foreach my $key (keys %{$self}) {
167 push (@params, $self->{$key});
170 $query = substr($query, 0, (length($query)-2));
171 $query .= ") VALUES (";
172 for (my $i=1; $i<=(scalar keys %$self); $i++) {
175 $query = substr($query, 0, (length($query)-1));
177 my $sth = C4::Context->dbh->prepare($query);
178 $sth->execute(@params);
180 warn sprintf('Database returned the following error: %s', $sth->errstr);
183 my $sth1 = C4::Context->dbh->prepare("SELECT MAX(layout_id) FROM creator_layouts;");
185 my $id = $sth1->fetchrow_array;
186 $self->{'layout_id'} = $id;
193 if (_check_params(@_) eq 1) {
197 if (exists($self->{$attr})) {
198 return $self->{$attr};
208 if (_check_params(@_) eq 1) {
212 foreach my $attrib (keys(%attrs)) {
213 $self->{$attrib} = $attrs{$attrib};
218 sub get_text_wrap_cols {
224 my $textlimit = $params{'label_width'} - ( 3 * $params{'left_text_margin'});
226 while ($strwidth < $textlimit) {
229 $strwidth = C4::Creators::PDF->StrWidth( $string, $self->{'font'}, $self->{'font_size'} );
239 C4::Labels::Layout -A class for creating and manipulating layout objects in Koha
243 This module provides methods for creating, retrieving, and otherwise manipulating label layout objects used by Koha to create and export labels.
249 Invoking the I<new> method constructs a new layout object containing the default values for a layout.
250 The following parameters are optionally accepted as key => value pairs:
252 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:
260 CODE39MOD = Code 3 of 9 with modulo 43 checksum
263 CODE39MOD10 = Code 3 of 9 with modulo 10 checksum
266 COOP2OF5 = A varient of 2 of 5 barcode based on NEC's "Process 8000" code
269 INDUSTRIAL2OF5 = The standard 2 of 5 barcode (a binary level bar code developed by Identicon Corp. and Computer Identics Corp. in 1970)
273 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:
278 BIB = Only the bibliographic data is printed
281 BARBIB = Barcode proceeds bibliographic data
284 BIBBAR = Bibliographic data proceeds barcode
287 ALT = Barcode and bibliographic data are printed on alternating labels
290 BAR = Only the barcode is printed
294 C<layout_name> The descriptive name for this layout.
295 C<guidebox> Setting this to '1' will result in a guide box being drawn around the labels marking the edge of each label
296 C<font> Defines the type of font to be used on labels. NOTE: The following fonts are available by default on most systems:
310 TBI = Times Bold Italic
319 CO = Courier Oblique (Italic)
322 CBO = Courier Bold Oblique
331 HBO = Helvetical Bold Oblique
335 C<font_size> Defines the size of the font in postscript points to be used on labels
336 C<callnum_split> Setting this to '1' will enable call number splitting on labels
337 C<text_justify> Defines the text justification to be used on labels. NOTE: The following justification styles are currently supported by label creator code:
352 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
353 to your MARC frameworks. Specify MARC subfields as a 4-character tag-subfield string: ie. 254a Enclose a whitespace-separated list of fields
354 to concatenate on one line in double quotes. ie. "099a 099b" or "itemcallnumber barcode" Static text strings may be entered in single-quotes:
355 ie. 'Some static text here.'
358 C<my $layout = Layout->new(); # Creates and returns a new layout object>
360 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
361 the supplied values to override the defaults>
363 B<NOTE:> This layout is I<not> written to the database until save() is invoked. You have been warned!
365 =head2 retrieve(layout_id => layout_id)
367 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.
368 Errors are logged to the Apache log.
371 C<my $layout = Layout->retrieve(layout_id => 1); # Retrieves layout record 1 and returns an object containing the record>
375 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 Apache log.
376 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.
379 C<my $exitstat = $layout->delete(); # to delete the record behind the $layout object>
380 C<my $exitstat = Layout->delete(layout_id => 1); # to delete layout record 1>
384 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.
385 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 Apache log.
388 C<my $exitstat = $layout->save(); # to save the record behind the $layout object>
390 =head2 get_attr($attribute)
392 Invoking the I<get_attr> method will return the value of the requested attribute or -1 on errors.
395 C<my $value = $layout->get_attr($attribute);>
397 =head2 set_attr(attribute => value, attribute_2 => value)
399 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
403 C<$layout->set_attr(attribute => value);>
405 =head2 get_text_wrap_cols()
407 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.
410 C<my $text_wrap_cols = $layout->get_text_wrap_cols();>
414 Chris Nighswonger <cnighswonger AT foundations DOT edu>
418 Copyright 2009 Foundations Bible College.
422 This file is part of Koha.
424 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
425 Foundation; either version 2 of the License, or (at your option) any later version.
427 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,
428 Suite 330, Boston, MA 02111-1307 USA
430 =head1 DISCLAIMER OF WARRANTY
432 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
433 A PARTICULAR PURPOSE. See the GNU General Public License for more details.