X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=cataloguing%2Faddbiblio.pl;h=1e7cb61897378e923ed1d5abd6597c289755a32c;hb=fb449aaede3f23ee71e9e50286a26035bb3ef640;hp=51b3c7a7ec7443cddda4d753a89d54d52f69f99f;hpb=b60a8397c15a321cec37f6a3b2fa4612631a103e;p=koha.git diff --git a/cataloguing/addbiblio.pl b/cataloguing/addbiblio.pl index 51b3c7a7ec..1e7cb61897 100755 --- a/cataloguing/addbiblio.pl +++ b/cataloguing/addbiblio.pl @@ -6,22 +6,22 @@ # # 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. +# 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 3 of the License, or +# (at your option) any later version. # -# 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. +# 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. # -# You should have received a copy of the GNU General Public License along -# with Koha; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . use strict; #use warnings; FIXME - Bug 2505 -use CGI; +use CGI q(-utf8); use C4::Output; use C4::Auth; use C4::Biblio; @@ -30,11 +30,12 @@ use C4::AuthoritiesMarc; use C4::Context; use MARC::Record; use C4::Log; -use C4::Koha; # XXX subfield_is_koha_internal_p -use C4::Branch; # XXX subfield_is_koha_internal_p +use C4::Koha; +use C4::Branch; use C4::ClassSource; use C4::ImportBatch; use C4::Charset; +use Koha::BiblioFrameworks; use Date::Calc qw(Today); use MARC::File::USMARC; @@ -94,9 +95,10 @@ sub MARCfindbreeding { return -1; } else { - # normalize author : probably UNIMARC specific... + # normalize author : UNIMARC specific... if ( C4::Context->preference("z3950NormalizeAuthor") - and C4::Context->preference("z3950AuthorAuthFields") ) + and C4::Context->preference("z3950AuthorAuthFields") + and C4::Context->preference("marcflavour") eq 'UNIMARC' ) { my ( $tag, $subfield ) = GetMarcFromKohaField("biblio.author", ''); @@ -171,36 +173,30 @@ sub build_authorized_values_list { #---- branch if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) { #Use GetBranches($onlymine) - my $onlymine=C4::Context->preference('IndependantBranches') && - C4::Context->userenv && - C4::Context->userenv->{flags} % 2 == 0 && - C4::Context->userenv->{branch}; + my $onlymine = + C4::Context->preference('IndependentBranches') + && C4::Context->userenv + && !C4::Context->IsSuperLibrarian() + && C4::Context->userenv->{branch}; my $branches = GetBranches($onlymine); - my @branchloop; foreach my $thisbranch ( sort keys %$branches ) { push @authorised_values, $thisbranch; $authorised_lib{$thisbranch} = $branches->{$thisbranch}->{'branchname'}; } - #----- itemtypes } elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) { - my $sth = - $dbh->prepare( - "select itemtype,description from itemtypes order by description"); - $sth->execute; push @authorised_values, "" - unless ( $tagslib->{$tag}->{$subfield}->{defaultvalue} and $tagslib->{$tag}->{$subfield}->{mandatory} ); - + unless ( $tagslib->{$tag}->{$subfield}->{mandatory} + && ( $value || $tagslib->{$tag}->{$subfield}->{defaultvalue} ) ); + my $itemtype; - - while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) { - push @authorised_values, $itemtype; - $authorised_lib{$itemtype} = $description; + my $itemtypes = GetItemTypes( style => 'array' ); + for my $itemtype ( @$itemtypes ) { + push @authorised_values, $itemtype->{itemtype}; + $authorised_lib{$itemtype->{itemtype}} = $itemtype->{translated_description}; } $value = $itemtype unless ($value); - - #---- class_sources } elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "cn_source" ) { push @authorised_values, "" @@ -227,7 +223,8 @@ sub build_authorized_values_list { ); push @authorised_values, "" - unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); + unless ( $tagslib->{$tag}->{$subfield}->{mandatory} + && ( $value || $tagslib->{$tag}->{$subfield}->{defaultvalue} ) ); while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) { push @authorised_values, $value; @@ -235,18 +232,15 @@ sub build_authorized_values_list { } } $authorised_values_sth->finish; - return CGI::scrolling_list( - -name => "tag_".$tag."_subfield_".$subfield."_".$index_tag."_".$index_subfield, - -values => \@authorised_values, - -default => $value, - -labels => \%authorised_lib, - -override => 1, - -size => 1, - -multiple => 0, - -tabindex => 1, - -id => "tag_".$tag."_subfield_".$subfield."_".$index_tag."_".$index_subfield, - -class => "input_marceditor", - ); + return { + type => 'select', + id => "tag_".$tag."_subfield_".$subfield."_".$index_tag."_".$index_subfield, + name => "tag_".$tag."_subfield_".$subfield."_".$index_tag."_".$index_subfield, + default => $value, + values => \@authorised_values, + labels => \%authorised_lib, + }; + } =head2 CreateKey @@ -321,8 +315,7 @@ sub create_input { my %subfield_data = ( tag => $tag, subfield => $id_subfield, - marc_lib => substr( $tagslib->{$tag}->{$subfield}->{lib}, 0, 22 ), - marc_lib_plain => $tagslib->{$tag}->{$subfield}->{lib}, + marc_lib => $tagslib->{$tag}->{$subfield}->{lib}, tag_mandatory => $tagslib->{$tag}->{mandatory}, mandatory => $tagslib->{$tag}->{$subfield}->{mandatory}, repeatable => $tagslib->{$tag}->{$subfield}->{repeatable}, @@ -362,93 +355,78 @@ sub create_input { defined($tagslib->{$tag}->{'a'}->{authtypecode}) and $tagslib->{$tag}->{'a'}->{authtypecode} ne '') { - $subfield_data{marc_value} = - ""; + $subfield_data{marc_value} = { + type => 'text', + id => $subfield_data{id}, + name => $subfield_data{id}, + value => $value, + size => 5, + maxlength => $subfield_data{maxlength}, + readonly => 1, + }; # it's a thesaurus / authority field } elsif ( $tagslib->{$tag}->{$subfield}->{authtypecode} ) { # when authorities auto-creation is allowed, do not set readonly my $is_readonly = !C4::Context->preference("BiblioAddsAuthorities"); - $subfield_data{marc_value} = - " - {$tag}->{$subfield}->{authtypecode}."','biblio'); return false;\" tabindex=\"1\" title=\"Tag Editor\">\"Tag - "; + + $subfield_data{marc_value} = { + type => 'text', + id => $subfield_data{id}, + name => $subfield_data{id}, + value => $value, + size => 67, + maxlength => $subfield_data{maxlength}, + readonly => ($is_readonly) ? 1 : 0, + authtype => $tagslib->{$tag}->{$subfield}->{authtypecode}, + }; + # it's a plugin field - } - elsif ( $tagslib->{$tag}->{$subfield}->{'value_builder'} ) { - - # opening plugin. Just check whether we are on a developer computer on a production one - # (the cgidir differs) - my $cgidir = C4::Context->intranetdir . "/cgi-bin/cataloguing/value_builder"; - unless ( opendir( DIR, "$cgidir" ) ) { - $cgidir = C4::Context->intranetdir . "/cataloguing/value_builder"; - closedir( DIR ); - } - my $plugin = $cgidir . "/" . $tagslib->{$tag}->{$subfield}->{'value_builder'}; - if (do $plugin) { - my $extended_param = plugin_parameters( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop ); - my ( $function_name, $javascript ) = plugin_javascript( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop ); - - $subfield_data{marc_value} = - " - \"Tag - $javascript"; + } elsif ( $tagslib->{$tag}->{$subfield}->{'value_builder'} ) { + require Koha::FrameworkPlugin; + my $plugin = Koha::FrameworkPlugin->new( { + name => $tagslib->{$tag}->{$subfield}->{'value_builder'}, + }); + my $pars= { dbh => $dbh, record => $rec, tagslib => $tagslib, + id => $subfield_data{id}, tabloop => $tabloop }; + $plugin->build( $pars ); + if( !$plugin->errstr ) { + $subfield_data{marc_value} = { + type => 'text_complex', + id => $subfield_data{id}, + name => $subfield_data{id}, + value => $value, + size => 67, + maxlength => $subfield_data{maxlength}, + javascript => $plugin->javascript, + noclick => $plugin->noclick, + }; } else { - warn "Plugin Failed: $plugin"; + warn $plugin->errstr; # supply default input form - $subfield_data{marc_value} = - " - "; + $subfield_data{marc_value} = { + type => 'text', + id => $subfield_data{id}, + name => $subfield_data{id}, + value => $value, + size => 67, + maxlength => $subfield_data{maxlength}, + readonly => 0, + }; } - # it's an hidden field - } - elsif ( $tag eq '' ) { - $subfield_data{marc_value} = - " - "; + + # it's an hidden field + } elsif ( $tag eq '' ) { + $subfield_data{marc_value} = { + type => 'hidden', + id => $subfield_data{id}, + name => $subfield_data{id}, + value => $value, + size => 67, + maxlength => $subfield_data{maxlength}, + }; + } else { # it's a standard field @@ -462,28 +440,25 @@ sub create_input { && C4::Context->preference("marcflavour") eq "MARC21" ) ) { - $subfield_data{marc_value} = - " - "; + $subfield_data{marc_value} = { + type => 'textarea', + id => $subfield_data{id}, + name => $subfield_data{id}, + value => $value, + }; + } else { - $subfield_data{marc_value} = - " - "; + $subfield_data{marc_value} = { + type => 'text', + id => $subfield_data{id}, + name => $subfield_data{id}, + value => $value, + size => 67, + maxlength => $subfield_data{maxlength}, + readonly => 0, + }; + } } $subfield_data{'index_subfield'} = $index_subfield; @@ -661,8 +636,8 @@ sub build_tabs { foreach my $subfield ( sort( keys %{ $tagslib->{$tag} } ) ) { next if ( length $subfield != 1 ); next - if ( ( $tagslib->{$tag}->{$subfield}->{hidden} <= -5 ) - or ( $tagslib->{$tag}->{$subfield}->{hidden} >= 4 ) ) + if ( ( $tagslib->{$tag}->{$subfield}->{hidden} <= -4 ) + or ( $tagslib->{$tag}->{$subfield}->{hidden} >= 5 ) ) and not ( $subfield eq "9" and exists($tagslib->{$tag}->{'a'}->{authtypecode}) and defined($tagslib->{$tag}->{'a'}->{authtypecode}) and @@ -723,6 +698,7 @@ my $op = $input->param('op'); my $mode = $input->param('mode'); my $frameworkcode = $input->param('frameworkcode'); my $redirect = $input->param('redirect'); +my $searchid = $input->param('searchid'); my $dbh = C4::Context->dbh; my $hostbiblionumber = $input->param('hostbiblionumber'); my $hostitemnumber = $input->param('hostitemnumber'); @@ -734,13 +710,15 @@ my $fa_stickyduedate = $input->param('stickyduedate'); my $fa_duedatespec = $input->param('duedatespec'); my $userflags = 'edit_catalogue'; -if ($frameworkcode eq 'FA'){ - $userflags = 'fast_cataloging'; -} +my $changed_framework = $input->param('changed_framework'); $frameworkcode = &GetFrameworkCode($biblionumber) if ( $biblionumber and not($frameworkcode) and $op ne 'addbiblio' ); +if ($frameworkcode eq 'FA'){ + $userflags = 'fast_cataloging'; +} + $frameworkcode = '' if ( $frameworkcode eq 'Default' ); my ( $template, $loggedinuser, $cookie ) = get_template_and_user( { @@ -761,23 +739,15 @@ if ($frameworkcode eq 'FA'){ 'stickyduedate' => $fa_stickyduedate, 'duedatespec' => $fa_duedatespec, ); +} elsif ( C4::Context->preference('EnableAdvancedCatalogingEditor') && $input->cookie( 'catalogue_editor_' . $loggedinuser ) eq 'advanced' && !$breedingid ) { + # Only use the advanced editor for non-fast-cataloging. + # breedingid is not handled because those would only come off a Z39.50 + # search initiated by the basic editor. + print $input->redirect( '/cgi-bin/koha/cataloguing/editor.pl' . ( $biblionumber ? ( '#catalog/' . $biblionumber ) : '' ) ); } -# Getting the list of all frameworks -# get framework list -my $frameworks = getframeworks; -my @frameworkcodeloop; -foreach my $thisframeworkcode ( keys %$frameworks ) { - my %row = ( - value => $thisframeworkcode, - frameworktext => $frameworks->{$thisframeworkcode}->{'frameworktext'}, - ); - if ($frameworkcode eq $thisframeworkcode){ - $row{'selected'} = 1; - } - push @frameworkcodeloop, \%row; -} -$template->param( frameworkcodeloop => \@frameworkcodeloop, +my $frameworkcodeloop = Koha::BiblioFrameworks->search({}, { order_by => ['frameworktext'] }); +$template->param( frameworkcodeloop => $frameworkcodeloop , breedingid => $breedingid ); # ++ Global @@ -793,7 +763,6 @@ my ( $biblionumbertagsubfield, $biblioitemnumtagfield, $biblioitemnumtagsubfield, - $bibitem, $biblioitemnumber ); @@ -818,6 +787,7 @@ if ($hostbiblionumber) { if ($parentbiblio) { my $marcflavour = C4::Context->preference('marcflavour'); $record = MARC::Record->new(); + SetMarcUnicodeFlag($record, $marcflavour); my $hostfield = prepare_host_field($parentbiblio,$marcflavour); if ($hostfield) { $record->append_fields($hostfield); @@ -828,7 +798,8 @@ $is_a_modif = 0; if ($biblionumber) { $is_a_modif = 1; - $template->param( title => $record->title(), ); + my $title = C4::Context->preference('marcflavour') eq "UNIMARC" ? $record->subfield('200', 'a') : $record->title; + $template->param( title => $title ); # if it's a modif, retrieve bibli and biblioitem numbers for the future modification of old-DB. ( $biblionumbertagfield, $biblionumbertagsubfield ) = @@ -849,8 +820,8 @@ if ( $op eq "addbiblio" ) { biblionumberdata => $biblionumber, ); # getting html input - my @params = $input->param(); - $record = TransformHtmlToMarc( $input ); + my @params = $input->multi_param(); + $record = TransformHtmlToMarc( $input, 1 ); # check for a duplicate my ( $duplicatebiblionumber, $duplicatetitle ); if ( !$is_a_modif ) { @@ -859,10 +830,9 @@ if ( $op eq "addbiblio" ) { my $confirm_not_duplicate = $input->param('confirm_not_duplicate'); # it is not a duplicate (determined either by Koha itself or by user checking it's not a duplicate) if ( !$duplicatebiblionumber or $confirm_not_duplicate ) { - my $oldbibnum; my $oldbibitemnum; if (C4::Context->preference("BiblioAddsAuthorities")){ - my ($countlinked,$countcreated)=BiblioAutoLink($record,$frameworkcode); + BiblioAutoLink( $record, $frameworkcode ); } if ( $is_a_modif ) { ModBiblioframework( $biblionumber, $frameworkcode ); @@ -871,7 +841,7 @@ if ( $op eq "addbiblio" ) { else { ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode ); } - if ($redirect eq "items" || ($mode ne "popup" && !$is_a_modif && $redirect ne "view")){ + if ($redirect eq "items" || ($mode ne "popup" && !$is_a_modif && $redirect ne "view" && $redirect ne "just_save")){ if ($frameworkcode eq 'FA'){ print $input->redirect( '/cgi-bin/koha/cataloguing/additem.pl?' @@ -879,7 +849,7 @@ if ( $op eq "addbiblio" ) { .'&frameworkcode='.$frameworkcode .'&circborrowernumber='.$fa_circborrowernumber .'&branch='.$fa_branch - .'&barcode='.uri_escape($fa_barcode) + .'&barcode='.uri_escape_utf8($fa_barcode) .'&stickyduedate='.$fa_stickyduedate .'&duedatespec='.$fa_duedatespec ); @@ -887,34 +857,40 @@ if ( $op eq "addbiblio" ) { } else { print $input->redirect( - "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode" + "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid" ); exit; } } - elsif($is_a_modif || $redirect eq "view"){ + elsif(($is_a_modif || $redirect eq "view") && $redirect ne "just_save"){ my $defaultview = C4::Context->preference('IntranetBiblioDefaultView'); my $views = { C4::Search::enabled_staff_search_views }; if ($defaultview eq 'isbd' && $views->{can_view_ISBD}) { - print $input->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber"); + print $input->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); } elsif ($defaultview eq 'marc' && $views->{can_view_MARC}) { - print $input->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode"); + print $input->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid"); } elsif ($defaultview eq 'labeled_marc' && $views->{can_view_labeledMARC}) { - print $input->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber"); + print $input->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); } else { - print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber"); + print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber&searchid=$searchid"); } exit; - } - else { + } + elsif ($redirect eq "just_save"){ + my $tab = $input->param('current_tab'); + print $input->redirect("/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=$biblionumber&framework=$frameworkcode&tab=$tab&searchid=$searchid"); + } + else { $template->param( biblionumber => $biblionumber, done =>1, popup =>1 ); - $template->param( title => $record->subfield('200',"a") ) if ($record ne "-1" && C4::Context->preference('marcflavour') =~/unimarc/i); - $template->param( title => $record->title() ) if ($record ne "-1" && C4::Context->preference('marcflavour') eq "usmarc"); + if ( $record ne '-1' ) { + my $title = C4::Context->preference('marcflavour') eq "UNIMARC" ? $record->subfield('200', 'a') : $record->title; + $template->param( title => $title ); + } $template->param( popup => $mode, itemtype => $frameworkcode, @@ -958,7 +934,10 @@ elsif ( $op eq "delete" ) { $biblionumber = ""; } - if ( $record ne -1 ) { + if($changed_framework eq "changed"){ + $record = TransformHtmlToMarc( $input, 1 ); + } + elsif( $record ne -1 ) { #FIXME: it's kind of silly to go from MARC::Record to MARC::File::XML and then back again just to fix the encoding eval { my $uxml = $record->as_xml; @@ -981,12 +960,17 @@ elsif ( $op eq "delete" ) { ); } -$template->param( title => $record->title() ) if ( $record ne "-1" ); +if ( $record ne '-1' ) { + my $title = C4::Context->preference('marcflavour') eq "UNIMARC" ? $record->subfield('200', 'a') : $record->title; + $template->param( title => $title ); +} $template->param( popup => $mode, frameworkcode => $frameworkcode, itemtype => $frameworkcode, - borrowernumber => $loggedinuser, + borrowernumber => $loggedinuser, + tab => scalar $input->param('tab') ); +$template->{'VARS'}->{'searchid'} = $searchid; output_html_with_http_headers $input, $cookie, $template->output;