View | Details | Raw Unified | Return to bug 6874
Collapse All | Expand All

(-)a/C4/Biblio.pm (-6 / +23 lines)
Lines 34-39 use C4::Dates qw/format_date/; Link Here
34
use C4::Log;    # logaction
34
use C4::Log;    # logaction
35
use C4::ClassSource;
35
use C4::ClassSource;
36
use C4::Charset;
36
use C4::Charset;
37
use C4::UploadedFiles;
37
38
38
use vars qw($VERSION @ISA @EXPORT);
39
use vars qw($VERSION @ISA @EXPORT);
39
40
Lines 1651-1657 sub GetMarcAuthors { Link Here
1651
1652
1652
=head2 GetMarcUrls
1653
=head2 GetMarcUrls
1653
1654
1654
  $marcurls = GetMarcUrls($record,$marcflavour);
1655
  $marcurls = GetMarcUrls($record,$marcflavour,$frameworkcode);
1655
1656
1656
Returns arrayref of URLs from MARC data, suitable to pass to tmpl loop.
1657
Returns arrayref of URLs from MARC data, suitable to pass to tmpl loop.
1657
Assumes web resources (not uncommon in MARC21 to omit resource type ind) 
1658
Assumes web resources (not uncommon in MARC21 to omit resource type ind) 
Lines 1659-1673 Assumes web resources (not uncommon in MARC21 to omit resource type ind) Link Here
1659
=cut
1660
=cut
1660
1661
1661
sub GetMarcUrls {
1662
sub GetMarcUrls {
1662
    my ( $record, $marcflavour ) = @_;
1663
    my ( $record, $marcflavour, $frameworkcode ) = @_;
1664
1665
    my $tagslib = &GetMarcStructure(1, $frameworkcode);
1666
    my $urltag = '856';
1667
    my $urlsubtag = 'u';
1663
1668
1664
    my @marcurls;
1669
    my @marcurls;
1665
    for my $field ( $record->field('856') ) {
1670
    for my $field ( $record->field($urltag) ) {
1666
        my @notes;
1671
        my @notes;
1667
        for my $note ( $field->subfield('z') ) {
1672
        for my $note ( $field->subfield('z') ) {
1668
            push @notes, { note => $note };
1673
            push @notes, { note => $note };
1669
        }
1674
        }
1670
        my @urls = $field->subfield('u');
1675
        my @urls = $field->subfield($urlsubtag);
1671
        foreach my $url (@urls) {
1676
        foreach my $url (@urls) {
1672
            my $marcurl;
1677
            my $marcurl;
1673
            if ( $marcflavour eq 'MARC21' ) {
1678
            if ( $marcflavour eq 'MARC21' ) {
Lines 1695-1702 sub GetMarcUrls { Link Here
1695
                $marcurl->{'part'} = $s3 if ($link);
1700
                $marcurl->{'part'} = $s3 if ($link);
1696
                $marcurl->{'toc'} = 1 if ( defined($s3) && $s3 =~ /^[Tt]able/ );
1701
                $marcurl->{'toc'} = 1 if ( defined($s3) && $s3 =~ /^[Tt]able/ );
1697
            } else {
1702
            } else {
1698
                $marcurl->{'linktext'} = $field->subfield('2') || C4::Context->preference('URLLinkText') || $url;
1703
                if ($tagslib->{ $urltag }->{ $urlsubtag }->{value_builder} eq "upload.pl"
1699
                $marcurl->{'MARCURL'} = $url;
1704
                  and $url =~ /id=([0-9a-f]+)/) {
1705
                    my $file = C4::UploadedFiles::GetUploadedFile($1);
1706
                    my $text = $file ? $file->{filename} : $url;
1707
                    $marcurl->{'linktext'} = $field->subfield('2')
1708
                                          || C4::Context->preference('URLLinkText')
1709
                                          || $file->{filename};
1710
                    $marcurl->{'MARCURL'} = $url;
1711
                } else {
1712
                    $marcurl->{'linktext'} = $field->subfield('2')
1713
                                          || C4::Context->preference('URLLinkText')
1714
                                          || $url;
1715
                    $marcurl->{'MARCURL'} = $url;
1716
                }
1700
            }
1717
            }
1701
            push @marcurls, $marcurl;
1718
            push @marcurls, $marcurl;
1702
        }
1719
        }
(-)a/C4/UploadedFiles.pm (+216 lines)
Line 0 Link Here
1
package C4::UploadedFiles;
2
3
# Copyright 2011-2012 BibLibre
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
=head1 NAME
21
22
C4::UploadedFiles - Functions to deal with files uploaded with cataloging plugin upload.pl
23
24
=head1 SYNOPSIS
25
26
    use C4::UploadedFiles;
27
28
    my $filename = $cgi->param('uploaded_file');
29
    my $file = $cgi->upload('uploaded_file');
30
    my $dir = $input->param('dir');
31
32
    # upload file
33
    my $id = C4::UploadedFiles::UploadFile($filename, $dir, $file->handle);
34
35
    # retrieve file infos
36
    my $uploaded_file = C4::UploadedFiles::GetUploadedFile($id);
37
38
    # delete file
39
    C4::UploadedFiles::DelUploadedFile($id);
40
41
=head1 DESCRIPTION
42
43
This module provides basic functions for adding, retrieving and deleting files related to
44
cataloging plugin upload.pl.
45
46
It uses uploaded_files table.
47
48
It is not related to C4::UploadedFile
49
50
=head1 FUNCTIONS
51
52
=cut
53
54
use Modern::Perl;
55
use Digest::SHA;
56
57
use C4::Context;
58
59
=head2 GetUploadedFile
60
61
    my $file = C4::UploadedFiles::GetUploadedFile($id);
62
63
Returns a hashref containing infos on uploaded files.
64
Hash keys are:
65
66
=over 2
67
68
=item * id: id of the file (same as given in argument)
69
70
=item * filename: name of the file
71
72
=item * dir: directory where file is stored (relative to syspref 'uploadPath')
73
74
=back
75
76
It returns undef if file is not found
77
78
=cut
79
80
sub GetUploadedFile {
81
    my ($id) = @_;
82
83
    return unless $id;
84
85
    my $dbh = C4::Context->dbh;
86
    my $query = qq{
87
        SELECT id, filename, dir
88
        FROM uploaded_files
89
        WHERE id = ?
90
    };
91
    my $sth = $dbh->prepare($query);
92
    $sth->execute($id);
93
    my $file = $sth->fetchrow_hashref;
94
95
    return $file;
96
}
97
98
=head2 UploadFile
99
100
    my $id = C4::UploadedFiles::UploadFile($filename, $dir, $io_handle);
101
102
Upload a new file and returns its id (its SHA-1 sum, actually).
103
104
Parameters:
105
106
=over 2
107
108
=item * $filename: name of the file
109
110
=item * $dir: directory where to store the file (path relative to syspref 'uploadPath'
111
112
=item * $io_handle: valid IO::Handle object, can be retrieved with
113
$cgi->upload('uploaded_file')->handle;
114
115
=back
116
117
=cut
118
119
sub UploadFile {
120
    my ($filename, $dir, $handle) = @_;
121
122
    if($filename =~ m#/(^|/)\.\.(/|$)# or $dir =~ m#(^|/)\.\.(/|$)#) {
123
        warn "Filename or dirname contains '..'. Aborting upload";
124
        return;
125
    }
126
127
    my $buffer;
128
    my $data = '';
129
    while($handle->read($buffer, 1024)) {
130
        $data .= $buffer;
131
    }
132
    $handle->close;
133
134
    my $sha = new Digest::SHA;
135
    $sha->add($data);
136
    my $id = $sha->hexdigest;
137
138
    # Test if this id already exist
139
    my $file = GetUploadedFile($id);
140
    if($file) {
141
        return $file->{id};
142
    }
143
144
    my $upload_path = C4::Context->preference("uploadPath");
145
    my $file_path = "$upload_path/$dir/$filename";
146
    $file_path =~ s#/+#/#;
147
    if( -f $file_path ) {
148
        warn "Id $id not in database, but present in filesystem, do nothing";
149
        return;
150
    }
151
152
    my $out_fh;
153
    unless(open $out_fh, '>', $file_path) {
154
        warn "Failed to open file '$file_path': $!";
155
        return;
156
    }
157
158
    print $out_fh $data;
159
    close $out_fh;
160
161
    my $dbh = C4::Context->dbh;
162
    my $query = qq{
163
        INSERT INTO uploaded_files (id, filename, dir)
164
        VALUES (?,?, ?);
165
    };
166
    my $sth = $dbh->prepare($query);
167
    if($sth->execute($id, $filename, $dir)) {
168
        return $id;
169
    }
170
171
    return undef;
172
}
173
174
=head2 DelUploadedFile
175
176
    C4::UploadedFiles::DelUploadedFile($id);
177
178
Remove a previously uploaded file, given its id.
179
180
Returns a false value if an error occurs.
181
182
=cut
183
184
sub DelUploadedFile {
185
    my ($id) = @_;
186
187
    my $file = GetUploadedFile($id);
188
    if($file) {
189
        my $upload_path = C4::Context->preference("uploadPath");
190
        my $file_path = "$upload_path/$file->{dir}/$file->{filename}";
191
        $file_path =~ s#/+#/#;
192
        my $file_deleted = 0;
193
        unless( -f $file_path ) {
194
            warn "Id $file->{id} is in database but not in filesystem, removing id from database";
195
            $file_deleted = 1;
196
        } else {
197
            if(unlink $file_path) {
198
                $file_deleted = 1;
199
            }
200
        }
201
202
        unless($file_deleted) {
203
            warn "File $file_path cannot be deleted: $!";
204
        }
205
206
        my $dbh = C4::Context->dbh;
207
        my $query = qq{
208
            DELETE FROM uploaded_files
209
            WHERE id = ?
210
        };
211
        my $sth = $dbh->prepare($query);
212
        return $sth->execute($id);
213
    }
214
}
215
216
1;
(-)a/basket/basket.pl (-1 / +1 lines)
Lines 65-71 foreach my $biblionumber ( @bibs ) { Link Here
65
    my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
65
    my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
66
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
66
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
67
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
67
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
68
    my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
68
    my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour, GetFrameworkCode($biblionumber));
69
    my @items            = GetItemsInfo( $biblionumber );
69
    my @items            = GetItemsInfo( $biblionumber );
70
70
71
    my $hasauthors = 0;
71
    my $hasauthors = 0;
(-)a/catalogue/MARCdetail.pl (-1 lines)
Lines 215-221 for ( my $tabloop = 0 ; $tabloop <= 10 ; $tabloop++ ) { Link Here
215
                    $subfield_data{marc_value} =
215
                    $subfield_data{marc_value} =
216
                      GetAuthorisedValueDesc( $fields[$x_i]->tag(),
216
                      GetAuthorisedValueDesc( $fields[$x_i]->tag(),
217
                        $subf[$i][0], $subf[$i][1], '', $tagslib) || $subf[$i][1];
217
                        $subf[$i][0], $subf[$i][1], '', $tagslib) || $subf[$i][1];
218
219
                }
218
                }
220
                $subfield_data{marc_subfield} = $subf[$i][0];
219
                $subfield_data{marc_subfield} = $subf[$i][0];
221
                $subfield_data{marc_tag}      = $fields[$x_i]->tag();
220
                $subfield_data{marc_tag}      = $fields[$x_i]->tag();
(-)a/catalogue/detail.pl (-1 / +1 lines)
Lines 110-116 my $marcisbnsarray = GetMarcISBN( $record, $marcflavour ); Link Here
110
my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
110
my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
111
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
111
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
112
my $marcseriesarray  = GetMarcSeries($record,$marcflavour);
112
my $marcseriesarray  = GetMarcSeries($record,$marcflavour);
113
my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
113
my $marcurlsarray    = GetMarcUrls    ($record, $marcflavour, $fw);
114
my $marchostsarray  = GetMarcHosts($record,$marcflavour);
114
my $marchostsarray  = GetMarcHosts($record,$marcflavour);
115
my $subtitle         = GetRecordValue('subtitle', $record, $fw);
115
my $subtitle         = GetRecordValue('subtitle', $record, $fw);
116
116
(-)a/cataloguing/value_builder/upload.pl (+179 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# Copyright 2011-2012 BibLibre
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use Modern::Perl;
21
use CGI qw/-utf8/;
22
use File::Basename;
23
24
use C4::Auth;
25
use C4::Context;
26
use C4::Output;
27
use C4::UploadedFiles;
28
29
my $upload_path = C4::Context->preference('uploadPath');
30
31
sub plugin_parameters {
32
    my ( $dbh, $record, $tagslib, $i, $tabloop ) = @_;
33
    return "";
34
}
35
36
sub plugin_javascript {
37
    my ( $dbh, $record, $tagslib, $field_number, $tabloop ) = @_;
38
    my $function_name = $field_number;
39
    my $res           = "
40
    <script type=\"text/javascript\">
41
        function Focus$function_name(subfield_managed) {
42
            return 1;
43
        }
44
45
        function Blur$function_name(subfield_managed) {
46
            return 1;
47
        }
48
49
        function Clic$function_name(index) {
50
            var id = document.getElementById(index).value;
51
            if(id.match(/id=([0-9a-f]+)/)){
52
                id = RegExp.\$1;
53
            }
54
            window.open(\"../cataloguing/plugin_launcher.pl?plugin_name=upload.pl&index=\"+index+\"&id=\"+id, 'upload', 'width=600,height=400,toolbar=false,scrollbars=no');
55
56
        }
57
    </script>
58
";
59
60
    return ( $function_name, $res );
61
}
62
63
sub plugin {
64
    my ($input) = @_;
65
    my $index = $input->param('index');
66
    my $id = $input->param('id');
67
    my $delete = $input->param('delete');
68
    my $uploaded_file = $input->param('uploaded_file');
69
70
    my $template_name = ($id || $delete)
71
                    ? "upload_delete_file.tt"
72
                    : "upload.tt";
73
74
    my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
75
        {   template_name   => "cataloguing/value_builder/$template_name",
76
            query           => $input,
77
            type            => "intranet",
78
            authnotrequired => 0,
79
            flagsrequired   => { editcatalogue => '*' },
80
            debug           => 1,
81
        }
82
    );
83
84
    # Dealing with the uploaded file
85
    if ($uploaded_file) {
86
        my $fh = $input->upload('uploaded_file');
87
        my $dir = $input->param('dir');
88
89
        $id = C4::UploadedFiles::UploadFile($uploaded_file, $dir, $fh->handle);
90
        if($id) {
91
            my $OPACBaseURL = C4::Context->preference('OPACBaseURL');
92
            $OPACBaseURL =~ s#/$##;
93
            my $return = "$OPACBaseURL/cgi-bin/koha/opac-retrieve-file.pl?id=$id";
94
            $template->param(
95
                success => 1,
96
                return => $return,
97
                uploaded_file => $uploaded_file,
98
            );
99
        } else {
100
            $template->param(error => 1);
101
        }
102
    } elsif ($delete || $id) {
103
        # If there's already a file uploaded for this field,
104
        # We handle its deletion
105
        if ($delete) {
106
            if(C4::UploadedFiles::DelUploadedFile($id)) {;
107
                $template->param(success => 1);
108
            } else {
109
                $template->param(error => 1);
110
            }
111
        }
112
    } else {
113
        my $filefield = CGI::filefield(
114
            -name => 'uploaded_file',
115
            -size => 50,
116
        );
117
118
        my $dirs_tree = [ {
119
            name => '/',
120
            value => '/',
121
            dirs => finddirs($upload_path)
122
        } ];
123
124
        $template->param(
125
            dirs_tree => $dirs_tree,
126
            filefield => $filefield
127
        );
128
    }
129
130
    $template->param(
131
        index => $index,
132
        id => $id
133
    );
134
135
    output_html_with_http_headers $input, $cookie, $template->output;
136
}
137
138
# Build a hierarchy of directories
139
sub finddirs {
140
    my $base = shift || $upload_path;
141
    my $found = 0;
142
    my @dirs;
143
    my @files = <$base/*>;
144
    foreach (@files) {
145
        if (-d $_ and -w $_) {
146
            my $lastdirname = basename($_);
147
            my $dirname =  $_;
148
            $dirname =~ s/^$upload_path//g;
149
            push @dirs, {
150
                value => $dirname,
151
                name => $lastdirname,
152
                dirs => finddirs($_)
153
            };
154
            $found = 1;
155
        };
156
    }
157
    return \@dirs;
158
}
159
160
1;
161
162
163
__END__
164
165
=head1 upload.pl
166
167
This plugin allow to upload files on the server and reference it in a marc
168
field.
169
170
Two system preference are used:
171
172
=over 4
173
174
=item * uploadPath: the real absolute path where files will be stored
175
176
=item * OPACBaseURL: for building URLs to be stored in MARC
177
178
=back
179
(-)a/installer/data/mysql/kohastructure.sql (+11 lines)
Lines 2687-2692 CREATE TABLE `bibliocoverimage` ( Link Here
2687
 CONSTRAINT `bibliocoverimage_fk1` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE
2687
 CONSTRAINT `bibliocoverimage_fk1` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE
2688
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2688
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2689
2689
2690
--
2691
-- Table structure for table uploaded_files
2692
--
2693
2694
DROP TABLE IF EXISTS uploaded_files
2695
CREATE TABLE uploaded_files (
2696
    id CHAR(40) NOT NULL PRIMARY KEY,
2697
    filename TEXT NOT NULL,
2698
    dir TEXT NOT NULL
2699
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2700
2690
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
2701
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
2691
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
2702
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
2692
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
2703
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
(-)a/installer/data/mysql/sysprefs.sql (+1 lines)
Lines 337-339 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES Link Here
337
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('BorrowerRenewalPeriodBase', 'now', 'Set whether the borrower renewal date should be counted from the dateexpiry or from the current date ','dateexpiry|now','Choice');
337
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('BorrowerRenewalPeriodBase', 'now', 'Set whether the borrower renewal date should be counted from the dateexpiry or from the current date ','dateexpiry|now','Choice');
338
INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ('AllowItemsOnHoldCheckout',0,'Do not generate RESERVE_WAITING and RESERVED warning when checking out items reserved to someone else. This allows self checkouts for those items.','','YesNo');
338
INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ('AllowItemsOnHoldCheckout',0,'Do not generate RESERVE_WAITING and RESERVED warning when checking out items reserved to someone else. This allows self checkouts for those items.','','YesNo');
339
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacExportOptions','bibtex|dc|marcxml|marc8|utf8|marcstd|mods|ris','Define export options available on OPAC detail page.','','free');
339
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacExportOptions','bibtex|dc|marcxml|marc8|utf8|marcstd|mods|ris','Define export options available on OPAC detail page.','','free');
340
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('uploadPath','','Sets the upload path for the upload.pl plugin','','');
(-)a/installer/data/mysql/updatedatabase.pl (+22 lines)
Lines 4719-4724 if (C4::Context->preference("Version") < TransformToNum($DBversion)) { Link Here
4719
    SetVersion ($DBversion);
4719
    SetVersion ($DBversion);
4720
}
4720
}
4721
4721
4722
$DBversion = "XXX";
4723
if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4724
    $dbh->do("
4725
        INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
4726
        VALUES('uploadPath','','Sets the upload path for the upload.pl plugin','','');
4727
    ");
4728
4729
    $dbh->do("
4730
        CREATE TABLE uploaded_files (
4731
            id CHAR(40) NOT NULL PRIMARY KEY,
4732
            filename TEXT NOT NULL,
4733
            dir TEXT NOT NULL
4734
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4735
    ");
4736
4737
    print "Upgrade to $DBversion done (New cataloging plugin upload.pl)\n";
4738
    print "This plugin comes with a new syspref (uploadPath) and a new table (uploaded_files)\n";
4739
    print "To use it, set 'uploadPath' and 'OPACBaseURL' system preferences and link this plugin to a subfield (856\$u for instance)\n";
4740
    SetVersion($DBversion);
4741
}
4742
4743
4722
=head1 FUNCTIONS
4744
=head1 FUNCTIONS
4723
4745
4724
=head2 DropAllForeignKeys($table)
4746
=head2 DropAllForeignKeys($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref (+4 lines)
Lines 90-95 Cataloging: Link Here
90
                  annual: generated in the form &lt;year&gt;-0001, &lt;year&gt;-0002.
90
                  annual: generated in the form &lt;year&gt;-0001, &lt;year&gt;-0002.
91
                  hbyymmincr: generated in the form &lt;branchcode&gt;yymm0001.
91
                  hbyymmincr: generated in the form &lt;branchcode&gt;yymm0001.
92
                  "OFF": not generated automatically.
92
                  "OFF": not generated automatically.
93
        -
94
            - Absolute path where to store files uploaded in MARC record (plugin upload.pl)
95
            - pref: uploadPath
96
              class: multi
93
    Display:
97
    Display:
94
        -
98
        -
95
            - 'Separate multiple displayed authors, series or subjects with '
99
            - 'Separate multiple displayed authors, series or subjects with '
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload.tt (+71 lines)
Line 0 Link Here
1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
<html xmlns="http://www.w3.org/1999/xhtml">
4
<head>
5
    <title>Upload plugin</title>
6
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
    <script type="text/javascript" src="[% themelang %]/lib/jquery/jquery.js"></script>
8
    <link rel="stylesheet" type="text/css" href="[% themelang %]/css/staff-global.css" />
9
10
</head>
11
<body>
12
[% IF ( success ) %]
13
14
    <script type="text/javascript">
15
        function report() {
16
            var doc   = opener.document;
17
            var field = doc.getElementById("[% index %]");
18
            field.value =  "[% return %]";
19
        }
20
        $(document).ready(function() {
21
            report();
22
        });
23
    </script>
24
25
26
    The file [% uploaded_file %] has been successfully uploaded.
27
    <p><input type="button" value="close" onclick="window.close();" /></p>
28
29
[% ELSE %]
30
31
    [% IF ( error ) %]
32
        <p>Error: Failed to upload file. See logs for details.</p>
33
        <input type="button" value="close" onclick="window.close();" />
34
    [% ELSE %]
35
        [%# This block display recursively a directory tree in variable 'dirs' %]
36
        [% BLOCK list_dirs %]
37
            [% IF dirs.size %]
38
                <ul>
39
                    [% FOREACH dir IN dirs %]
40
                        <li style="list-style-type:none">
41
                            <input type="radio" name="dir" id="[% dir.value %]" value="[% dir.value %]">
42
                                <label for="[% dir.value %]">
43
                                    [% IF (dir.name == '/') %]
44
                                        <em>(root)</em>
45
                                    [% ELSE %]
46
                                        [% dir.name %]
47
                                    [% END %]
48
                                </label>
49
                            </input>
50
                            [% INCLUDE list_dirs dirs=dir.dirs %]
51
                        </li>
52
                    [% END %]
53
                </ul>
54
            [% END %]
55
        [% END %]
56
57
        <h2>Please select the file to upload : </h2>
58
        <form method="post" enctype="multipart/form-data" action="/cgi-bin/koha/cataloguing/plugin_launcher.pl">
59
            [% filefield %]
60
            <h3>Choose where to upload file</h3>
61
            [% INCLUDE list_dirs dirs = dirs_tree %]
62
            <input type="hidden" name="plugin_name" value="upload.pl" />
63
            <input type="hidden" name="index" value="[% index %]" />
64
            <input type="submit">
65
        </form>
66
    [% END %]
67
68
[% END %]
69
70
</body>
71
</html>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload_delete_file.tt (+49 lines)
Line 0 Link Here
1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
<html xmlns="http://www.w3.org/1999/xhtml">
4
<head>
5
    <title>Upload plugin</title>
6
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
    <script type="text/javascript" src="[% themelang %]/lib/jquery/jquery.js"></script>
8
    <link rel="stylesheet" type="text/css" href="[% themelang %]/css/staff-global.css" />
9
10
</head>
11
<body>
12
[% IF ( success ) %]
13
14
    <script type="text/javascript">
15
        function report() {
16
            var doc   = opener.document;
17
            var field = doc.getElementById("[% index %]");
18
            field.value =  "";
19
        }
20
        $(document).ready(function() {
21
            report();
22
        });
23
    </script>
24
25
    The file has been successfully deleted.
26
    <p><input type="button" value="close" onclick="window.close();" /></p>
27
28
[% ELSE %]
29
30
    [% IF ( error ) %]
31
        Error: Unable to delete the file.
32
        <p><input type="button" value="close" onclick="window.close();" /></p>
33
    [% ELSE %]
34
        <h2>File deletion</h2>
35
        <p>A file has already been uploaded for this field. Do you want to delete it?</p>
36
        <form method="post" action="/cgi-bin/koha/cataloguing/plugin_launcher.pl">
37
        <input type="hidden" name="plugin_name" value="upload.pl" />
38
        <input type="hidden" name="delete" value="delete" />
39
        <input type="hidden" name="id" value="[% id %]" />
40
        <input type="hidden" name="index" value="[% index %]" />
41
        <input type="button" value="Cancel" onclick="javascript:window.close();" />
42
        <input type="submit" value="Delete" />
43
        </form>
44
    [% END %]
45
46
[% END %]
47
48
</body>
49
</html>
(-)a/opac/opac-basket.pl (-1 / +1 lines)
Lines 67-73 foreach my $biblionumber ( @bibs ) { Link Here
67
    my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
67
    my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
68
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
68
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
69
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
69
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
70
    my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
70
    my $marcurlsarray    = GetMarcUrls    ($record, $marcflavour, GetFrameworkCode($biblionumber));
71
    my @items            = &GetItemsLocationInfo( $biblionumber );
71
    my @items            = &GetItemsLocationInfo( $biblionumber );
72
    my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
72
    my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
73
73
(-)a/opac/opac-detail.pl (-1 / +1 lines)
Lines 540-546 my $marcisbnsarray = GetMarcISBN ($record,$marcflavour); Link Here
540
my $marcauthorsarray = GetMarcAuthors ($record,$marcflavour);
540
my $marcauthorsarray = GetMarcAuthors ($record,$marcflavour);
541
my $marcsubjctsarray = GetMarcSubjects($record,$marcflavour);
541
my $marcsubjctsarray = GetMarcSubjects($record,$marcflavour);
542
my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
542
my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
543
my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
543
my $marcurlsarray    = GetMarcUrls    ($record, $marcflavour, $dat->{'frameworkcode'});
544
my $marchostsarray  = GetMarcHosts($record,$marcflavour);
544
my $marchostsarray  = GetMarcHosts($record,$marcflavour);
545
my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
545
my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
546
546
(-)a/opac/opac-retrieve-file.pl (-1 / +49 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
3
# Copyright 2011-2012 BibLibre
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use Modern::Perl;
21
use CGI;
22
23
use C4::Context;
24
use C4::UploadedFiles;
25
26
my $input = new CGI;
27
28
my $id = $input->param('id');
29
my $file = C4::UploadedFiles::GetUploadedFile($id);
30
exit 1 if not $file;
31
32
my $upload_path = C4::Context->preference("uploadPath");
33
my $file_path = "$upload_path/$file->{dir}/$file->{filename}";
34
$file_path =~ s#/+#/#;
35
36
if( -f $file_path ) {
37
    open FH, '<', $file_path or die "Can't open file: $!";
38
    print $input->header(
39
        -type => "application/octet-stream",
40
        -attachment => $file->{filename}
41
    );
42
    while(<FH>) {
43
        print $_;
44
    }
45
} else {
46
    exit 1;
47
}
48
49
exit 0;

Return to bug 6874