1 package C4::Creators::Template;
6 use autouse 'Data::Dumper' => qw(Dumper);
10 use C4::Creators::Profile;
11 use C4::Creators::Lib qw(get_unit_values);
17 shift if $_[0] =~ m/::/; # this seems a bit hackish
18 my $given_params = {};
20 my @valid_template_params = (
44 foreach my $key (keys %{$given_params}) {
45 if (!(grep m/$key/, @valid_template_params)) {
46 warn sprintf('Unrecognized parameter type of "%s".', $key);
52 if (!(grep m/$_/, @valid_template_params)) {
53 warn sprintf('Unrecognized parameter type of "%s".', $_);
62 my @unit_value = grep {$_->{'type'} eq $self->{'units'}} @{get_unit_values()};
63 $self->{'page_width'} = $self->{'page_width'} * $unit_value[0]->{'value'};
64 $self->{'page_height'} = $self->{'page_height'} * $unit_value[0]->{'value'};
65 $self->{'label_width'} = $self->{'label_width'} * $unit_value[0]->{'value'};
66 $self->{'label_height'} = $self->{'label_height'} * $unit_value[0]->{'value'};
67 $self->{'top_text_margin'} = $self->{'top_text_margin'} * $unit_value[0]->{'value'};
68 $self->{'left_text_margin'} = $self->{'left_text_margin'} * $unit_value[0]->{'value'};
69 $self->{'top_margin'} = $self->{'top_margin'} * $unit_value[0]->{'value'};
70 $self->{'left_margin'} = $self->{'left_margin'} * $unit_value[0]->{'value'};
71 $self->{'col_gap'} = $self->{'col_gap'} * $unit_value[0]->{'value'};
72 $self->{'row_gap'} = $self->{'row_gap'} * $unit_value[0]->{'value'};
79 my $profile = C4::Creators::Profile->retrieve(profile_id => $self->{'profile_id'}, creator => $creator, convert => 1);
80 $self->{'top_margin'} = $self->{'top_margin'} + $profile->get_attr('offset_vert'); # controls vertical offset
81 $self->{'left_margin'} = $self->{'left_margin'} + $profile->get_attr('offset_horz'); # controls horizontal offset
82 $self->{'label_height'} = $self->{'label_height'} + $profile->get_attr('creep_vert'); # controls vertical creep
83 $self->{'label_width'} = $self->{'label_width'} + $profile->get_attr('creep_horz'); # controls horizontal creep
89 my $type = ref($invocant) || $invocant;
90 if (_check_params(@_) eq 1) {
95 template_code => 'DEFAULT TEMPLATE',
96 template_desc => 'Default description',
101 top_text_margin => 0,
102 left_text_margin => 0,
110 template_stat => 0, # false if any data has changed and the db has not been updated
113 bless ($self, $type);
118 my $invocant = shift;
120 my $type = ref($invocant) || $invocant;
121 my $query = "SELECT * FROM " . $opts{'table_name'} . " WHERE template_id = ? AND creator = ?";
122 my $sth = C4::Context->dbh->prepare($query);
123 $sth->execute($opts{'template_id'}, $opts{'creator'});
125 warn sprintf('Database returned the following error: %s', $sth->errstr);
128 my $self = $sth->fetchrow_hashref;
129 $self = _conv_points($self) if (($opts{convert} && $opts{convert} == 1) || $opts{profile_id});
130 $self = _apply_profile($self, $opts{'creator'}) if $opts{profile_id} && $self->{'profile_id'}; # don't bother if there is no profile_id
131 $self->{'template_stat'} = 1;
132 bless ($self, $type);
140 my @query_params = ();
142 $self = shift; # check to see if this is a method call
143 $call_type = 'C4::Labels::Template->delete';
144 push @query_params, $self->{'template_id'}, $self->{'creator'};
148 $call_type = 'C4::Labels::Template::delete';
149 push @query_params, $opts{'template_id'}, $opts{'creator'};
151 if (scalar(@query_params) < 2) { # If there is no template id or creator type then we cannot delete it
152 warn sprintf('%s : Cannot delete template as the template id is invalid or non-existent.', $call_type) if !$query_params[0];
153 warn sprintf('%s : Cannot delete template as the creator type is invalid or non-existent.', $call_type) if !$query_params[1];
156 my $query = "DELETE FROM creator_templates WHERE template_id = ? AND creator = ?";
157 my $sth = C4::Context->dbh->prepare($query);
158 $sth->execute(@query_params);
159 $self->{'template_stat'} = 0;
165 if ($self->{'template_id'}) { # if we have an template_id, the record exists and needs UPDATE
167 my $query = "UPDATE " . $opts{'table_name'} . " SET ";
168 foreach my $key (keys %{$self}) {
169 next if ($key eq 'template_id') || ($key eq 'template_stat') || ($key eq 'creator');
170 push (@params, $self->{$key});
171 $query .= "$key=?, ";
173 $query = substr($query, 0, (length($query)-2));
174 push (@params, $self->{'template_id'}, $self->{'creator'});
175 $query .= " WHERE template_id=? AND creator=?;";
176 my $sth = C4::Context->dbh->prepare($query);
177 $sth->execute(@params);
179 warn sprintf('Database returned the following error: %s', $sth->errstr);
182 $self->{'template_stat'} = 1;
183 return $self->{'template_id'};
185 else { # otherwise create a new record
187 my $query = "INSERT INTO " . $opts{'table_name'} ." (";
188 foreach my $key (keys %{$self}) {
189 next if $key eq 'template_stat';
190 push (@params, $self->{$key});
193 $query = substr($query, 0, (length($query)-2));
194 $query .= ") VALUES (";
195 for (my $i=1; $i<=((scalar keys %$self) - 1); $i++) { # key count less keys not db related...
198 $query = substr($query, 0, (length($query)-1));
200 my $sth = C4::Context->dbh->prepare($query);
201 $sth->execute(@params);
203 warn sprintf('Database returned the following error: %s', $sth->errstr);
206 my $sth1 = C4::Context->dbh->prepare("SELECT MAX(template_id) FROM " . $opts{'table_name'} . ";");
208 my $template_id = $sth1->fetchrow_array;
209 $self->{'template_id'} = $template_id;
210 $self->{'template_stat'} = 1;
217 if (_check_params(@_) eq 1) {
221 if (exists($self->{$attr})) {
222 return $self->{$attr};
231 if (_check_params(@_) eq 1) {
235 foreach my $attrib (keys(%attrs)) {
236 $self->{$attrib} = $attrs{$attrib};
240 sub get_label_position {
241 my ($self, $start_label) = @_;
242 my $current_label = $self->{'current_label'};
243 if ($start_label eq 1) {
244 $current_label->{'row_count'} = 1;
245 $current_label->{'col_count'} = 1;
246 $current_label->{'llx'} = $self->{'left_margin'};
247 $current_label->{'lly'} = ($self->{'page_height'} - $self->{'top_margin'} - $self->{'label_height'});
248 $self->{'current_label'} = $current_label;
249 return ($current_label->{'row_count'}, $current_label->{'col_count'}, $current_label->{'llx'}, $current_label->{'lly'});
252 $current_label->{'row_count'} = ceil($start_label / $self->{'cols'});
253 $current_label->{'col_count'} = ($start_label - (($current_label->{'row_count'} - 1) * $self->{'cols'}));
254 $current_label->{'llx'} = $self->{'left_margin'} + ($self->{'label_width'} * ($current_label->{'col_count'} - 1)) + ($self->{'col_gap'} * ($current_label->{'col_count'} - 1));
255 $current_label->{'lly'} = $self->{'page_height'} - $self->{'top_margin'} - ($self->{'label_height'} * $current_label->{'row_count'}) - ($self->{'row_gap'} * ($current_label->{'row_count'} - 1));
256 $self->{'current_label'} = $current_label;
257 return ($current_label->{'row_count'}, $current_label->{'col_count'}, $current_label->{'llx'}, $current_label->{'lly'});
261 sub get_next_label_pos {
263 my $current_label = $self->{'current_label'};
265 if ($current_label->{'col_count'} lt $self->get_attr('cols')) {
266 $current_label->{'llx'} = ($current_label->{'llx'} + $self->get_attr('label_width') + $self->get_attr('col_gap'));
267 $current_label->{'col_count'}++;
270 $current_label->{'llx'} = $self->get_attr('left_margin');
271 if ($current_label->{'row_count'} eq $self->get_attr('rows')) {
273 $current_label->{'lly'} = ($self->get_attr('page_height') - $self->get_attr('top_margin') - $self->get_attr('label_height'));
274 $current_label->{'row_count'} = 1;
277 $current_label->{'lly'} = ($current_label->{'lly'} - $self->get_attr('row_gap') - $self->get_attr('label_height'));
278 $current_label->{'row_count'}++;
280 $current_label->{'col_count'} = 1;
282 return ($current_label->{'llx'}, $current_label->{'lly'}, $new_page);
290 C4::Creators::Template - A class for creating and manipulating template objects in Koha
294 This module provides methods for creating, retrieving, and otherwise manipulating label template objects used by Koha.
300 Invoking the I<new> method constructs a new template object containing the default values for a template.
301 The following parameters are optionally accepted as key => value pairs:
303 C<profile_id> A valid profile id to be assciated with this template. NOTE: The profile must exist in the database and B<not> be assigned to another template.
304 C<template_code> A template code. ie. 'Avery 5160 | 1 x 2-5/8'
305 C<template_desc> A readable description of the template. ie. '3 columns, 10 rows of labels'
306 C<page_width> The width of the page measured in the units supplied by the units parameter in this template.
307 C<page_height> The height of the page measured in the same units.
308 C<label_width> The width of a single label on the page this template applies to.
309 C<label_height> The height of a single label on the page.
310 C<top_text_margin> The measure of the top margin on a single label on the page.
311 C<left_text_margin> The measure of the left margin on a single label on the page.
312 C<top_margin> The measure of the top margin of the page.
313 C<left_margin> The measure of the left margin of the page.
314 C<cols> The number of columns of labels on the page.
315 C<rows> The number of rows of labels on the page.
316 C<col_gap> The measure of the gap between the columns of labels on the page.
317 C<row_gap> The measure of the gap between the rows of labels on the page.
318 C<units> The units of measure used for this template. These B<must> match the measures you supply above or
319 bad things will happen to your document. NOTE: The only supported units at present are:
324 POINT = Postscript Points (This is the base unit in the Koha label creator.)
327 AGATE = Adobe Agates (5.1428571 points per)
330 INCH = US Inches (72 points per)
333 MM = SI Millimeters (2.83464567 points per)
336 CM = SI Centimeters (28.3464567 points per)
341 my $template = Template->new(); # Creates and returns a new template object with the defaults
343 my $template = C4::Labels::Template->new(profile_id => 1, page_width => 8.5, page_height => 11.0, units => 'INCH'); # Creates and returns a new template object using
344 the supplied values to override the defaults
346 B<NOTE:> This template is I<not> written to the database until save() is invoked. You have been warned!
348 =head2 retrieve(template_id => $template_id)
350 Invoking the I<retrieve> method constructs a new template object containing the current values for template_id. The method returns
351 a new object upon success and -1 upon failure. Errors are logged to the Apache log. Two further options may be accessed. See the example
352 below for further description.
356 C<my $template = C4::Labels::Template->retrieve(template_id => 1); # Retrieves template record 1 and returns an object containing the record>
358 C<my $template = C4::Labels::Template->retrieve(template_id => 1, convert => 1); # Retrieves template record 1, converts the units to points,
359 and returns an object containing the record>
361 C<my $template = C4::Labels::Template->retrieve(template_id => 1, profile_id => 1); # Retrieves template record 1, converts the units
362 to points, applies the currently associated profile id, and returns an object containing the record.>
366 Invoking the delete method attempts to delete the template from the database. The method returns -1 upon failure. Errors are logged to the Apache log.
367 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.
370 C<my $exitstat = $template->delete(); # to delete the record behind the $template object>
371 C<my $exitstat = C4::Labels::Template::delete(template_id => 1); # to delete template record 1>
375 Invoking the I<save> method attempts to insert the template into the database if the template is new and update the existing template record if
376 the template exists. The method returns the new record template_id upon success and -1 upon failure (This avoids template_ids conflicting with a
377 record template_id of 1). Errors are logged to the Apache log.
380 C<my $template_id = $template->save(); # to save the record behind the $template object>
382 =head2 get_attr($attribute)
384 Invoking the I<get_attr> method will return the value of the requested attribute or -1 on errors.
387 C<my $value = $template->get_attr($attribute);>
389 =head2 set_attr(attribute => value, attribute_2 => value)
391 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
395 C<$template->set_attr(attribute => value);>
397 =head2 get_label_position($start_label)
399 Invoking the I<get_label_position> method will return the row, column coordinates on the starting page and the lower left x,y coordinates on the starting
400 label for the template object.
403 C<my ($row_count, $col_count, $llx, $lly) = $template->get_label_position($start_label);>
407 Chris Nighswonger <cnighswonger AT foundations DOT edu>
411 Copyright 2009 Foundations Bible College.
415 This file is part of Koha.
417 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
418 Foundation; either version 2 of the License, or (at your option) any later version.
420 You should have received a copy of the GNU General Public License along with Koha; if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
421 Fifth Floor, Boston, MA 02110-1301 USA.
423 =head1 DISCLAIMER OF WARRANTY
425 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
426 A PARTICULAR PURPOSE. See the GNU General Public License for more details.