From 4a675bcaad41ebca8b116fd47327bc80af380098 Mon Sep 17 00:00:00 2001 From: Chris Nighswonger Date: Mon, 11 Jan 2010 10:18:21 -0500 Subject: [PATCH] [5/30] A rework of Label Creator code This rework removes code held in common with the Patron Card Creator and move is to the new C4::Creators module. --- C4/Labels/Batch.pm | 296 +------------ C4/Labels/Label.pm | 2 +- C4/Labels/Layout.pm | 412 +----------------- C4/Labels/Lib.pm | 11 +- C4/Labels/PDF.pm | 4 +- C4/Labels/Profile.pm | 348 +-------------- C4/Labels/Template.pm | 387 +--------------- .../prog/en/modules/labels/label-manage.tmpl | 4 +- .../prog/en/modules/tools/tools-home.tmpl | 12 +- labels/label-create-csv.pl | 2 +- labels/label-create-pdf.pl | 4 +- labels/label-create-xml.pl | 2 +- labels/label-edit-batch.pl | 6 +- labels/label-edit-layout.pl | 8 +- labels/label-edit-profile.pl | 10 +- labels/label-edit-template.pl | 18 +- labels/label-item-search.pl | 2 +- labels/label-manage.pl | 22 +- labels/label-print.pl | 18 +- 19 files changed, 142 insertions(+), 1426 deletions(-) diff --git a/C4/Labels/Batch.pm b/C4/Labels/Batch.pm index 8ac4f690ff..97825a2469 100644 --- a/C4/Labels/Batch.pm +++ b/C4/Labels/Batch.pm @@ -3,305 +3,45 @@ package C4::Labels::Batch; use strict; use warnings; -use C4::Context; -use C4::Debug; +use base qw(C4::Creators::Batch); + +use autouse 'Data::Dumper' => qw(Dumper); BEGIN { use version; our $VERSION = qv('1.0.0_1'); } -sub _check_params { - my $given_params = {}; - my $exit_code = 0; - my @valid_template_params = ( - 'label_id', - 'batch_id', - 'item_number', - 'branch_code', - ); - if (scalar(@_) >1) { - $given_params = {@_}; - foreach my $key (keys %{$given_params}) { - if (!(grep m/$key/, @valid_template_params)) { - warn sprintf('Unrecognized parameter type of "%s".', $key); - $exit_code = 1; - } - } - } - else { - if (!(grep m/$_/, @valid_template_params)) { - warn sprintf('Unrecognized parameter type of %s', $_); - $exit_code = 1; - } - } - return $exit_code; -} +__PACKAGE__ =~ m/^C4::(.+)::.+$/; +my $me = $1; sub new { - my ($invocant) = shift; - my $type = ref($invocant) || $invocant; - my $self = { - batch_id => 0, - items => [], - branch_code => 'NB', - batch_stat => 0, # False if any data has changed and the db has not been updated - @_, - }; - my $sth = C4::Context->dbh->prepare("SELECT MAX(batch_id) FROM labels_batches;"); - $sth->execute(); - my $batch_id = $sth->fetchrow_array; - $self->{'batch_id'} = ++$batch_id unless $self->{'batch_id'} != 0; # this allows batch_id to be passed in for individual label printing - bless ($self, $type); - return $self; -} - -sub add_item { - my $self = shift; - my $item_number = shift; - my $query = "INSERT INTO labels_batches (batch_id, item_number, branch_code) VALUES (?,?,?);"; - my $sth = C4::Context->dbh->prepare($query); -# $sth->{'TraceLevel'} = 3; - $sth->execute($self->{'batch_id'}, $item_number, $self->{'branch_code'}); - if ($sth->err) { - warn sprintf('Database returned the following error on attempted INSERT: %s', $sth->errstr); - return -1; - } - $query = "SELECT max(label_id) FROM labels_batches WHERE batch_id=? AND item_number=? AND branch_code=?;"; - my $sth1 = C4::Context->dbh->prepare($query); - $sth1->execute($self->{'batch_id'}, $item_number, $self->{'branch_code'}); - my $label_id = $sth1->fetchrow_array; - push (@{$self->{'items'}}, {item_number => $item_number, label_id => $label_id}); - $self->{'batch_stat'} = 1; - return 0; -} - -sub get_attr { my $self = shift; - return $self->{$_[0]}; + push @_, "creator", $me; + return $self->SUPER::new(@_); } -sub remove_item { +sub save { my $self = shift; - my $label_id = shift; - my $query = "DELETE FROM labels_batches WHERE label_id=? AND batch_id=?;"; - my $sth = C4::Context->dbh->prepare($query); -# $sth->{'TraceLevel'} = 3; - $sth->execute($label_id, $self->{'batch_id'}); - if ($sth->err) { - warn sprintf('Database returned the following error on attempted DELETE: %s', $sth->errstr); - return -1; - } - @{$self->{'items'}} = grep{$_->{'label_id'} != $label_id} @{$self->{'items'}}; - $self->{'batch_stat'} = 1; - return 0; + push @_, "creator", $me; + return $self->SUPER::save(@_); } -# FIXME: This method is effectively useless the way the current add_item method is written. Ideally, the items should be added to the object -# and then the save method called. This does not work well in practice due to the inability to pass objects accross cgi script calls. -# I'm leaving it here because it should be here and for consistency's sake. -cnighswonger -# -#=head2 $batch->save() -# -# Invoking the I method attempts to insert the batch into the database. The method returns -# the new record batch_id upon success and -1 upon failure (This avoids conflicting with a record -# batch_id of 1). Errors are logged to the Apache log. -# -# example: -# my $exitstat = $batch->save(); # to save the record behind the $batch object -# -#=cut -# -#sub save { -# my $self = shift; -# foreach my $item_number (@{$self->{'items'}}) { -# my $query = "INSERT INTO labels_batches (batch_id, item_number, branch_code) VALUES (?,?,?);"; -# my $sth1 = C4::Context->dbh->prepare($query); -# $sth1->execute($self->{'batch_id'}, $item_number->{'item_number'}, $self->{'branch_code'}); -# if ($sth1->err) { -# warn sprintf('Database returned the following error on attempted INSERT: %s', $sth1->errstr); -# return -1; -# } -# $self->{'batch_stat'} = 1; -# return $self->{'batch_id'}; -# } -#} - sub retrieve { - my $invocant = shift; - my %opts = @_; - my $type = ref($invocant) || $invocant; - my $record_flag = 0; - my $query = "SELECT * FROM labels_batches WHERE batch_id = ? ORDER BY label_id"; - my $sth = C4::Context->dbh->prepare($query); -# $sth->{'TraceLevel'} = 3; - $sth->execute($opts{'batch_id'}); - my $self = { - batch_id => $opts{'batch_id'}, - items => [], - }; - while (my $record = $sth->fetchrow_hashref) { - $self->{'branch_code'} = $record->{'branch_code'}; - push (@{$self->{'items'}}, {item_number => $record->{'item_number'}, label_id => $record->{'label_id'}}); - $record_flag = 1; # true if one or more rows were retrieved - } - return -2 if $record_flag == 0; # a hackish sort of way of indicating no such record exists - if ($sth->err) { - warn sprintf('Database returned the following error on attempted SELECT: %s', $sth->errstr); - return -1; - } - $self->{'batch_stat'} = 1; - bless ($self, $type); - return $self; + my $self = shift; + push @_, "creator", $me; + return $self->SUPER::retrieve(@_); } sub delete { - my $self = {}; - my %opts = (); - my $call_type = ''; - my @query_params = (); if (ref($_[0])) { - $self = shift; # check to see if this is a method call - $call_type = 'C4::Labels::Batch->delete'; - @query_params = ($self->{'batch_id'}, $self->{'branch_code'}); + my $self = shift; # check to see if this is a method call + push @_, "creator", $me; + return $self->SUPER::delete(@_); } else { - %opts = @_; - $call_type = 'C4::Labels::Batch::delete'; - @query_params = ($opts{'batch_id'}, $opts{'branch_code'}); + push @_, "creator", $me; + return __PACKAGE__->SUPER::delete(@_); # XXX: is this too hackish? } - if ($query_params[0] eq '') { # If there is no template id then we cannot delete it - warn sprtinf('%s : Cannot delete batch as the batch id is invalid or non-existent.', $call_type); - return -1; - } - my $query = "DELETE FROM labels_batches WHERE batch_id = ? AND branch_code =?"; - my $sth = C4::Context->dbh->prepare($query); -# $sth->{'TraceLevel'} = 3; - $sth->execute(@query_params); - if ($sth->err) { - warn sprintf('%s : Database returned the following error on attempted INSERT: %s', $call_type, $sth->errstr); - return -1; - } - return 0; -} - -sub remove_duplicates { - my $self = shift; - my %seen=(); - my $query = "DELETE FROM labels_batches WHERE label_id = ?;"; # ORDER BY timestamp ASC LIMIT ?;"; - my $sth = C4::Context->dbh->prepare($query); - my @duplicate_items = grep{$seen{$_->{'item_number'}}++} @{$self->{'items'}}; - foreach my $item (@duplicate_items) { - $sth->execute($item->{'label_id'}); - if ($sth->err) { - warn sprintf('Database returned the following error on attempted DELETE for label_id %s: %s', $item->{'label_id'}, $sth->errstr); - return -1; - } - $sth->finish(); # Per DBI.pm docs: "If execute() is called on a statement handle that's still active ($sth->{Active} is true) then it should effectively call finish() to tidy up the previous execution results before starting this new execution." - @{$self->{'items'}} = grep{$_->{'label_id'} != $item->{'label_id'}} @{$self->{'items'}}; # the correct label/item must be removed from the current batch object as well; this should be done *after* each sql DELETE in case the DELETE fails - } - return scalar(@duplicate_items); } 1; -__END__ - -=head1 NAME - -C4::Labels::Batch - A class for creating and manipulating batch objects in Koha - -=head1 ABSTRACT - -This module provides methods for creating, and otherwise manipulating batch objects used by Koha to create and export labels. - -=head1 METHODS - -=head2 new() - - Invoking the I method constructs a new batch object with no items. It is possible to pre-populate the batch with items and a branch code by passing them - as in the second example below. - - B The items list must be an arrayref pointing to an array of hashes containing a key/data pair after this fashion: {item_number => item_number}. The order of - the array elements determines the order of the items in the batch. - - example: - Cnew(); # Creates and returns a new batch object> - - Cnew(items => $arrayref, branch_code => branch_code) # Creates and returns a new batch object containing the items passed in - with the branch code passed in.> - - B This batch is I written to the database until C<$batch->save()> is invoked. You have been warned! - -=head2 $batch->add_item(item_number => $item_number, branch_code => $branch_code) - - Invoking the I method will add the supplied item to the batch object. - - example: - $batch->add_item(item_number => $item_number, branch_code => $branch_code); - -=head2 $batch->get_attr($attribute) - - Invoking the I method will return the requested attribute. - - example: - my @items = $batch->get_attr('items'); - -=head2 $batch->remove_item($item_number) - - Invoking the I method will remove the supplied item number from the batch object. - - example: - $batch->remove_item($item_number); - -=head2 C4::Labels::Batch->retrieve(batch_id => $batch_id) - - Invoking the I method constructs a new batch object containing the current values for batch_id. The method returns a new object upon success and 1 upon failure. - Errors are logged to the Apache log. - - examples: - - my $batch = C4::Labels::Batch->retrieve(batch_id => 1); # Retrieves batch 1 and returns an object containing the record - -=head2 delete() - - 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. - NOTE: This method may also be called as a function and passed a key/value pair simply deleteing that batch from the database. See the example below. - - examples: - my $exitstat = $batch->delete(); # to delete the record behind the $batch object - my $exitstat = C4::Labels::Batch->delete(batch_id => 1); # to delete batch 1 - -=head2 remove_duplicates() - - Invoking the remove_duplicates method attempts to remove duplicate items in the batch from the database. The method returns the count of duplicate records removed upon - success and -1 upon failure. Errors are logged to the Apache log. - NOTE: This method may also be called as a function and passed a key/value pair removing duplicates in the batch passed in. See the example below. - - examples: - my $remove_count = $batch->remove_duplicates(); # to remove duplicates the record behind the $batch object - my $remove_count = C4::Labels::Batch->remove_duplicates(batch_id => 1); # to remove duplicates in batch 1 - -=head1 AUTHOR - -Chris Nighswonger - -=head1 COPYRIGHT - -Copyright 2009 Foundations Bible College. - -=head1 LICENSE - -This file is part of Koha. - -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 -Foundation; either version 2 of the License, or (at your option) any later version. - -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, -Suite 330, Boston, MA 02111-1307 USA - -=head1 DISCLAIMER OF WARRANTY - -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 -A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -=cut - diff --git a/C4/Labels/Label.pm b/C4/Labels/Label.pm index 0e101214c2..b1c1e28926 100644 --- a/C4/Labels/Label.pm +++ b/C4/Labels/Label.pm @@ -442,7 +442,7 @@ sub draw_label_text { LABEL_LINES: # generate lines of label text for current field foreach my $line (@label_lines) { next LABEL_LINES if $line eq ''; - my $string_width = C4::Labels::PDF->StrWidth($line, $font, $self->{'font_size'}); + my $string_width = C4::Creators::PDF->StrWidth($line, $font, $self->{'font_size'}); if ($self->{'justify'} eq 'R') { $text_llx = $params{'llx'} + $self->{'width'} - ($self->{'left_text_margin'} + $string_width); } diff --git a/C4/Labels/Layout.pm b/C4/Labels/Layout.pm index da2e26f4c5..c1d749d59d 100644 --- a/C4/Labels/Layout.pm +++ b/C4/Labels/Layout.pm @@ -3,417 +3,45 @@ package C4::Labels::Layout; use strict; use warnings; -use DBI qw(neat); +use base qw(C4::Creators::Layout); -use C4::Context; -use C4::Debug; -use C4::Labels::PDF; +use autouse 'Data::Dumper' => qw(Dumper); BEGIN { use version; our $VERSION = qv('1.0.0_1'); } -# FIXME: Consider this style parameter verification instead... -# my %param = @_; -# for (keys %param) -# { my $lc = lc($_); -# if (exists $default{$lc}) -# { $default{$lc} = $param{$_}; -# } -# else -# { print STDERR "Unknown parameter $_ , not used \n"; -# } -# } - -sub _check_params { - my $exit_code = 0; - my @valtmpl_id_params = ( - 'barcode_type', - 'printing_type', - 'layout_name', - 'guidebox', - 'font', - 'font_size', - 'callnum_split', - 'text_justify', - 'format_string', - ); - if (scalar(@_) >1) { - my %given_params = @_; - foreach my $key (keys %given_params) { - if (!(grep m/$key/, @valtmpl_id_params)) { - warn sprintf('(Multiple parameters) Unrecognized parameter type of "%s".', $key); - $exit_code = 1; - } - } - } - else { - if (!(grep m/$_/, @valtmpl_id_params)) { - warn sprintf('(Single parameter) Unrecognized parameter type of "%s".', $_); - $exit_code = 1; - } - } - return $exit_code; -} +__PACKAGE__ =~ m/^C4::(.+)::.+$/; +my $me = $1; sub new { - my $invocant = shift; - if (_check_params(@_) eq 1) { - return -1; - } - my $type = ref($invocant) || $invocant; - my $self = { - barcode_type => 'CODE39', - printing_type => 'BAR', - layout_name => 'DEFAULT', - guidebox => 0, - font => 'TR', - font_size => 3, - callnum_split => 0, - text_justify => 'L', - format_string => 'title, author, isbn, issn, itemtype, barcode, callnumber', - @_, - }; - bless ($self, $type); - return $self; -} - -sub retrieve { - my $invocant = shift; - my %opts = @_; - my $type = ref($invocant) || $invocant; - my $query = "SELECT * FROM labels_layouts WHERE layout_id = ?"; - my $sth = C4::Context->dbh->prepare($query); - $sth->execute($opts{'layout_id'}); - if ($sth->err) { - warn sprintf('Database returned the following error: %s', $sth->errstr); - return -1; - } - my $self = $sth->fetchrow_hashref; - bless ($self, $type); - return $self; -} - -sub delete { - my $self = {}; - my %opts = (); - my $call_type = ''; - my $query_param = ''; - if (ref($_[0])) { - $self = shift; # check to see if this is a method call - $call_type = 'C4::Labels::Layout->delete'; - $query_param = $self->{'layout_id'}; - } - else { - %opts = @_; - $call_type = 'C4::Labels::Layout::delete'; - $query_param = $opts{'layout_id'}; - } - if ($query_param eq '') { # If there is no layout id then we cannot delete it - warn sprintf('%s : Cannot delete layout as the layout id is invalid or non-existant.', $call_type); - return -1; - } - my $query = "DELETE FROM labels_layouts WHERE layout_id = ?"; - my $sth = C4::Context->dbh->prepare($query); - $sth->execute($query_param); - if ($sth->err) { - warn sprintf('%s : Database returned the following error: %s', $call_type, $sth->errstr); - return -1; - } - return 0; + my $self = shift; + push @_, "creator", $me; + return $self->SUPER::new(@_); } sub save { my $self = shift; - if ($self->{'layout_id'}) { # if we have an id, the record exists and needs UPDATE - my @params; - my $query = "UPDATE labels_layouts SET "; - foreach my $key (keys %{$self}) { - next if $key eq 'layout_id'; - push (@params, $self->{$key}); - $query .= "$key=?, "; - } - $query = substr($query, 0, (length($query)-2)); - $query .= " WHERE layout_id=?;"; - push (@params, $self->{'layout_id'}); - my $sth = C4::Context->dbh->prepare($query); - #local $sth->{TraceLevel} = "3"; # enable DBI trace and set level; outputs to STDERR - $sth->execute(@params); - if ($sth->err) { - warn sprintf('Database returned the following error: %s', $sth->errstr); - return -1; - } - return $self->{'layout_id'}; - } - else { # otherwise create a new record - my @params; - my $query = "INSERT INTO labels_layouts ("; - foreach my $key (keys %{$self}) { - push (@params, $self->{$key}); - $query .= "$key, "; - } - $query = substr($query, 0, (length($query)-2)); - $query .= ") VALUES ("; - for (my $i=1; $i<=(scalar keys %$self); $i++) { - $query .= "?,"; - } - $query = substr($query, 0, (length($query)-1)); - $query .= ");"; - my $sth = C4::Context->dbh->prepare($query); - $sth->execute(@params); - if ($sth->err) { - warn sprintf('Database returned the following error: %s', $sth->errstr); - return -1; - } - my $sth1 = C4::Context->dbh->prepare("SELECT MAX(layout_id) FROM labels_layouts;"); - $sth1->execute(); - my $id = $sth1->fetchrow_array; - return $id; - } + push @_, "creator", $me; + return $self->SUPER::save(@_); } -sub get_attr { +sub retrieve { my $self = shift; - if (_check_params(@_) eq 1) { - return -1; - } - my ($attr) = @_; - if (exists($self->{$attr})) { - return $self->{$attr}; - } - else { - return -1; - } - return; + push @_, "creator", $me; + return $self->SUPER::retrieve(@_); } -sub set_attr { - my $self = shift; - if (_check_params(@_) eq 1) { - return -1; +sub delete { + if (ref($_[0])) { + my $self = shift; # check to see if this is a method call + push @_, "creator", $me; + return $self->SUPER::delete(@_); } - my %attrs = @_; - foreach my $attrib (keys(%attrs)) { - $self->{$attrib} = $attrs{$attrib}; - }; - return 0; -} - -sub get_text_wrap_cols { - my $self = shift; - my %params = @_; - my $string = ''; - my $strwidth = 0; - my $col_count = 0; - my $textlimit = $params{'label_width'} - ( 3 * $params{'left_text_margin'}); - - while ($strwidth < $textlimit) { - $string .= '0'; - $col_count++; - $strwidth = C4::Labels::PDF->StrWidth( $string, $self->{'font'}, $self->{'font_size'} ); + else { + push @_, "creator", $me; + return __PACKAGE__->SUPER::delete(@_); # XXX: is this too hackish? } - return $col_count; } 1; -__END__ - -=head1 NAME - -C4::Labels::Layout -A class for creating and manipulating layout objects in Koha - -=head1 ABSTRACT - -This module provides methods for creating, retrieving, and otherwise manipulating label layout objects used by Koha to create and export labels. - -=head1 METHODS - -=head2 new() - - Invoking the I method constructs a new layout object containing the default values for a layout. - The following parameters are optionally accepted as key => value pairs: - - C Defines the barcode type to be used on labels. NOTE: At present only the following barcode types are supported in the label creator code: - -=over 9 - -=item . - CODE39 = Code 3 of 9 - -=item . - CODE39MOD = Code 3 of 9 with modulo 43 checksum - -=item . - CODE39MOD10 = Code 3 of 9 with modulo 10 checksum - -=item . - COOP2OF5 = A varient of 2 of 5 barcode based on NEC's "Process 8000" code - -=item . - INDUSTRIAL2OF5 = The standard 2 of 5 barcode (a binary level bar code developed by Identicon Corp. and Computer Identics Corp. in 1970) - -=back - - C Defines the general layout to be used on labels. NOTE: At present there are only five printing types supported in the label creator code: - -=over 9 - -=item . -BIB = Only the bibliographic data is printed - -=item . -BARBIB = Barcode proceeds bibliographic data - -=item . -BIBBAR = Bibliographic data proceeds barcode - -=item . -ALT = Barcode and bibliographic data are printed on alternating labels - -=item . -BAR = Only the barcode is printed - -=back - - C The descriptive name for this layout. - C Setting this to '1' will result in a guide box being drawn around the labels marking the edge of each label - C Defines the type of font to be used on labels. NOTE: The following fonts are available by default on most systems: - -=over 9 - -=item . -TR = Times-Roman - -=item . -TB = Times Bold - -=item . -TI = Times Italic - -=item . -TBI = Times Bold Italic - -=item . -C = Courier - -=item . -CB = Courier Bold - -=item . -CO = Courier Oblique (Italic) - -=item . -CBO = Courier Bold Oblique - -=item . -H = Helvetica - -=item . -HB = Helvetica Bold - -=item . -HBO = Helvetical Bold Oblique - -=back - - C Defines the size of the font in postscript points to be used on labels - C Setting this to '1' will enable call number splitting on labels - C Defines the text justification to be used on labels. NOTE: The following justification styles are currently supported by label creator code: - -=over 9 - -=item . -L = Left - -=item . -C = Center - -=item . -R = Right - -=back - - C 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 - to your MARC frameworks. Specify MARC subfields as a 4-character tag-subfield string: ie. 254a Enclose a whitespace-separated list of fields - to concatenate on one line in double quotes. ie. "099a 099b" or "itemcallnumber barcode" Static text strings may be entered in single-quotes: - ie. 'Some static text here.' - - example: - Cnew(); # Creates and returns a new layout object> - - Cnew(barcode_type => 'CODE39', printing_type => 'BIBBAR', font => 'C', font_size => 6); # Creates and returns a new layout object using - the supplied values to override the defaults> - - B This layout is I written to the database until save() is invoked. You have been warned! - -=head2 retrieve(layout_id => layout_id) - - Invoking the I 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. - Errors are logged to the Apache log. - - example: - Cretrieve(layout_id => 1); # Retrieves layout record 1 and returns an object containing the record> - -=head2 delete() - - 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. - 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. - - examples: - Cdelete(); # to delete the record behind the $layout object> - Cdelete(layout_id => 1); # to delete layout record 1> - -=head2 save() - - Invoking the I method attempts to insert the layout into the database if the layout is new and update the existing layout record if the layout exists. - 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. - - example: - Csave(); # to save the record behind the $layout object> - -=head2 get_attr($attribute) - - Invoking the I method will return the value of the requested attribute or -1 on errors. - - example: - Cget_attr($attribute);> - -=head2 set_attr(attribute => value, attribute_2 => value) - - Invoking the I method will set the value of the supplied attributes to the supplied values. The method accepts key/value pairs separated by - commas. - - example: - C<$layout->set_attr(attribute => value);> - -=head2 get_text_wrap_cols() - - Invoking the I method will return the number of columns that can be printed on the label before wrapping to the next line. - - examples: - Cget_text_wrap_cols();> - -=head1 AUTHOR - -Chris Nighswonger - -=head1 COPYRIGHT - -Copyright 2009 Foundations Bible College. - -=head1 LICENSE - -This file is part of Koha. - -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 -Foundation; either version 2 of the License, or (at your option) any later version. - -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, -Suite 330, Boston, MA 02111-1307 USA - -=head1 DISCLAIMER OF WARRANTY - -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 -A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -=cut diff --git a/C4/Labels/Lib.pm b/C4/Labels/Lib.pm index 2229c60359..2dde0a2ded 100644 --- a/C4/Labels/Lib.pm +++ b/C4/Labels/Lib.pm @@ -3,7 +3,7 @@ package C4::Labels::Lib; # Copyright 2009 Foundations Bible College. # # This file is part of Koha. -# +# # 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 # Foundation; either version 2 of the License, or (at your option) any later @@ -20,7 +20,7 @@ package C4::Labels::Lib; use strict; use warnings; -use Data::Dumper; +use autouse 'Data::Dumper' => qw(Dumper); use C4::Context; use C4::Debug; @@ -115,7 +115,7 @@ my $text_justification_types = [ {type => 'L', name => 'Left', selected => 0}, {type => 'C', name => 'Center', selected => 0}, {type => 'R', name => 'Right', selected => 0}, -# {type => 'F', name => 'Full', selected => 0}, +# {type => 'F', name => 'Full', selected => 0}, ]; my $unit_values = [ @@ -226,7 +226,7 @@ sub get_all_profiles { 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.' examples: @@ -269,7 +269,7 @@ sub get_batch_summary { 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.' examples: @@ -445,7 +445,6 @@ sub html_table { return undef if scalar(@$data) == 0; # no need to generate a table if there is not data to display my $table = []; my $fields = []; - my @headers = (); my @table_columns = (); my ($row_index, $col_index) = (0,0); my $cols = 0; # number of columns to wrap on diff --git a/C4/Labels/PDF.pm b/C4/Labels/PDF.pm index b661d45046..ccee175c29 100644 --- a/C4/Labels/PDF.pm +++ b/C4/Labels/PDF.pm @@ -137,8 +137,8 @@ sub Init { sub Jpeg { my $self = shift; - my ($imageFile, $width, $height) = @_; - return prJpeg($imageFile, $width, $height); + my ($imageData, $width, $height, $imageFormat) = @_; + return prJpeg($imageData, $width, $height, $imageFormat); } sub Js { diff --git a/C4/Labels/Profile.pm b/C4/Labels/Profile.pm index bfaae55ad2..77926837ea 100644 --- a/C4/Labels/Profile.pm +++ b/C4/Labels/Profile.pm @@ -3,353 +3,45 @@ package C4::Labels::Profile; use strict; use warnings; -use C4::Context; -use C4::Debug; -use C4::Labels::Lib 1.000000 qw(get_unit_values); +use base qw(C4::Creators::Profile); + +use autouse 'Data::Dumper' => qw(Dumper); BEGIN { use version; our $VERSION = qv('1.0.0_1'); } -sub _check_params { - my $given_params = {}; - my $exit_code = 0; - my @valid_profile_params = ( - 'printer_name', - 'template_id', - 'paper_bin', - 'offset_horz', - 'offset_vert', - 'creep_horz', - 'creep_vert', - 'units', - ); - if (scalar(@_) >1) { - $given_params = {@_}; - foreach my $key (keys %{$given_params}) { - if (!(grep m/$key/, @valid_profile_params)) { - warn sprintf('Unrecognized parameter type of "%s".', $key); - $exit_code = 1; - } - } - } - else { - if (!(grep m/$_/, @valid_profile_params)) { - warn sprintf('Unrecognized parameter type of "%s".', $_); - $exit_code = 1; - } - } - return $exit_code; -} +__PACKAGE__ =~ m/^C4::(.+)::.+$/; +my $me = $1; -sub _conv_points { +sub new { my $self = shift; - my @unit_value = grep {$_->{'type'} eq $self->{units}} @{get_unit_values()}; - $self->{offset_horz} = $self->{offset_horz} * $unit_value[0]->{'value'}; - $self->{offset_vert} = $self->{offset_vert} * $unit_value[0]->{'value'}; - $self->{creep_horz} = $self->{creep_horz} * $unit_value[0]->{'value'}; - $self->{creep_vert} = $self->{creep_vert} * $unit_value[0]->{'value'}; - return $self; + push @_, "creator", $me; + return $self->SUPER::new(@_); } -sub new { - my $invocant = shift; - if (_check_params(@_) eq 1) { - return -1; - } - my $type = ref($invocant) || $invocant; - my $self = { - printer_name => 'Default Printer', - template_id => '', - paper_bin => 'Tray 1', - offset_horz => 0, - offset_vert => 0, - creep_horz => 0, - creep_vert => 0, - units => 'POINT', - @_, - }; - bless ($self, $type); - return $self; +sub save { + my $self = shift; + push @_, "creator", $me; + return $self->SUPER::save(@_); } sub retrieve { - my $invocant = shift; - my %opts = @_; - my $type = ref($invocant) || $invocant; - my $query = "SELECT * FROM printers_profile WHERE profile_id = ?"; - my $sth = C4::Context->dbh->prepare($query); - $sth->execute($opts{profile_id}); - if ($sth->err) { - warn sprintf('Database returned the following error: %s', $sth->errstr); - return -1; - } - my $self = $sth->fetchrow_hashref; - $self = _conv_points($self) if ($opts{convert} && $opts{convert} == 1); - bless ($self, $type); - return $self; + my $self = shift; + push @_, "creator", $me; + return $self->SUPER::retrieve(@_); } sub delete { - my $self = {}; - my %opts = (); - my $call_type = ''; - my $query_param = ''; if (ref($_[0])) { - $self = shift; # check to see if this is a method call - $call_type = 'C4::Labels::Profile->delete'; - $query_param = $self->{'profile_id'}; + my $self = shift; # check to see if this is a method call + push @_, "creator", $me; + return $self->SUPER::delete(@_); } else { - %opts = @_; - $call_type = 'C4::Labels::Profile::delete'; - $query_param = $opts{'profile_id'}; - } - if ($query_param eq '') { # If there is no profile id then we cannot delete it - warn sprintf('%s : Cannot delete layout as the profile id is invalid or non-existant.', $call_type); - return -1; - } - my $query = "DELETE FROM printers_profile WHERE profile_id = ?"; - my $sth = C4::Context->dbh->prepare($query); -# $sth->{'TraceLevel'} = 3; - $sth->execute($query_param); -} - -sub save { - my $self = shift; - if ($self->{'profile_id'}) { # if we have an profile_id, the record exists and needs UPDATE - my @params; - my $query = "UPDATE printers_profile SET "; - foreach my $key (keys %{$self}) { - next if $key eq 'profile_id'; - push (@params, $self->{$key}); - $query .= "$key=?, "; - } - $query = substr($query, 0, (length($query)-2)); - push (@params, $self->{'profile_id'}); - $query .= " WHERE profile_id=?;"; - my $sth = C4::Context->dbh->prepare($query); -# $sth->{'TraceLevel'} = 3; - $sth->execute(@params); - if ($sth->err) { - warn sprintf('Database returned the following error on attempted UPDATE: %s', $sth->errstr); - return -1; - } - return $self->{'profile_id'}; - } - else { # otherwise create a new record - my @params; - my $query = "INSERT INTO printers_profile ("; - foreach my $key (keys %{$self}) { - push (@params, $self->{$key}); - $query .= "$key, "; - } - $query = substr($query, 0, (length($query)-2)); - $query .= ") VALUES ("; - for (my $i=1; $i<=(scalar keys %$self); $i++) { - $query .= "?,"; - } - $query = substr($query, 0, (length($query)-1)); - $query .= ");"; - my $sth = C4::Context->dbh->prepare($query); - $sth->execute(@params); - if ($sth->err) { - warn sprintf('Database returned the following error on attempted INSERT: %s', $sth->errstr); - return -1; - } - my $sth1 = C4::Context->dbh->prepare("SELECT MAX(profile_id) FROM printers_profile;"); - $sth1->execute(); - my $tmpl_id = $sth1->fetchrow_array; - return $tmpl_id; + push @_, "creator", $me; + return __PACKAGE__->SUPER::delete(@_); # XXX: is this too hackish? } } -sub get_attr { - my $self = shift; - if (_check_params(@_) eq 1) { - return -1; - } - my ($attr) = @_; - if (exists($self->{$attr})) { - return $self->{$attr}; - } - else { - warn sprintf('%s is currently undefined.', $attr); - return -1; - } -} - -sub set_attr { - my $self = shift; - if (_check_params(@_) eq 1) { - return -1; - } - my %attrs = @_; - foreach my $attrib (keys(%attrs)) { - $self->{$attrib} = $attrs{$attrib}; - }; - return 0; -} - 1; -__END__ - -=head1 NAME - -C4::Labels::Profile - A class for creating and manipulating profile objects in Koha - -=head1 ABSTRACT - -This module provides methods for creating, retrieving, and otherwise manipulating label profile objects used by Koha to create and export labels. - -=head1 METHODS - -=head2 new() - - Invoking the I method constructs a new profile object containing the default values for a template. - The following parameters are optionally accepted as key => value pairs: - - C The name of the printer to which this profile applies. - C The template to which this profile may be applied. NOTE: There may be multiple profiles which may be applied to the same template. - C The paper bin of the above printer to which this profile applies. NOTE: printer name, template id, and paper bin must form a unique combination. - C Amount of compensation for horizontal offset (position of text on a single label). This amount is measured in the units supplied by the units parameter in this profile. - C Amount of compensation for vertical offset. - C Amount of compensation for horizontal creep (tendency of text to 'creep' off of the labels over the span of the entire page). - C Amount of compensation for vertical creep. - C The units of measure used for this template. These B match the measures you supply above or - bad things will happen to your document. NOTE: The only supported units at present are: - -=over 9 - -=item . -POINT = Postscript Points (This is the base unit in the Koha label creator.) - -=item . -AGATE = Adobe Agates (5.1428571 points per) - -=item . -INCH = US Inches (72 points per) - -=item . -MM = SI Millimeters (2.83464567 points per) - -=item . -CM = SI Centimeters (28.3464567 points per) - -=back - - example: - Cnew(); # Creates and returns a new profile object> - - Cnew(template_id => 1, paper_bin => 'Bypass Tray', offset_horz => 0.02, units => 'POINT'); # Creates and returns a new profile object using - the supplied values to override the defaults> - - B This profile is I written to the database until save() is invoked. You have been warned! - -=head2 retrieve(profile_id => $profile_id, convert => 1) - - Invoking the I method constructs a new profile object containing the current values for profile_id. The method returns a new object upon success and 1 upon failure. - Errors are logged to the Apache log. One further option maybe accessed. See the examples below for further description. - - examples: - - Cretrieve(profile_id => 1); # Retrieves profile record 1 and returns an object containing the record> - - Cretrieve(profile_id => 1, convert => 1); # Retrieves profile record 1, converts the units to points and returns an object containing the record> - -=head2 delete() - - Invoking the delete method attempts to delete the profile from the database. The method returns -1 upon failure. Errors are logged to the Apache log. - NOTE: This method may also be called as a function and passed a key/value pair simply deleteing that profile from the database. See the example below. - - examples: - Cdelete(); # to delete the record behind the $profile object> - C 1); # to delete profile record 1> - -=head2 save() - - Invoking the I method attempts to insert the profile into the database if the profile is new and update the existing profile record if the profile exists. The method returns - the new record profile_id upon success and -1 upon failure (This avoids conflicting with a record profile_id of 1). Errors are logged to the Apache log. - - example: - Csave(); # to save the record behind the $profile object> - -=head2 get_attr($attribute) - - Invoking the I method will return the value of the requested attribute or -1 on errors. - - example: - Cget_attr($attribute);> - -=head2 set_attr(attribute => value, attribute_2 => value) - - Invoking the I method will set the value of the supplied attributes to the supplied values. The method accepts key/value pairs separated by commas. - - example: - $profile->set_attr(attribute => value); - -=head1 AUTHOR - -Chris Nighswonger - -=head1 COPYRIGHT - -Copyright 2009 Foundations Bible College. - -=head1 LICENSE - -This file is part of Koha. - -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 -Foundation; either version 2 of the License, or (at your option) any later version. - -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, -Suite 330, Boston, MA 02111-1307 USA - -=head1 DISCLAIMER OF WARRANTY - -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 -A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -=cut - -#=head1 -#drawbox( ($left_margin), ($top_margin), ($page_width-(2*$left_margin)), ($page_height-(2*$top_margin)) ); # FIXME: Breakout code to print alignment page for printer profile setup -# -#=head2 draw_boundaries -# -# sub draw_boundaries ($llx_spine, $llx_circ1, $llx_circ2, -# $lly, $spine_width, $label_height, $circ_width) -# -#This sub draws boundary lines where the label outlines are, to aid in printer testing, and debugging. -# -#=cut -# -## FIXME: Template use for profile adjustment... -##sub draw_boundaries { -## -## my ( -## $llx_spine, $llx_circ1, $llx_circ2, $lly, -## $spine_width, $label_height, $circ_width -## ) = @_; -## -## my $lly_initial = ( ( 792 - 36 ) - 90 ); -## $lly = $lly_initial; # FIXME - why are we ignoring the y_pos parameter by redefining it? -## my $i = 1; -## -## for ( $i = 1 ; $i <= 8 ; $i++ ) { -## -## _draw_box( $llx_spine, $lly, ($spine_width), ($label_height) ); -## -## #warn "OLD BOXES x=$llx_spine, y=$lly, w=$spine_width, h=$label_height"; -## _draw_box( $llx_circ1, $lly, ($circ_width), ($label_height) ); -## _draw_box( $llx_circ2, $lly, ($circ_width), ($label_height) ); -## -## $lly = ( $lly - $label_height ); -## -## } -##} -# -# -# -#=cut diff --git a/C4/Labels/Template.pm b/C4/Labels/Template.pm index 61751f95c0..7564d1dc85 100644 --- a/C4/Labels/Template.pm +++ b/C4/Labels/Template.pm @@ -2,395 +2,42 @@ package C4::Labels::Template; use strict; use warnings; -use PDF::Reuse; -use POSIX qw(ceil); -use C4::Context; -use C4::Debug; -use C4::Labels::Profile 1.000000; -use C4::Labels::PDF 1.000000; -use C4::Labels::Lib 1.000000 qw(get_unit_values); +use base qw(C4::Creators::Template); + +use autouse 'Data::Dumper' => qw(Dumper); BEGIN { use version; our $VERSION = qv('1.0.0_1'); } -sub _check_params { - my $given_params = {}; - my $exit_code = 0; - my @valid_template_params = ( - 'profile_id', - 'template_code', - 'template_desc', - 'page_width', - 'page_height', - 'label_width', - 'label_height', - 'top_text_margin', - 'left_text_margin', - 'top_margin', - 'left_margin', - 'cols', - 'rows', - 'col_gap', - 'row_gap', - 'units', - ); - if (scalar(@_) >1) { - $given_params = {@_}; - foreach my $key (keys %{$given_params}) { - if (!(grep m/$key/, @valid_template_params)) { - warn sprintf('Unrecognized parameter type of "%s".', $key); - $exit_code = 1; - } - } - } - else { - if (!(grep m/$_/, @valid_template_params)) { - warn sprintf('Unrecognized parameter type of "%s".', $_); - $exit_code = 1; - } - } - return $exit_code; -} +use constant TEMPLATE_TABLE => 'creator_templates'; -sub _conv_points { - my $self = shift; - my @unit_value = grep {$_->{'type'} eq $self->{'units'}} @{get_unit_values()}; - $self->{'page_width'} = $self->{'page_width'} * $unit_value[0]->{'value'}; - $self->{'page_height'} = $self->{'page_height'} * $unit_value[0]->{'value'}; - $self->{'label_width'} = $self->{'label_width'} * $unit_value[0]->{'value'}; - $self->{'label_height'} = $self->{'label_height'} * $unit_value[0]->{'value'}; - $self->{'top_text_margin'} = $self->{'top_text_margin'} * $unit_value[0]->{'value'}; - $self->{'left_text_margin'} = $self->{'left_text_margin'} * $unit_value[0]->{'value'}; - $self->{'top_margin'} = $self->{'top_margin'} * $unit_value[0]->{'value'}; - $self->{'left_margin'} = $self->{'left_margin'} * $unit_value[0]->{'value'}; - $self->{'col_gap'} = $self->{'col_gap'} * $unit_value[0]->{'value'}; - $self->{'row_gap'} = $self->{'row_gap'} * $unit_value[0]->{'value'}; - return $self; -} - -sub _apply_profile { - my $self = shift; - my $profile = C4::Labels::Profile->retrieve(profile_id => $self->{'profile_id'}, convert => 1); - $self->{'top_margin'} = $self->{'top_margin'} + $profile->get_attr('offset_vert'); # controls vertical offset - $self->{'left_margin'} = $self->{'left_margin'} + $profile->get_attr('offset_horz'); # controls horizontal offset - $self->{'label_height'} = $self->{'label_height'} + $profile->get_attr('creep_vert'); # controls vertical creep - $self->{'label_width'} = $self->{'label_width'} + $profile->get_attr('creep_horz'); # controls horizontal creep - return $self; -} +__PACKAGE__ =~ m/^C4::(.+)::.+$/; +my $me = $1; sub new { - my $invocant = shift; - if (_check_params(@_) eq 1) { - return -1; - } - my $type = ref($invocant) || $invocant; - my $self = { - profile_id => '0', - template_code => 'DEFAULT TEMPLATE', - template_desc => 'Default description', - page_width => 0, - page_height => 0, - label_width => 0, - label_height => 0, - top_text_margin => 0, - left_text_margin => 0, - top_margin => 0, - left_margin => 0, - cols => 0, - rows => 0, - col_gap => 0, - row_gap => 0, - units => 'POINT', - template_stat => 0, # false if any data has changed and the db has not been updated - @_, - }; - bless ($self, $type); - return $self; + my $self = shift; + push @_, "creator", $me; + return $self->SUPER::new(@_); } sub retrieve { - my $invocant = shift; - my %opts = @_; - my $type = ref($invocant) || $invocant; - my $query = "SELECT * FROM labels_templates WHERE template_id = ?"; - my $sth = C4::Context->dbh->prepare($query); - $sth->execute($opts{template_id}); - if ($sth->err) { - warn sprintf('Database returned the following error: %s', $sth->errstr); - return -1; - } - my $self = $sth->fetchrow_hashref; - $self = _conv_points($self) if (($opts{convert} && $opts{convert} == 1) || $opts{profile_id}); - $self = _apply_profile($self) if $opts{profile_id} && $self->{'profile_id'}; # don't bother if there is no profile_id - $self->{'template_stat'} = 1; - bless ($self, $type); - return $self; -} - -sub delete { - my $self = {}; - my %opts = (); - my $call_type = ''; - my $query_param = ''; - if (ref($_[0])) { - $self = shift; # check to see if this is a method call - $call_type = 'C4::Labels::Template->delete'; - $query_param = $self->{'template_id'}; - } - else { - %opts = @_; - $call_type = 'C4::Labels::Template::delete'; - $query_param = $opts{'template_id'}; - } - if ($query_param eq '') { # If there is no template id then we cannot delete it - warn sprintf('%s : Cannot delete layout as the template id is invalid or non-existant.', $call_type); - return -1; - } - my $query = "DELETE FROM labels_templates WHERE template_id = ?"; - my $sth = C4::Context->dbh->prepare($query); - $sth->execute($query_param); - $self->{'template_stat'} = 0; -} - -sub save { my $self = shift; - if ($self->{'template_id'}) { # if we have an template_id, the record exists and needs UPDATE - my @params; - my $query = "UPDATE labels_templates SET "; - foreach my $key (keys %{$self}) { - next if ($key eq 'template_id') || ($key eq 'template_stat'); - push (@params, $self->{$key}); - $query .= "$key=?, "; - } - $query = substr($query, 0, (length($query)-2)); - push (@params, $self->{'template_id'}); - $query .= " WHERE template_id=?;"; - my $sth = C4::Context->dbh->prepare($query); - $sth->execute(@params); - if ($sth->err) { - warn sprintf('Database returned the following error: %s', $sth->errstr); - return -1; - } - $self->{'template_stat'} = 1; - return $self->{'template_id'}; - } - else { # otherwise create a new record - my @params; - my $query = "INSERT INTO labels_templates ("; - foreach my $key (keys %{$self}) { - next if $key eq 'template_stat'; - push (@params, $self->{$key}); - $query .= "$key, "; - } - $query = substr($query, 0, (length($query)-2)); - $query .= ") VALUES ("; - for (my $i=1; $i<=((scalar keys %$self) - 1); $i++) { # key count less keys not db related... - $query .= "?,"; - } - $query = substr($query, 0, (length($query)-1)); - $query .= ");"; - my $sth = C4::Context->dbh->prepare($query); - $sth->execute(@params); - if ($sth->err) { - warn sprintf('Database returned the following error: %s', $sth->errstr); - return -1; - } - my $sth1 = C4::Context->dbh->prepare("SELECT MAX(template_id) FROM labels_templates;"); - $sth1->execute(); - my $template_id = $sth1->fetchrow_array; - $self->{'template_id'} = $template_id; - $self->{'template_stat'} = 1; - return $template_id; - } + push @_, "table_name", TEMPLATE_TABLE, "creator", $me; + return $self->SUPER::retrieve(@_); } -sub get_attr { +sub delete { my $self = shift; - if (_check_params(@_) eq 1) { - return -1; - } - my ($attr) = @_; - if (exists($self->{$attr})) { - return $self->{$attr}; - } - else { - return -1; - } + push @_, "table_name", TEMPLATE_TABLE, "creator", $me; + return $self->SUPER::delete(@_); } -sub set_attr { +sub save { my $self = shift; - if (_check_params(@_) eq 1) { - return -1; - } - my %attrs = @_; - foreach my $attrib (keys(%attrs)) { - $self->{$attrib} = $attrs{$attrib}; - }; -} - -sub get_label_position { - my ($self, $start_label) = @_; - my ($row_count, $col_count, $llx, $lly) = 0,0,0,0; - if ($start_label eq 1) { - $row_count = 1; - $col_count = 1; - $llx = $self->{'left_margin'}; - $lly = ($self->{'page_height'} - $self->{'top_margin'} - $self->{'label_height'}); - return ($row_count, $col_count, $llx, $lly); - } - else { - $row_count = ceil($start_label / $self->{'cols'}); - $col_count = ($start_label - (($row_count - 1) * $self->{'cols'})); - $llx = $self->{'left_margin'} + ($self->{'label_width'} * ($col_count - 1)) + ($self->{'col_gap'} * ($col_count - 1)); - $lly = $self->{'page_height'} - $self->{'top_margin'} - ($self->{'label_height'} * $row_count) - ($self->{'row_gap'} * ($row_count - 1)); - return ($row_count, $col_count, $llx, $lly); - } + push @_, "table_name", TEMPLATE_TABLE, "creator", $me; + return $self->SUPER::save(@_); } 1; -__END__ - -=head1 NAME - -C4::Labels::Template - A class for creating and manipulating template objects in Koha - -=head1 ABSTRACT - -This module provides methods for creating, retrieving, and otherwise manipulating label template objects used by Koha to create and export labels. - -=head1 METHODS - -=head2 new() - - Invoking the I method constructs a new template object containing the default values for a template. - The following parameters are optionally accepted as key => value pairs: - - C A valid profile id to be assciated with this template. NOTE: The profile must exist in the database and B be assigned to another template. - C A template code. ie. 'Avery 5160 | 1 x 2-5/8' - C A readable description of the template. ie. '3 columns, 10 rows of labels' - C The width of the page measured in the units supplied by the units parameter in this template. - C The height of the page measured in the same units. - C The width of a single label on the page this template applies to. - C The height of a single label on the page. - C The measure of the top margin on a single label on the page. - C The measure of the left margin on a single label on the page. - C The measure of the top margin of the page. - C The measure of the left margin of the page. - C The number of columns of labels on the page. - C The number of rows of labels on the page. - C The measure of the gap between the columns of labels on the page. - C The measure of the gap between the rows of labels on the page. - C The units of measure used for this template. These B match the measures you supply above or - bad things will happen to your document. NOTE: The only supported units at present are: - -=over 9 - -=item . -POINT = Postscript Points (This is the base unit in the Koha label creator.) - -=item . -AGATE = Adobe Agates (5.1428571 points per) - -=item . -INCH = US Inches (72 points per) - -=item . -MM = SI Millimeters (2.83464567 points per) - -=item . -CM = SI Centimeters (28.3464567 points per) - -=back - - example: - my $template = Template->new(); # Creates and returns a new template object with the defaults - - 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 - the supplied values to override the defaults - - B This template is I written to the database untill save() is invoked. You have been warned! - -=head2 retrieve(template_id => $template_id) - - Invoking the I method constructs a new template object containing the current values for template_id. The method returns - 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 - below for further description. - - examples: - - Cretrieve(template_id => 1); # Retrieves template record 1 and returns an object containing the record> - - Cretrieve(template_id => 1, convert => 1); # Retrieves template record 1, converts the units to points, - and returns an object containing the record> - - Cretrieve(template_id => 1, profile_id => 1); # Retrieves template record 1, converts the units - to points, applies the currently associated profile id, and returns an object containing the record.> - -=head2 delete() - - 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. - 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. - - examples: - Cdelete(); # to delete the record behind the $template object> - C 1); # to delete template record 1> - -=head2 save() - - Invoking the I method attempts to insert the template into the database if the template is new and update the existing template record if - the template exists. The method returns the new record template_id upon success and -1 upon failure (This avoids template_ids conflicting with a - record template_id of 1). Errors are logged to the Apache log. - - example: - Csave(); # to save the record behind the $template object> - -=head2 get_attr($attribute) - - Invoking the I method will return the value of the requested attribute or -1 on errors. - - example: - Cget_attr($attribute);> - -=head2 set_attr(attribute => value, attribute_2 => value) - - Invoking the I method will set the value of the supplied attributes to the supplied values. The method accepts key/value pairs separated by - commas. - - example: - C<$template->set_attr(attribute => value);> - -=head2 get_label_position($start_label) - - Invoking the I method will return the row, column coordinates on the starting page and the lower left x,y coordinates on the starting - label for the template object. - - examples: - Cget_label_position($start_label);> - -=head1 AUTHOR - -Chris Nighswonger - -=head1 COPYRIGHT - -Copyright 2009 Foundations Bible College. - -=head1 LICENSE - -This file is part of Koha. - -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 -Foundation; either version 2 of the License, or (at your option) any later version. - -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, -Suite 330, Boston, MA 02111-1307 USA - -=head1 DISCLAIMER OF WARRANTY - -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 -A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -=cut diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/labels/label-manage.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/labels/label-manage.tmpl index f343dbdbaf..31fcf16d52 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/labels/label-manage.tmpl +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/labels/label-manage.tmpl @@ -83,7 +83,7 @@ diff --git a/labels/label-create-csv.pl b/labels/label-create-csv.pl index 729cb88b4d..f7f396ccd6 100755 --- a/labels/label-create-csv.pl +++ b/labels/label-create-csv.pl @@ -11,7 +11,7 @@ use C4::Debug; use C4::Labels::Batch 1.000000; use C4::Labels::Template 1.000000; use C4::Labels::Layout 1.000000; -use C4::Labels::PDF 1.000000; +use C4::Creators::PDF 1.000000; use C4::Labels::Label 1.000000; =head diff --git a/labels/label-create-pdf.pl b/labels/label-create-pdf.pl index 91dad00c77..64bd85e914 100755 --- a/labels/label-create-pdf.pl +++ b/labels/label-create-pdf.pl @@ -9,7 +9,7 @@ use C4::Debug; use C4::Labels::Batch 1.000000; use C4::Labels::Template 1.000000; use C4::Labels::Layout 1.000000; -use C4::Labels::PDF 1.000000; +use C4::Creators::PDF 1.000000; use C4::Labels::Label 1.000000; my $cgi = new CGI; @@ -29,7 +29,7 @@ print $cgi->header( -type => 'application/pdf', -attachment => "$pdf_file.pdf", ); -my $pdf = C4::Labels::PDF->new(InitVars => 0); +my $pdf = C4::Creators::PDF->new(InitVars => 0); my $batch = C4::Labels::Batch->retrieve(batch_id => $batch_id); my $template = C4::Labels::Template->retrieve(template_id => $template_id, profile_id => 1); my $layout = C4::Labels::Layout->retrieve(layout_id => $layout_id); diff --git a/labels/label-create-xml.pl b/labels/label-create-xml.pl index 7e90b1f456..4b7cdde23b 100755 --- a/labels/label-create-xml.pl +++ b/labels/label-create-xml.pl @@ -11,7 +11,7 @@ use C4::Debug; use C4::Labels::Batch 1.000000; use C4::Labels::Template 1.000000; use C4::Labels::Layout 1.000000; -use C4::Labels::PDF 1.000000; +use C4::Creators::PDF 1.000000; use C4::Labels::Label 1.000000; =head diff --git a/labels/label-edit-batch.pl b/labels/label-edit-batch.pl index 35c38fb210..1240a266f5 100755 --- a/labels/label-edit-batch.pl +++ b/labels/label-edit-batch.pl @@ -4,7 +4,7 @@ # Parts Copyright 2009 Foundations Bible College. # # This file is part of Koha. -# +# # 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 # Foundation; either version 2 of the License, or (at your option) any later @@ -27,7 +27,7 @@ use CGI; use C4::Auth qw(get_template_and_user); use C4::Output qw(output_html_with_http_headers); use C4::Branch qw(get_branch_code_from_name); -use C4::Labels::Lib 1.000000 qw(get_label_summary html_table); +use C4::Creators::Lib 1.000000 qw(get_label_summary html_table); use C4::Labels::Batch 1.000000; my $cgi = new CGI; @@ -108,7 +108,7 @@ $db_rows = get_label_summary(items => $items, batch_id => $batch_id); my $table = html_table($display_columns, $db_rows); -$template->param( +$template->param( err => $err, errstr => $errstr, ) if ($err ne 0); diff --git a/labels/label-edit-layout.pl b/labels/label-edit-layout.pl index 5bb8fc6404..9b41e4a11a 100755 --- a/labels/label-edit-layout.pl +++ b/labels/label-edit-layout.pl @@ -27,7 +27,7 @@ use Text::CSV_XS; use C4::Auth qw(get_template_and_user); use C4::Output qw(output_html_with_http_headers); -use C4::Labels::Lib 1.000000 qw(get_barcode_types get_label_types get_font_types get_text_justification_types); +use C4::Creators::Lib 1.000000 qw(get_barcode_types get_label_types get_font_types get_text_justification_types); use C4::Labels::Layout 1.000000; my $cgi = new CGI; @@ -135,13 +135,13 @@ elsif ($op eq 'save') { if ($layout_id) { # if a label_id was passed in, this is an update to an existing layout $layout = C4::Labels::Layout->retrieve(layout_id => $layout_id); $layout->set_attr(@params); - $layout->save(); + $layout_id = $layout->save(); } else { # if no label_id, this is a new layout so insert it $layout = C4::Labels::Layout->new(@params); - $layout->save(); + $layout_id = $layout->save(); } - print $cgi->redirect("label-manage.pl?label_element=layout"); + print $cgi->redirect("label-manage.pl?label_element=layout" . ($layout_id == -1 ? "&element_id=$layout_id&op=$op&error=1" : '')); exit; } else { # if we get here, this is a new layout diff --git a/labels/label-edit-profile.pl b/labels/label-edit-profile.pl index ee99e32907..e83d8f5162 100755 --- a/labels/label-edit-profile.pl +++ b/labels/label-edit-profile.pl @@ -4,7 +4,7 @@ # Parts Copyright 2009 Foundations Bible College. # # This file is part of Koha. -# +# # 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 # Foundation; either version 2 of the License, or (at your option) any later @@ -25,7 +25,7 @@ use CGI; use C4::Auth qw(get_template_and_user); use C4::Output qw(output_html_with_http_headers); -use C4::Labels::Lib 1.000000 qw(get_all_templates get_unit_values); +use C4::Creators::Lib 1.000000 qw(get_all_templates get_unit_values); use C4::Labels::Profile 1.000000; my $cgi = new CGI; @@ -50,7 +50,7 @@ my $units = get_unit_values(); if ($op eq 'edit') { $profile = C4::Labels::Profile->retrieve(profile_id => $profile_id); - $template_list = get_all_templates(field_list => 'template_id,template_code, profile_id'); + $template_list = get_all_templates(table_name => 'creator_templates', field_list => 'template_id,template_code, profile_id'); } elsif ($op eq 'save') { my @params = ( @@ -79,7 +79,9 @@ else { # if we get here, this is a new layout } if ($profile_id) { - @label_template = grep{($_->{'profile_id'} == $profile->get_attr('profile_id')) && ($_->{'template_id'} == $profile->get_attr('template_id'))} @$template_list; + @label_template = grep { + ($_->{'profile_id'} == $profile->get_attr('profile_id')) && ($_->{'template_id'} == $profile->get_attr('template_id')); + } @$template_list; } foreach my $unit (@$units) { diff --git a/labels/label-edit-template.pl b/labels/label-edit-template.pl index cc539c5e68..259bd2737d 100755 --- a/labels/label-edit-template.pl +++ b/labels/label-edit-template.pl @@ -25,7 +25,7 @@ use CGI; use C4::Auth qw(get_template_and_user); use C4::Output qw(output_html_with_http_headers); -use C4::Labels::Lib 1.000000 qw(get_all_profiles get_unit_values); +use C4::Creators::Lib 1.000000 qw(get_all_profiles get_unit_values); use C4::Labels::Template 1.000000; my $cgi = new CGI; @@ -72,13 +72,15 @@ elsif ($op eq 'save') { ); if ($template_id) { # if a label_id was passed in, this is an update to an existing layout $label_template = C4::Labels::Template->retrieve(template_id => $template_id); - my $old_profile = C4::Labels::Profile->retrieve(profile_id => $label_template->get_attr('profile_id')); - my $new_profile = C4::Labels::Profile->retrieve(profile_id => $cgi->param('profile_id')); - if ($label_template->get_attr('template_id') != $new_profile->get_attr('template_id')) { - $new_profile->set_attr(template_id => $label_template->get_attr('template_id')); - $old_profile->set_attr(template_id => 0); - $new_profile->save(); - $old_profile->save(); + if ($cgi->param('profile_id')) { + my $old_profile = C4::Labels::Profile->retrieve(profile_id => $label_template->get_attr('profile_id')); + my $new_profile = C4::Labels::Profile->retrieve(profile_id => $cgi->param('profile_id')); + if ($label_template->get_attr('template_id') != $new_profile->get_attr('template_id')) { + $new_profile->set_attr(template_id => $label_template->get_attr('template_id')); + $old_profile->set_attr(template_id => 0); + $new_profile->save(); + $old_profile->save(); + } } $label_template->set_attr(@params); $label_template->save(); diff --git a/labels/label-item-search.pl b/labels/label-item-search.pl index 633209d67b..df7f6a59f1 100755 --- a/labels/label-item-search.pl +++ b/labels/label-item-search.pl @@ -33,7 +33,7 @@ use C4::Search qw(SimpleSearch); use C4::Biblio qw(TransformMarcToKoha); use C4::Items qw(GetItemInfosOf get_itemnumbers_of); use C4::Koha qw(GetItemTypes); # XXX subfield_is_koha_internal_p -use C4::Labels::Lib qw(html_table); +use C4::Creators::Lib qw(html_table); use C4::Debug; BEGIN { diff --git a/labels/label-manage.pl b/labels/label-manage.pl index 3ad95b3205..9ef23f07e5 100755 --- a/labels/label-manage.pl +++ b/labels/label-manage.pl @@ -4,7 +4,7 @@ # Parts Copyright 2009 Foundations Bible College. # # This file is part of Koha. -# +# # 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 # Foundation; either version 2 of the License, or (at your option) any later @@ -28,7 +28,7 @@ use Data::Dumper; use C4::Auth qw(get_template_and_user); use C4::Output qw(output_html_with_http_headers); use autouse 'C4::Branch' => qw(get_branch_code_from_name); -use C4::Labels::Lib 1.000000 qw(get_all_templates get_all_layouts get_all_profiles get_batch_summary html_table); +use C4::Creators::Lib 1.000000 qw(get_all_templates get_all_layouts get_all_profiles get_batch_summary html_table); use C4::Labels::Layout 1.000000; use C4::Labels::Template 1.000000; use C4::Labels::Profile 1.000000; @@ -46,9 +46,8 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( } ); -my $error = 0; my $db_rows = {}; -my $display_columns = { layout => [ # db column => {col label is link? +my $display_columns = { layout => [ # db column => {col label is link? {layout_id => {label => 'Layout ID', link_field => 0}}, {layout_name => {label => 'Layout', link_field => 0}}, {barcode_type => {label => 'Barcode Type', link_field => 0}}, @@ -73,9 +72,10 @@ my $display_columns = { layout => [ # db column => {col label ], }; -my $label_element = $cgi->param('label_element') || undef; +my $label_element = $cgi->param('label_element') || 'template'; # default to template managment my $op = $cgi->param('op') || 'none'; my $element_id = $cgi->param('element_id') || undef; +my $error = $cgi->param('error') || 0; my $branch_code = ($label_element eq 'batch' ? get_branch_code_from_name($template->param('LoginBranchname')) : ''); @@ -84,18 +84,18 @@ if ($op eq 'delete') { elsif ($label_element eq 'template') {$error = C4::Labels::Template::delete(template_id => $element_id);} elsif ($label_element eq 'profile') {$error = C4::Labels::Profile::delete(profile_id => $element_id);} elsif ($label_element eq 'batch') {$error = C4::Labels::Batch::delete(batch_id => $element_id, branch_code => $branch_code);} - else {} # FIXME: Some error trapping code + else {} # FIXME: Some error trapping code } -if ($label_element eq 'layout') {$db_rows = get_all_layouts();} -elsif ($label_element eq 'template') {$db_rows = get_all_templates();} -elsif ($label_element eq 'profile') {$db_rows = get_all_profiles();} -elsif ($label_element eq 'batch') {$db_rows = get_batch_summary(filter => "branch_code=\'$branch_code\' OR branch_code=\'NB\'");} +if ($label_element eq 'layout') {$db_rows = get_all_layouts(table_name => 'creator_layouts', filter => 'creator=\'Labels\'');} +elsif ($label_element eq 'template') {$db_rows = get_all_templates(table_name => 'creator_templates', filter => 'creator=\'Labels\'');} +elsif ($label_element eq 'profile') {$db_rows = get_all_profiles(table_name => 'printers_profile', filter => 'creator=\'Labels\'');} +elsif ($label_element eq 'batch') {$db_rows = get_batch_summary(filter => "branch_code=\'$branch_code\' OR branch_code=\'NB\'", creator => 'Labels');} else {} # FIXME: Some error trapping code my $table = html_table($display_columns->{$label_element}, $db_rows); -$template->param(error => $error) if ($error ne 0); +$template->param(error => $error) if ($error) && ($error ne 0); $template->param(print => 1) if ($label_element eq 'batch'); $template->param( op => $op, diff --git a/labels/label-print.pl b/labels/label-print.pl index 0168e4a05d..f67c3cf379 100755 --- a/labels/label-print.pl +++ b/labels/label-print.pl @@ -3,7 +3,7 @@ # Copyright 2009 Foundations Bible College. # # This file is part of Koha. -# +# # 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 # Foundation; either version 2 of the License, or (at your option) any later @@ -25,7 +25,7 @@ use Data::Dumper; use C4::Auth qw(get_template_and_user); use C4::Output qw(output_html_with_http_headers); -use C4::Labels::Lib 1.000000 qw(get_all_templates get_all_layouts get_label_output_formats); +use C4::Creators::Lib 1.000000 qw(get_all_templates get_all_layouts get_output_formats); use C4::Labels::Batch 1.000000; my $cgi = new CGI; @@ -43,8 +43,8 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( my $op = $cgi->param('op') || 'none'; my @label_ids = $cgi->param('label_id') if $cgi->param('label_id'); # this will handle individual label printing my @batch_ids = $cgi->param('batch_id') if $cgi->param('batch_id'); -my $layout_id = $cgi->param('layout_id') || undef; -my $template_id = $cgi->param('template_id') || undef; +my $layout_id = $cgi->param('layout_id') || undef; +my $template_id = $cgi->param('template_id') || undef; my $start_label = $cgi->param('start_label') || 1; my @item_numbers = $cgi->param('item_number') if $cgi->param('item_number'); my $output_format = $cgi->param('output_format') || 'pdf'; @@ -52,7 +52,7 @@ my $referer = $cgi->param('referer') || undef; my $layouts = undef; my $templates = undef; -my $label_output_formats = undef; +my $output_formats = undef; my @batches = (); my $multi_batch_count = scalar(@batch_ids); my $label_count = scalar(@label_ids); @@ -112,16 +112,16 @@ elsif ($op eq 'none') { @batch_ids = grep{$_ = {batch_id => $_}} @batch_ids; @label_ids = grep{$_ = {label_id => $_}} @label_ids; @item_numbers = grep{$_ = {item_number => $_}} @item_numbers; - $templates = get_all_templates(field_list => 'template_id, template_code'); - $layouts = get_all_layouts(field_list => 'layout_id, layout_name'); - $label_output_formats = get_label_output_formats(); + $templates = get_all_templates(field_list => 'template_id, template_code', filter => 'creator = "Labels"'); + $layouts = get_all_layouts(field_list => 'layout_id, layout_name', filter => 'creator = "Labels"'); + $output_formats = get_output_formats(); $template->param( batch_ids => \@batch_ids, label_ids => \@label_ids, item_numbers => \@item_numbers, templates => $templates, layouts => $layouts, - label_output_formats => $label_output_formats, + output_formats => $output_formats, multi_batch_count => $multi_batch_count, label_count => $label_count, item_count => $item_count, -- 2.20.1