Bug 25548: Remove Apache rewrite directives that trigger redirects
[koha.git] / patroncards / edit-layout.pl
blob8e415afa6bf5540de50bff1d03aa6484b3c9d3bb
1 #!/usr/bin/perl
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>.
21 use Modern::Perl;
23 use CGI qw ( -utf8 );
24 use Text::CSV_XS;
25 use XML::Simple;
26 use autouse 'Data::Dumper' => qw(Dumper);
28 use C4::Auth qw(get_template_and_user);
29 use C4::Output qw(output_html_with_http_headers);
30 use C4::Creators;
31 use C4::Patroncards;
33 my $cgi = CGI->new;
34 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
36 template_name => "patroncards/edit-layout.tt",
37 query => $cgi,
38 type => "intranet",
39 flagsrequired => { catalogue => 1 },
40 debug => 1,
44 my $op = $cgi->param('op') || 'new'; # make 'new' the default operation if none is submitted
45 my $layout_id = $cgi->param('layout_id') || $cgi->param('element_id') || '';
46 my $layout_choice = $cgi->param('layout_choice') || '';
47 my $layout = '';
48 my $layout_xml = undef;
50 my $units = get_unit_values();
51 my $font_types = get_font_types();
52 my $alignment_types = get_text_justification_types();
53 my $barcode_types = get_barcode_types();
54 my $image_sources = [
55 {type => 'none', name => 'None', selected => 1},
56 {type => 'patronimages', name => 'Patron Image', selected => 0},
57 {type => 'creator_images', name => 'Other Image', selected => 0},
59 my $image_names = get_all_image_names();
60 unshift @$image_names, {type => 'none', name => 'Select Image', selected => 1};
62 sub _set_selected {
63 my ($selection, $source_list) = @_;
64 my @select_list = (); # we must make a copy of the referent otherwise we modify the original which causes bad things to happen
65 my $selected = 0;
66 SET_SELECTED:
67 foreach my $type (@$source_list) {
68 if (($selection) && ($type->{'type'} eq $selection)) { # even if there is no current selection we must still build the select box
69 $selected = 1;
71 else {
72 $selected = 0;
74 push @select_list, {type => $type->{'type'}, name => $type->{'name'}, selected => $selected};
76 return \@select_list;
79 if ($op eq 'edit') {
80 warn sprintf("Error performing '%s': No 'layout_id' passed in.", $op) unless ($layout_id);
81 $layout = C4::Patroncards::Layout->retrieve(layout_id => $layout_id);
82 $layout_xml = XMLin($layout->get_attr('layout_xml'), ForceArray => 1);
83 # Handle text fields...
84 my $field_number = 0;
85 my @text_fields = ();
86 if ($layout_xml->{'text'}) {
87 while (scalar @{$layout_xml->{'text'}}) {
88 $field_number++;
89 push @text_fields, (
90 "field_" . $field_number => 1, # indicate field as currently "selected" for display in form
91 "field_" . $field_number . "_text" => shift @{$layout_xml->{'text'}},
93 my $field_params = shift @{$layout_xml->{'text'}};
94 push @text_fields, (
95 "field_" . $field_number . "_llx" => $field_params->{'llx'},
96 "field_" . $field_number . "_lly" => $field_params->{'lly'},
97 "field_" . $field_number . "_height_scale" => $field_params->{'height_scale'},
98 "field_" . $field_number . "_width_scale" => $field_params->{'width_scale'},
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
107 UNUSED_TEXT_FIELDS:
108 for (my $field = $field_number + 1; $field < 4; $field++) { # limit 3 text fields
109 push @text_fields, (
110 "field_$field" . "_font" => get_font_types(),
111 "field_$field" . "_text_alignment" => get_text_justification_types(),
115 # Handle images...
116 my $image_count = 0;
117 my @images = ();
118 foreach my $image (keys %{$layout_xml->{'images'}}) {
119 $image_count++;
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
130 UNUSED_IMAGE_FIELDS:
131 for (my $image = $image_count + 1; $image < 3; $image++) { #limit 2 images
132 push @images, (
133 "image_$image" . "_image_source" => $image_sources,
134 "image_$image" . "_image_name" => $image_names,
138 # Handle barcodes...
139 my @barcode = ();
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]->{'type'}, $barcode_types)) : ("barcode_" . $barcode_param => $layout_xml->{'barcode'}->[0]->{$barcode_param})));
144 foreach my $unit (@$units){
145 if ($unit->{'type'} eq $layout->get_attr('units')) {
146 $unit->{'selected'} = 1;
147 } else {
148 $unit->{'selected'} = 0;
152 $template->param(
153 layout_id => $layout->get_attr('layout_id') > -1 ? $layout->get_attr('layout_id') : '',
154 layout_name => $layout->get_attr('layout_name'),
155 page_side => ($layout_xml->{'page_side'} eq 'F' ? 0 : 1),
156 guide_box => $layout_xml->{'guide_box'},
157 guide_grid => $layout_xml->{'guide_grid'},
158 units => $units,
159 @barcode,
160 barcode_type => _set_selected($layout_xml->{'barcode'}->[0]->{'type'}, $barcode_types),
161 @text_fields,
162 @images,
163 guidebox => 0,
165 output_html_with_http_headers $cgi, $cookie, $template->output;
166 exit;
168 elsif ($op eq 'save') {
169 my $format_string = undef;
170 my $layout = {};
171 my $layout_name = undef;
172 my $layout_id = undef;
173 my $text_lines = [];
174 my $array_index = 0;
175 my $image_select = 0;
176 my $field_enabled = 0;
177 CGI_PARAMS:
178 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
179 if ($parameter =~ m/^field_([0-9])_(.*)$/) {
180 my $field_number = $1;
181 my $field_data = $2;
182 $field_enabled = $field_number if $field_data eq 'enable';
183 next CGI_PARAMS unless $field_number == $field_enabled;
184 if ($field_data eq 'text') {
185 push @$text_lines, $cgi->param($parameter);
186 if ($array_index <= 0) {
187 $array_index++;
189 else {
190 $array_index += 2; # after hitting 1, increment by 2 so counting odds
193 elsif ($array_index > 0) {
194 $text_lines->[$array_index]->{$field_data} = $cgi->param($parameter);
197 elsif ($parameter =~ m/^barcode_(.*)$/) {
198 $field_enabled = $1 if $1 eq 'print';
199 next CGI_PARAMS unless $field_enabled eq 'print';
200 $layout->{'barcode'}->{$1} = $cgi->param($parameter);
202 elsif ($parameter =~m/^image_([0-9])_(.*)$/) {
203 my $image_number = $1;
204 my $image_data = $2;
205 $field_enabled = $image_number if $cgi->param("image_$image_number" . "_image_source") ne 'none';
206 next CGI_PARAMS unless $image_number == $field_enabled;
207 if ($image_data =~ m/^image_(.*)$/) {
208 $layout->{'images'}->{"image_$image_number"}->{'data_source'}->{"image_$1"} = $cgi->param($parameter);
210 else {
211 $layout->{'images'}->{"image_$image_number"}->{$image_data} = $cgi->param($parameter);
214 else {
215 $layout_name = $cgi->param($parameter) if $parameter eq 'layout_name';
216 $layout_id = $cgi->param($parameter) if $parameter eq 'layout_id';
217 $layout->{'units'} = $cgi->param($parameter) if $parameter eq 'units';
218 $layout->{'page_side'} = $cgi->param($parameter) if $parameter eq 'page_side';
219 $layout->{'guide_box'} = $cgi->param($parameter) if $parameter eq 'guide_box';
220 $layout->{'guide_grid'} = $cgi->param($parameter) if $parameter eq 'guide_grid';
223 $layout->{'text'} = $text_lines;
224 my @params = (layout_name => $layout_name, layout_id => $layout_id, layout_xml => XMLout($layout));
225 push(@params,units => $layout->{'units'}) if $layout->{'units'};
226 if ($layout_id) { # if a label_id was passed in, this is an update to an existing layout
227 $layout = C4::Patroncards::Layout->retrieve(layout_id => $layout_id);
228 $layout->set_attr(@params);
229 $layout_id = $layout->save();
231 else { # if no label_id, this is a new layout so insert it
232 $layout = C4::Patroncards::Layout->new(@params);
233 $layout_id = $layout->save();
235 print $cgi->redirect("manage.pl?card_element=layout" . ($layout_id == -1 ? "&element_id=$layout_id&op=$op&error=101" : ''));
236 exit;
238 elsif ($op eq 'new') { # this is a new layout
239 $layout = C4::Patroncards::Layout->new();
240 my @fields = ();
241 for (my $field = 0; $field < 4; $field++) { # limit 3 text fields
242 push @fields, (
243 "field_$field" . "_font" => get_font_types(),
244 "field_$field" . "_text_alignment" => get_text_justification_types(),
248 my @images = ();
249 for (my $image = 0; $image < 3; $image++) { #limit 2 images
250 push @images, (
251 "image_$image" . "_image_source" => $image_sources,
252 "image_$image" . "_image_name" => $image_names,
256 $template->param(
257 units => get_unit_values(),
258 @fields,
259 barcode_type => get_barcode_types(),
260 @images,
263 output_html_with_http_headers $cgi, $cookie, $template->output;
264 exit;
266 else { # trap unsupported operation here
267 warn sprintf("Unsupported operation type submitted: %s", $op);
268 print $cgi->redirect("manage.pl?card_element=layout&element_id=$layout_id&error=201");
269 exit;
272 __END__