3 # Copyright 2006 Katipo Communications.
4 # Parts Copyright 2009 Foundations Bible College.
6 # This file is part of Koha.
8 # Koha is free software; you can redistribute it and/or modify it
9 # under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
13 # Koha is distributed in the hope that it will be useful, but
14 # WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with Koha; if not, see <http://www.gnu.org/licenses>.
27 use autouse
'Data::Dumper' => qw(Dumper);
29 use C4
::Auth
qw(get_template_and_user);
30 use C4
::Output
qw(output_html_with_http_headers);
35 my ( $template, $loggedinuser, $cookie ) = get_template_and_user
(
37 template_name
=> "patroncards/edit-layout.tt",
41 flagsrequired
=> { catalogue
=> 1 },
46 my $op = $cgi->param('op') || 'new'; # make 'new' the default operation if none is submitted
47 my $layout_id = $cgi->param('layout_id') || $cgi->param('element_id') || '';
48 my $layout_choice = $cgi->param('layout_choice') || '';
50 my $layout_xml = undef;
52 my $units = get_unit_values
();
53 my $font_types = get_font_types
();
54 my $alignment_types = get_text_justification_types
();
55 my $barcode_types = get_barcode_types
();
57 {type
=> 'none', name
=> 'None', selected
=> 1},
58 {type
=> 'patronimages', name
=> 'Patron Image', selected
=> 0},
59 {type
=> 'creator_images', name
=> 'Other Image', selected
=> 0},
61 my $image_names = get_all_image_names
();
62 unshift @
$image_names, {type
=> 'none', name
=> 'Select Image', selected
=> 1};
65 my ($selection, $source_list) = @_;
66 my @select_list = (); # we must make a copy of the referent otherwise we modify the original which causes bad things to happen
69 foreach my $type (@
$source_list) {
70 if (($selection) && ($type->{'type'} eq $selection)) { # even if there is no current selection we must still build the select box
76 push @select_list, {type
=> $type->{'type'}, name
=> $type->{'name'}, selected
=> $selected};
82 warn sprintf("Error performing '%s': No 'layout_id' passed in.", $op) unless ($layout_id);
83 $layout = C4
::Patroncards
::Layout
->retrieve(layout_id
=> $layout_id);
84 $layout_xml = XMLin
($layout->get_attr('layout_xml'), ForceArray
=> 1);
85 # Handle text fields...
88 if ($layout_xml->{'text'}) {
89 while (scalar @
{$layout_xml->{'text'}}) {
92 "field_" . $field_number => 1, # indicate field as currently "selected" for display in form
93 "field_" . $field_number . "_text" => shift @
{$layout_xml->{'text'}},
95 my $field_params = shift @
{$layout_xml->{'text'}};
97 "field_" . $field_number . "_llx" => $field_params->{'llx'},
98 "field_" . $field_number . "_lly" => $field_params->{'lly'},
99 "field_" . $field_number . "_font" => _set_selected
($field_params->{'font'}, $font_types),
100 "field_" . $field_number . "_font_size" => $field_params->{'font_size'},
101 "field_" . $field_number . "_text_alignment" => _set_selected
($field_params->{'text_alignment'}, $alignment_types),
106 # Handle fields not currently used
108 for (my $field = $field_number + 1; $field < 4; $field++) { # limit 3 text fields
110 "field_$field" . "_font" => get_font_types
(),
111 "field_$field" . "_text_alignment" => get_text_justification_types
(),
118 foreach my $image (keys %{$layout_xml->{'images'}}) {
120 push @images, ( $image . "_image" => "$image",
121 $image . "_Dx" => $layout_xml->{'images'}->{$image}->{'Dx'},
122 $image . "_Tx" => $layout_xml->{'images'}->{$image}->{'Tx'},
123 $image . "_Ty" => $layout_xml->{'images'}->{$image}->{'Ty'},
124 $image . "_image_source" => _set_selected
($layout_xml->{'images'}->{$image}->{'data_source'}->[0]->{'image_source'}, $image_sources),
125 $image . "_image_name" => _set_selected
($layout_xml->{'images'}->{$image}->{'data_source'}->[0]->{'image_name'}, $image_names),
129 # Handle image fields not currently used
131 for (my $image = $image_count + 1; $image < 3; $image++) { #limit 2 images
133 "image_$image" . "_image_source" => $image_sources,
134 "image_$image" . "_image_name" => $image_names,
140 foreach my $barcode_param (keys %{$layout_xml->{'barcode'}->[0]}) {
141 push @barcode, (($barcode_param eq 'type' ?
("barcode_" . $barcode_param => _set_selected
($layout_xml->{'barcode'}->[0]->{'barcode_type'}, $barcode_types)) : ("barcode_" . $barcode_param => $layout_xml->{'barcode'}->[0]->{$barcode_param})));
145 layout_id
=> $layout->get_attr('layout_id') > -1 ?
$layout->get_attr('layout_id') : '',
146 layout_name
=> $layout->get_attr('layout_name'),
147 page_side
=> ($layout_xml->{'page_side'} eq 'F' ?
0 : 1),
148 guide_box
=> $layout_xml->{'guide_box'},
151 barcode_type
=> get_barcode_types
(),
156 output_html_with_http_headers
$cgi, $cookie, $template->output;
159 elsif ($op eq 'save') {
160 my $format_string = undef;
162 my $layout_name = undef;
163 my $layout_id = undef;
166 my $image_select = 0;
167 my $field_enabled = 0;
169 foreach my $parameter ($cgi->param()) { # parse the field values and build a hash of the layout for conversion to xml and storage in the db
170 if ($parameter =~ m/^field_([0-9])_(.*)$/) {
171 my $field_number = $1;
173 $field_enabled = $field_number if $field_data eq 'enable';
174 next CGI_PARAMS
unless $field_number == $field_enabled;
175 if ($field_data eq 'text') {
176 push @
$text_lines, $cgi->param($parameter);
177 if ($array_index <= 0) {
181 $array_index += 2; # after hitting 1, increment by 2 so counting odds
184 elsif ($array_index > 0) {
185 $text_lines->[$array_index]->{$field_data} = $cgi->param($parameter);
188 elsif ($parameter =~ m/^barcode_(.*)$/) {
189 $field_enabled = $1 if $1 eq 'print';
190 next CGI_PARAMS
unless $field_enabled eq 'print';
191 $layout->{'barcode'}->{$1} = $cgi->param($parameter);
193 elsif ($parameter =~m/^image_([0-9])_(.*)$/) {
194 my $image_number = $1;
196 $field_enabled = $image_number if $cgi->param("image_$image_number" . "_image_source") ne 'none';
197 next CGI_PARAMS
unless $image_number == $field_enabled;
198 if ($image_data =~ m/^image_(.*)$/) {
199 $layout->{'images'}->{"image_$image_number"}->{'data_source'}->{"image_$1"} = $cgi->param($parameter);
202 $layout->{'images'}->{"image_$image_number"}->{$image_data} = $cgi->param($parameter);
206 $layout_name = $cgi->param($parameter) if $parameter eq 'layout_name';
207 $layout_id = $cgi->param($parameter) if $parameter eq 'layout_id';
208 $layout->{'units'} = $cgi->param($parameter) if $parameter eq 'units';
209 $layout->{'page_side'} = $cgi->param($parameter) if $parameter eq 'page_side';
210 $layout->{'guide_box'} = $cgi->param($parameter) if $parameter eq 'guide_box';
213 $layout->{'text'} = $text_lines;
214 my @params = (layout_name
=> $layout_name, layout_id
=> $layout_id, layout_xml
=> XMLout
($layout));
215 if ($layout_id) { # if a label_id was passed in, this is an update to an existing layout
216 $layout = C4
::Patroncards
::Layout
->retrieve(layout_id
=> $layout_id);
217 $layout->set_attr(@params);
218 $layout_id = $layout->save();
220 else { # if no label_id, this is a new layout so insert it
221 $layout = C4
::Patroncards
::Layout
->new(@params);
222 $layout_id = $layout->save();
224 print $cgi->redirect("manage.pl?card_element=layout" . ($layout_id == -1 ?
"&element_id=$layout_id&op=$op&error=101" : ''));
227 elsif ($op eq 'new') { # this is a new layout
228 $layout = C4
::Patroncards
::Layout
->new();
230 for (my $field; $field < 4; $field++) { # limit 3 text fields
232 "field_$field" . "_font" => get_font_types
(),
233 "field_$field" . "_text_alignment" => get_text_justification_types
(),
238 for (my $image; $image < 3; $image++) { #limit 2 images
240 "image_$image" . "_image_source" => $image_sources,
241 "image_$image" . "_image_name" => $image_names,
246 units
=> get_unit_values
(),
248 barcode_type
=> get_barcode_types
(),
252 output_html_with_http_headers
$cgi, $cookie, $template->output;
255 else { # trap unsupported operation here
256 warn sprintf("Unsupported operation type submitted: %s", $op);
257 print $cgi->redirect("manage.pl?card_element=layout&element_id=$layout_id&error=201");