Bugzilla – Attachment 125802 Details for
Bug 28445
Use the task queue for the batch delete and update items tool
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 28445: Move controller code to Koha::UI::Form::Builder::Item
Bug-28445-Move-controller-code-to-KohaUIFormBuilde.patch (text/plain), 35.63 KB, created by
Jonathan Druart
on 2021-10-06 13:34:04 UTC
(
hide
)
Description:
Bug 28445: Move controller code to Koha::UI::Form::Builder::Item
Filename:
MIME Type:
Creator:
Jonathan Druart
Created:
2021-10-06 13:34:04 UTC
Size:
35.63 KB
patch
obsolete
>From 132537ef47fed8fa06462456730b5ceac18be871 Mon Sep 17 00:00:00 2001 >From: Jonathan Druart <jonathan.druart@bugs.koha-community.org> >Date: Mon, 26 Jul 2021 18:26:32 +0200 >Subject: [PATCH] Bug 28445: Move controller code to > Koha::UI::Form::Builder::Item > >To ease reusability >--- > Koha/UI/Form/Builder/Item.pm | 464 +++++++++++++++++++++++++++++++++++ > cataloguing/additem.pl | 373 +++------------------------- > 2 files changed, 492 insertions(+), 345 deletions(-) > create mode 100644 Koha/UI/Form/Builder/Item.pm > >diff --git a/Koha/UI/Form/Builder/Item.pm b/Koha/UI/Form/Builder/Item.pm >new file mode 100644 >index 00000000000..49683b8c027 >--- /dev/null >+++ b/Koha/UI/Form/Builder/Item.pm >@@ -0,0 +1,464 @@ >+package Koha::UI::Form::Builder::Item; >+ >+# 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 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. >+# >+# You should have received a copy of the GNU General Public License >+# along with Koha; if not, see <http://www.gnu.org/licenses>. >+ >+use Modern::Perl; >+use C4::Context; >+use C4::Biblio qw( GetFrameworkCode GetMarcBiblio GetMarcStructure IsMarcStructureInternal ); >+use C4::Koha qw( GetAuthorisedValues ); >+use C4::ClassSource qw( GetClassSources ); >+ >+use Koha::DateUtils qw( dt_from_string ); >+use Koha::Libraries; >+ >+sub new { >+ my ( $class, $params ) = @_; >+ >+ my $self; >+ $self->{biblionumber} = $params->{biblionumber}; >+ $self->{item} = $params->{item}; >+ >+ bless $self, $class; >+ return $self; >+} >+ >+sub generate_subfield_form { >+ >+ my ($self, $params) = @_; >+ my $tag = $params->{tag}; >+ my $subfieldtag = $params->{subfieldtag}; >+ my $value = $params->{value}; >+ my $tagslib = $params->{tagslib}; >+ my $libraries = $params->{libraries}; >+ my $marc_record = $params->{marc_record}; >+ my $restricted_edition = $params->{restricted_editition}; >+ >+ my $item = $self->{item}; >+ my $subfield = $tagslib->{$tag}{$subfieldtag}; >+ my $biblionumber = $self->{biblionumber}; >+ >+ my $frameworkcode = $biblionumber ? GetFrameworkCode($biblionumber) : q{}; >+ >+ my %subfield_data; >+ my $dbh = C4::Context->dbh; >+ >+ my $index_subfield = int( rand(1000000) ); >+ if ( $subfieldtag eq '@' ) { >+ $subfield_data{id} = "tag_" . $tag . "_subfield_00_" . $index_subfield; >+ } >+ else { >+ $subfield_data{id} = >+ "tag_" . $tag . "_subfield_" . $subfieldtag . "_" . $index_subfield; >+ } >+ >+ $subfield_data{tag} = $tag; >+ $subfield_data{subfield} = $subfieldtag; >+ $subfield_data{marc_lib} = >+ "<span title=\"" >+ . $subfield->{lib} . "\">" >+ . $subfield->{lib} >+ . "</span>"; >+ $subfield_data{mandatory} = $subfield->{mandatory}; >+ $subfield_data{important} = $subfield->{important}; >+ $subfield_data{repeatable} = $subfield->{repeatable}; >+ $subfield_data{maxlength} = $subfield->{maxlength}; >+ $subfield_data{display_order} = $subfield->{display_order}; >+ $subfield_data{kohafield} = >+ $subfield->{kohafield} || 'items.more_subfields_xml'; >+ >+ if ( !defined($value) || $value eq '' ) { >+ $value = $subfield->{defaultvalue}; >+ if ($value) { >+ >+# get today date & replace <<YYYY>>, <<YY>>, <<MM>>, <<DD>> if provided in the default value >+ my $today_dt = dt_from_string; >+ my $year = $today_dt->strftime('%Y'); >+ my $shortyear = $today_dt->strftime('%y'); >+ my $month = $today_dt->strftime('%m'); >+ my $day = $today_dt->strftime('%d'); >+ $value =~ s/<<YYYY>>/$year/g; >+ $value =~ s/<<YY>>/$shortyear/g; >+ $value =~ s/<<MM>>/$month/g; >+ $value =~ s/<<DD>>/$day/g; >+ >+ # And <<USER>> with surname (?) >+ my $username = ( >+ C4::Context->userenv >+ ? C4::Context->userenv->{'surname'} >+ : "superlibrarian" >+ ); >+ $value =~ s/<<USER>>/$username/g; >+ } >+ } >+ >+ $subfield_data{visibility} = "display:none;" >+ if ( ( $subfield->{hidden} > 4 ) || ( $subfield->{hidden} <= -4 ) ); >+ >+ my $pref_itemcallnumber = C4::Context->preference('itemcallnumber'); >+ if ( !$value >+ && $subfield->{kohafield} eq 'items.itemcallnumber' >+ && $pref_itemcallnumber ) >+ { >+ foreach >+ my $pref_itemcallnumber_part ( split( /,/, $pref_itemcallnumber ) ) >+ { >+ my $CNtag = >+ substr( $pref_itemcallnumber_part, 0, 3 ); # 3-digit tag number >+ my $CNsubfields = >+ substr( $pref_itemcallnumber_part, 3 ); # Any and all subfields >+ $CNsubfields = undef if $CNsubfields eq ''; >+ my $temp2 = $marc_record->field($CNtag); >+ >+ next unless $temp2; >+ $value = $temp2->as_string( $CNsubfields, ' ' ); >+ last if $value; >+ } >+ } >+ >+ my $default_location = C4::Context->preference('NewItemsDefaultLocation'); >+ if ( !$value >+ && $subfield->{kohafield} eq 'items.location' >+ && $default_location ) >+ { >+ $value = $default_location; >+ } >+ >+ if ( $frameworkcode eq 'FA' >+ && $subfield->{kohafield} eq 'items.barcode' >+ && !$value ) >+ { >+ my $input = CGI->new; >+ $value = $input->param('barcode'); >+ } >+ >+ if ( $subfield->{authorised_value} ) { >+ my @authorised_values; >+ my %authorised_lib; >+ >+ # builds list, depending on authorised value... >+ if ( $subfield->{authorised_value} eq "LOST" ) { >+ my $ClaimReturnedLostValue = >+ C4::Context->preference('ClaimReturnedLostValue'); >+ my $item_is_return_claim = >+ $ClaimReturnedLostValue >+ && exists $item->{itemlost} >+ && $ClaimReturnedLostValue eq $item->{itemlost}; >+ $subfield_data{IS_RETURN_CLAIM} = $item_is_return_claim; >+ >+ $subfield_data{IS_LOST_AV} = 1; >+ >+ push @authorised_values, qq{}; >+ my $av = GetAuthorisedValues( $subfield->{authorised_value} ); >+ for my $r (@$av) { >+ push @authorised_values, $r->{authorised_value}; >+ $authorised_lib{ $r->{authorised_value} } = $r->{lib}; >+ } >+ } >+ elsif ( $subfield->{authorised_value} eq "branches" ) { >+ foreach my $thisbranch (@$libraries) { >+ push @authorised_values, $thisbranch->{branchcode}; >+ $authorised_lib{ $thisbranch->{branchcode} } = >+ $thisbranch->{branchname}; >+ $value = $thisbranch->{branchcode} >+ if $thisbranch->{selected} && !$value; >+ } >+ } >+ elsif ( $subfield->{authorised_value} eq "itemtypes" ) { >+ push @authorised_values, ""; >+ my $branch_limit = >+ C4::Context->userenv && C4::Context->userenv->{"branch"}; >+ my $itemtypes; >+ if ($branch_limit) { >+ $itemtypes = Koha::ItemTypes->search_with_localization( >+ { branchcode => $branch_limit } ); >+ } >+ else { >+ $itemtypes = Koha::ItemTypes->search_with_localization; >+ } >+ while ( my $itemtype = $itemtypes->next ) { >+ push @authorised_values, $itemtype->itemtype; >+ $authorised_lib{ $itemtype->itemtype } = >+ $itemtype->translated_description; >+ } >+ >+ unless ($value) { >+ my $itype_sth = $dbh->prepare( >+ "SELECT itemtype FROM biblioitems WHERE biblionumber = ?"); >+ $itype_sth->execute($biblionumber); >+ ($value) = $itype_sth->fetchrow_array; >+ } >+ >+ #---- class_sources >+ } >+ elsif ( $subfield->{authorised_value} eq "cn_source" ) { >+ push @authorised_values, ""; >+ >+ my $class_sources = GetClassSources(); >+ my $default_source = >+ C4::Context->preference("DefaultClassificationSource"); >+ >+ foreach my $class_source ( sort keys %$class_sources ) { >+ next >+ unless $class_sources->{$class_source}->{'used'} >+ or ( $value and $class_source eq $value ) >+ or ( $class_source eq $default_source ); >+ push @authorised_values, $class_source; >+ $authorised_lib{$class_source} = >+ $class_sources->{$class_source}->{'description'}; >+ } >+ $value = $default_source unless ($value); >+ >+ #---- "true" authorised value >+ } >+ else { >+ push @authorised_values, qq{}; >+ my $av = GetAuthorisedValues( $subfield->{authorised_value} ); >+ for my $r (@$av) { >+ push @authorised_values, $r->{authorised_value}; >+ $authorised_lib{ $r->{authorised_value} } = $r->{lib}; >+ } >+ } >+ >+ if ( $subfield->{hidden} > 4 or $subfield->{hidden} <= -4 ) { >+ $subfield_data{marc_value} = { >+ type => 'hidden', >+ id => $subfield_data{id}, >+ maxlength => $subfield_data{maxlength}, >+ value => $value, >+ ( >+ ( >+ grep { $_ eq $subfield->{authorised_value} } >+ (qw(branches itemtypes cn_source)) >+ ) ? () : ( category => $subfield->{authorised_value} ) >+ ), >+ }; >+ } >+ else { >+ $subfield_data{marc_value} = { >+ type => 'select', >+ id => "tag_" >+ . $tag >+ . "_subfield_" >+ . $subfieldtag . "_" >+ . $index_subfield, >+ values => \@authorised_values, >+ labels => \%authorised_lib, >+ default => $value, >+ ( >+ ( >+ grep { $_ eq $subfield->{authorised_value} } >+ (qw(branches itemtypes cn_source)) >+ ) ? () : ( category => $subfield->{authorised_value} ) >+ ), >+ }; >+ } >+ } >+ >+ # it's a thesaurus / authority field >+ elsif ( $subfield->{authtypecode} ) { >+ $subfield_data{marc_value} = { >+ type => 'text_auth', >+ id => $subfield_data{id}, >+ maxlength => $subfield_data{maxlength}, >+ value => $value, >+ authtypecode => $subfield->{authtypecode}, >+ }; >+ } >+ >+ # it's a plugin field >+ elsif ( $subfield->{value_builder} ) { # plugin >+ require Koha::FrameworkPlugin; >+ my $plugin = Koha::FrameworkPlugin->new( >+ { >+ name => $subfield->{'value_builder'}, >+ item_style => 1, >+ } >+ ); >+ my $pars = { >+ dbh => $dbh, >+ record => $marc_record, >+ tagslib => $tagslib, >+ id => $subfield_data{id}, >+ }; >+ $plugin->build($pars); >+ if ( !$plugin->errstr ) { >+ my $class = 'buttonDot' . ( $plugin->noclick ? ' disabled' : '' ); >+ $subfield_data{marc_value} = { >+ type => 'text_plugin', >+ id => $subfield_data{id}, >+ maxlength => $subfield_data{maxlength}, >+ value => $value, >+ class => $class, >+ nopopup => $plugin->noclick, >+ javascript => $plugin->javascript, >+ }; >+ } >+ else { >+ warn $plugin->errstr; >+ $subfield_data{marc_value} = { >+ type => 'text', >+ id => $subfield_data{id}, >+ maxlength => $subfield_data{maxlength}, >+ value => $value, >+ }; # supply default input form >+ } >+ } >+ elsif ( $tag eq '' ) { # it's an hidden field >+ $subfield_data{marc_value} = { >+ type => 'hidden', >+ id => $subfield_data{id}, >+ maxlength => $subfield_data{maxlength}, >+ value => $value, >+ }; >+ } >+ elsif ( $subfield->{'hidden'} ) >+ { # FIXME: shouldn't input type be "hidden" ? >+ $subfield_data{marc_value} = { >+ type => 'text', >+ id => $subfield_data{id}, >+ maxlength => $subfield_data{maxlength}, >+ value => $value, >+ }; >+ } >+ elsif ( >+ ( $value and length($value) > 100 ) >+ or ( C4::Context->preference("marcflavour") eq "UNIMARC" >+ and 300 <= $tag && $tag < 400 && $subfieldtag eq 'a' ) >+ or ( C4::Context->preference("marcflavour") eq "MARC21" >+ and 500 <= $tag && $tag < 600 ) >+ ) >+ { >+ # oversize field (textarea) >+ $subfield_data{marc_value} = { >+ type => 'textarea', >+ id => $subfield_data{id}, >+ value => $value, >+ }; >+ } >+ else { >+ # it's a standard field >+ $subfield_data{marc_value} = { >+ type => 'text', >+ id => $subfield_data{id}, >+ maxlength => $subfield_data{maxlength}, >+ value => $value, >+ }; >+ } >+ >+ # Getting list of subfields to keep when restricted editing is enabled >+ # FIXME Improve the following block, no need to do it for every subfields >+ my $subfieldsToAllowForRestrictedEditing = >+ C4::Context->preference('SubfieldsToAllowForRestrictedEditing'); >+ my $allowAllSubfields = ( >+ not defined $subfieldsToAllowForRestrictedEditing >+ or $subfieldsToAllowForRestrictedEditing eq q|| >+ ) ? 1 : 0; >+ my @subfieldsToAllow = split( / /, $subfieldsToAllowForRestrictedEditing ); >+ >+# If we're on restricted editing, and our field is not in the list of subfields to allow, >+# then it is read-only >+ $subfield_data{marc_value}->{readonly} = >+ ( not $allowAllSubfields >+ and $restricted_edition >+ and !grep { $tag . '$' . $subfieldtag eq $_ } @subfieldsToAllow ) >+ ? 1 >+ : 0; >+ >+ return \%subfield_data; >+} >+ >+sub edit_form { >+ my ( $self, $params ) = @_; >+ >+ my $branchcode = $params->{branchcode}; >+ my $restricted_edition = $params->{restricted_editition}; >+ my $subfields_to_prefill = $params->{subfields_to_prefill} || []; >+ my $libraries = >+ Koha::Libraries->search( {}, { order_by => ['branchname'] } )->unblessed; >+ for my $library (@$libraries) { >+ $library->{selected} = 1 if $library->{branchcode} eq $branchcode; >+ } >+ >+ my $item = $self->{item}; >+ my $biblionumber = $self->{biblionumber}; >+ my $frameworkcode = $biblionumber ? GetFrameworkCode($biblionumber) : q{}; >+ my $marc_record = $biblionumber ? GetMarcBiblio( { biblionumber => $biblionumber } ) : undef; >+ my @subfields; >+ my $tagslib = GetMarcStructure( 1, $frameworkcode ); >+ foreach my $tag ( keys %{$tagslib} ) { >+ >+ foreach my $subfieldtag ( keys %{ $tagslib->{$tag} } ) { >+ >+ my $subfield = $tagslib->{$tag}{$subfieldtag}; >+ >+ next if IsMarcStructureInternal($subfield); >+ next if ( $subfield->{tab} ne "10" ); >+ >+ my @values = (); >+ >+ my $subfield_data; >+ >+ if ( >+ !@$subfields_to_prefill >+ || ( @$subfields_to_prefill && grep { $_ eq $subfieldtag } >+ @$subfields_to_prefill ) >+ ) >+ { >+ my $kohafield = $subfield->{kohafield}; >+ if ($kohafield) { >+ >+ # This is a mapped field >+ ( my $attribute = $kohafield ) =~ s|^items\.||; >+ push @values, $subfield->{repeatable} >+ ? split '\s\|\s', $item->{$attribute} >+ : $item->{$attribute} >+ if defined $item->{$attribute}; >+ } >+ else { >+ # Not mapped, picked the values from more_subfields_xml's MARC >+ my $marc_more = $item->{marc_more_subfields_xml}; >+ if ($marc_more) { >+ for my $f ( $marc_more->fields($tag) ) { >+ push @values, $f->subfield($subfieldtag); >+ } >+ } >+ } >+ } >+ >+ @values = ('') unless @values; >+ >+ for my $value (@values) { >+ my $subfield_data = $self->generate_subfield_form( >+ {tag => $tag, subfieldtag => $subfieldtag, value => $value, >+ tagslib => $tagslib, libraries => $libraries, >+ marc_record => $marc_record, restricted_edition => $restricted_edition, >+ }); >+ push @subfields, $subfield_data; >+ $i++; >+ } >+ } >+ } >+ >+ @subfields = sort { >+ $a->{display_order} <=> $b->{display_order} >+ || $a->{subfield} cmp $b->{subfield} >+ } @subfields; >+ >+ return \@subfields; >+ >+} >+ >+1; >diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl >index 3546e3c9580..2d840a0bc88 100755 >--- a/cataloguing/additem.pl >+++ b/cataloguing/additem.pl >@@ -34,8 +34,6 @@ use C4::Biblio qw( > ); > use C4::Context; > use C4::Circulation qw( barcodedecode LostItem ); >-use C4::Koha qw( GetAuthorisedValues ); >-use C4::ClassSource qw( GetClassSources GetClassSource ); > use C4::Barcodes; > use C4::Barcodes::ValueBuilder; > use Koha::DateUtils qw( dt_from_string ); >@@ -48,6 +46,7 @@ use C4::Search qw( enabled_staff_search_views ); > use Storable qw( freeze thaw ); > use URI::Escape qw( uri_escape_utf8 ); > use C4::Members; >+use Koha::UI::Form::Builder::Item; > > use MARC::File::XML; > use URI::Escape qw( uri_escape_utf8 ); >@@ -58,276 +57,6 @@ use List::MoreUtils qw( any uniq ); > > our $dbh = C4::Context->dbh; > >-sub generate_subfield_form { >- my ($tag, $subfieldtag, $value, $tagslib,$subfieldlib, $branches, $biblionumber, $temp, $i, $restrictededition, $item) = @_; >- >- my $frameworkcode = &GetFrameworkCode($biblionumber); >- >- $item //= {}; >- >- my %subfield_data; >- my $dbh = C4::Context->dbh; >- >- my $index_subfield = int(rand(1000000)); >- if ($subfieldtag eq '@'){ >- $subfield_data{id} = "tag_".$tag."_subfield_00_".$index_subfield; >- } else { >- $subfield_data{id} = "tag_".$tag."_subfield_".$subfieldtag."_".$index_subfield; >- } >- >- $subfield_data{tag} = $tag; >- $subfield_data{subfield} = $subfieldtag; >- $subfield_data{marc_lib} ="<span id=\"error$i\" title=\"".$subfieldlib->{lib}."\">".$subfieldlib->{lib}."</span>"; >- $subfield_data{mandatory} = $subfieldlib->{mandatory}; >- $subfield_data{important} = $subfieldlib->{important}; >- $subfield_data{repeatable} = $subfieldlib->{repeatable}; >- $subfield_data{maxlength} = $subfieldlib->{maxlength}; >- $subfield_data{display_order} = $subfieldlib->{display_order}; >- $subfield_data{kohafield} = $subfieldlib->{kohafield} || 'items.more_subfields_xml'; >- >- if ( ! defined( $value ) || $value eq '') { >- $value = $subfieldlib->{defaultvalue}; >- if ( $value ) { >- # get today date & replace <<YYYY>>, <<YY>>, <<MM>>, <<DD>> if provided in the default value >- my $today_dt = dt_from_string; >- my $year = $today_dt->strftime('%Y'); >- my $shortyear = $today_dt->strftime('%y'); >- my $month = $today_dt->strftime('%m'); >- my $day = $today_dt->strftime('%d'); >- $value =~ s/<<YYYY>>/$year/g; >- $value =~ s/<<YY>>/$shortyear/g; >- $value =~ s/<<MM>>/$month/g; >- $value =~ s/<<DD>>/$day/g; >- # And <<USER>> with surname (?) >- my $username=(C4::Context->userenv?C4::Context->userenv->{'surname'}:"superlibrarian"); >- $value=~s/<<USER>>/$username/g; >- } >- } >- >- $subfield_data{visibility} = "display:none;" if (($subfieldlib->{hidden} > 4) || ($subfieldlib->{hidden} <= -4)); >- >- my $pref_itemcallnumber = C4::Context->preference('itemcallnumber'); >- if (!$value && $subfieldlib->{kohafield} eq 'items.itemcallnumber' && $pref_itemcallnumber) { >- foreach my $pref_itemcallnumber_part (split(/,/, $pref_itemcallnumber)){ >- my $CNtag = substr( $pref_itemcallnumber_part, 0, 3 ); # 3-digit tag number >- my $CNsubfields = substr( $pref_itemcallnumber_part, 3 ); # Any and all subfields >- $CNsubfields = undef if $CNsubfields eq ''; >- my $temp2 = $temp->field($CNtag); >- >- next unless $temp2; >- $value = $temp2->as_string( $CNsubfields, ' ' ); >- last if $value; >- } >- } >- >- my $default_location = C4::Context->preference('NewItemsDefaultLocation'); >- if ( !$value && $subfieldlib->{kohafield} eq 'items.location' && $default_location ) { >- $value = $default_location; >- } >- >- if ($frameworkcode eq 'FA' && $subfieldlib->{kohafield} eq 'items.barcode' && !$value){ >- my $input = CGI->new; >- $value = $input->param('barcode'); >- } >- >- if ( $subfieldlib->{authorised_value} ) { >- my @authorised_values; >- my %authorised_lib; >- # builds list, depending on authorised value... >- if ( $subfieldlib->{authorised_value} eq "LOST" ) { >- my $ClaimReturnedLostValue = C4::Context->preference('ClaimReturnedLostValue'); >- my $item_is_return_claim = $ClaimReturnedLostValue && exists $item->{itemlost} && $ClaimReturnedLostValue eq $item->{itemlost}; >- $subfield_data{IS_RETURN_CLAIM} = $item_is_return_claim; >- >- $subfield_data{IS_LOST_AV} = 1; >- >- push @authorised_values, qq{}; >- my $av = GetAuthorisedValues( $subfieldlib->{authorised_value} ); >- for my $r ( @$av ) { >- push @authorised_values, $r->{authorised_value}; >- $authorised_lib{$r->{authorised_value}} = $r->{lib}; >- } >- } >- elsif ( $subfieldlib->{authorised_value} eq "branches" ) { >- foreach my $thisbranch (@$branches) { >- push @authorised_values, $thisbranch->{branchcode}; >- $authorised_lib{$thisbranch->{branchcode}} = $thisbranch->{branchname}; >- $value = $thisbranch->{branchcode} if $thisbranch->{selected} && !$value; >- } >- } >- elsif ( $subfieldlib->{authorised_value} eq "itemtypes" ) { >- push @authorised_values, ""; >- my $branch_limit = C4::Context->userenv && C4::Context->userenv->{"branch"}; >- my $itemtypes; >- if($branch_limit) { >- $itemtypes = Koha::ItemTypes->search_with_localization({branchcode => $branch_limit}); >- } else { >- $itemtypes = Koha::ItemTypes->search_with_localization; >- } >- while ( my $itemtype = $itemtypes->next ) { >- push @authorised_values, $itemtype->itemtype; >- $authorised_lib{$itemtype->itemtype} = $itemtype->translated_description; >- } >- >- unless ( $value ) { >- my $itype_sth = $dbh->prepare("SELECT itemtype FROM biblioitems WHERE biblionumber = ?"); >- $itype_sth->execute( $biblionumber ); >- ( $value ) = $itype_sth->fetchrow_array; >- } >- >- #---- class_sources >- } >- elsif ( $subfieldlib->{authorised_value} eq "cn_source" ) { >- push @authorised_values, ""; >- >- my $class_sources = GetClassSources(); >- my $default_source = C4::Context->preference("DefaultClassificationSource"); >- >- foreach my $class_source (sort keys %$class_sources) { >- next unless $class_sources->{$class_source}->{'used'} or >- ($value and $class_source eq $value) or >- ($class_source eq $default_source); >- push @authorised_values, $class_source; >- $authorised_lib{$class_source} = $class_sources->{$class_source}->{'description'}; >- } >- $value = $default_source unless ($value); >- >- #---- "true" authorised value >- } >- else { >- push @authorised_values, qq{}; >- my $av = GetAuthorisedValues( $subfieldlib->{authorised_value} ); >- for my $r ( @$av ) { >- push @authorised_values, $r->{authorised_value}; >- $authorised_lib{$r->{authorised_value}} = $r->{lib}; >- } >- } >- >- if ( $subfieldlib->{hidden} > 4 or $subfieldlib->{hidden} <= -4 ) { >- $subfield_data{marc_value} = { >- type => 'hidden', >- id => $subfield_data{id}, >- maxlength => $subfield_data{maxlength}, >- value => $value, >- ( ( grep { $_ eq $subfieldlib->{authorised_value}} ( qw(branches itemtypes cn_source) ) ) ? () : ( category => $subfieldlib->{authorised_value}) ), >- }; >- } >- else { >- $subfield_data{marc_value} = { >- type => 'select', >- id => "tag_".$tag."_subfield_".$subfieldtag."_".$index_subfield, >- values => \@authorised_values, >- labels => \%authorised_lib, >- default => $value, >- ( ( grep { $_ eq $subfieldlib->{authorised_value}} ( qw(branches itemtypes cn_source) ) ) ? () : ( category => $subfieldlib->{authorised_value}) ), >- }; >- } >- } >- # it's a thesaurus / authority field >- elsif ( $subfieldlib->{authtypecode} ) { >- $subfield_data{marc_value} = { >- type => 'text_auth', >- id => $subfield_data{id}, >- maxlength => $subfield_data{maxlength}, >- value => $value, >- authtypecode => $subfieldlib->{authtypecode}, >- }; >- } >- # it's a plugin field >- elsif ( $subfieldlib->{value_builder} ) { # plugin >- require Koha::FrameworkPlugin; >- my $plugin = Koha::FrameworkPlugin->new({ >- name => $subfieldlib->{'value_builder'}, >- item_style => 1, >- }); >- my $pars= { dbh => $dbh, record => $temp, tagslib =>$tagslib, >- id => $subfield_data{id} }; >- $plugin->build( $pars ); >- if( !$plugin->errstr ) { >- my $class= 'buttonDot'. ( $plugin->noclick? ' disabled': '' ); >- $subfield_data{marc_value} = { >- type => 'text_plugin', >- id => $subfield_data{id}, >- maxlength => $subfield_data{maxlength}, >- value => $value, >- class => $class, >- nopopup => $plugin->noclick, >- javascript => $plugin->javascript, >- }; >- } else { >- warn $plugin->errstr; >- $subfield_data{marc_value} = { >- type => 'text', >- id => $subfield_data{id}, >- maxlength => $subfield_data{maxlength}, >- value => $value, >- }; # supply default input form >- } >- } >- elsif ( $tag eq '' ) { # it's an hidden field >- $subfield_data{marc_value} = { >- type => 'hidden', >- id => $subfield_data{id}, >- maxlength => $subfield_data{maxlength}, >- value => $value, >- }; >- } >- elsif ( $subfieldlib->{'hidden'} ) { # FIXME: shouldn't input type be "hidden" ? >- $subfield_data{marc_value} = { >- type => 'text', >- id => $subfield_data{id}, >- maxlength => $subfield_data{maxlength}, >- value => $value, >- }; >- } >- elsif ( >- ( >- $value and length($value) > 100 >- ) >- or ( >- C4::Context->preference("marcflavour") eq "UNIMARC" >- and 300 <= $tag && $tag < 400 && $subfieldtag eq 'a' >- ) >- or ( >- C4::Context->preference("marcflavour") eq "MARC21" >- and 500 <= $tag && $tag < 600 >- ) >- ) { >- # oversize field (textarea) >- $subfield_data{marc_value} = { >- type => 'textarea', >- id => $subfield_data{id}, >- value => $value, >- }; >- } else { >- # it's a standard field >- $subfield_data{marc_value} = { >- type => 'text', >- id => $subfield_data{id}, >- maxlength => $subfield_data{maxlength}, >- value => $value, >- }; >- } >- >- # Getting list of subfields to keep when restricted editing is enabled >- my $subfieldsToAllowForRestrictedEditing = C4::Context->preference('SubfieldsToAllowForRestrictedEditing'); >- my $allowAllSubfields = ( >- not defined $subfieldsToAllowForRestrictedEditing >- or $subfieldsToAllowForRestrictedEditing eq q|| >- ) ? 1 : 0; >- my @subfieldsToAllow = split(/ /, $subfieldsToAllowForRestrictedEditing); >- >- # If we're on restricted editing, and our field is not in the list of subfields to allow, >- # then it is read-only >- $subfield_data{marc_value}->{readonly} = ( >- not $allowAllSubfields >- and $restrictededition >- and !grep { $tag . '$' . $subfieldtag eq $_ } @subfieldsToAllow >- ) ? 1: 0; >- >- return \%subfield_data; >-} >- > sub get_item_from_cookie { > my ( $input ) = @_; > >@@ -808,14 +537,6 @@ my @header_value_loop = map { > } > } sort keys %$subfieldcode_attribute_mappings; > >-# now, build the item form for entering a new item >-my $branch = $input->param('branch') || C4::Context->userenv->{branch}; >-my $libraries = Koha::Libraries->search({}, { order_by => ['branchname'] })->unblessed;# build once ahead of time, instead of multiple times later. >-for my $library ( @$libraries ) { >- $library->{selected} = 1 if $library->{branchcode} eq $branch >-} >- >- > # Using last created item if it exists > if ( $prefillitem > && $op ne "additem" >@@ -825,84 +546,46 @@ if ( $prefillitem > $current_item = $item_from_cookie if $item_from_cookie; > } > >-my @subfields_to_prefill = split ' ', C4::Context->preference('SubfieldsToUseWhenPrefill'); >- > if ( $current_item->{more_subfields_xml} ) { >+ # FIXME Use Maybe MARC::Record::new_from_xml if encoding issues on subfield (??) > $current_item->{marc_more_subfields_xml} = MARC::Record->new_from_xml($current_item->{more_subfields_xml}, 'UTF-8'); > } > >-# We generate form, and fill with values if defined >-my $temp = GetMarcBiblio({ biblionumber => $biblionumber }); >-my $i = 0; >-my @subfields; >-foreach my $tag ( keys %{$tagslib} ) { >- foreach my $subtag ( keys %{ $tagslib->{$tag} } ) { >- >- my $subfield = $tagslib->{$tag}{$subtag}; >- >- next if IsMarcStructureInternal( $subfield ); >- next if ( $subfield->{tab} ne "10" ); >- >- my @values = (); >- >- my $subfield_data; >- >- # If we are not adding a new item >- # OR >- # If the subfield must be prefilled with last catalogued item >- if ( >- $nextop ne 'additem' >- || ( >- !$prefillitem >- || ( $prefillitem && grep { $_ eq $subtag } >- @subfields_to_prefill ) >- ) >- ) >- { >- my $kohafield = $subfield->{kohafield}; >- if ($kohafield) { >- >- # This is a mapped field >- ( my $attribute = $kohafield ) =~ s|^items\.||; >- push @values, $subfield->{repeatable} >- ? split '\s\|\s', $current_item->{$attribute} >- : $current_item->{$attribute} >- if defined $current_item->{$attribute}; >- } else { >- # Not mapped, picked the values from more_subfields_xml's MARC >- my $marc_more = $current_item->{marc_more_subfields_xml}; >- if ( $marc_more ) { >- for my $f ( $marc_more->fields($tag) ) { >- push @values, $f->subfield($subtag); >- } >- } >- } >- } >+my $branchcode = $input->param('branch') || C4::Context->userenv->{branch}; > >- @values = ('') unless @values; >- >- for my $value (@values) { >- my $subfield_data = generate_subfield_form( >- $tag, $subtag, >- $value, $tagslib, >- $subfield, $libraries, >- $biblionumber, $temp, >- $i, >- $restrictededition, $current_item, >- ); >- push @subfields, $subfield_data; >- $i++; >- } >+# If we are not adding a new item >+# OR >+# If the subfield must be prefilled with last catalogued item >+my @subfields_to_prefill; >+if ( $nextop eq 'additem' && $prefillitem ) { >+ # Setting to 1 element if SubfieldsToUseWhenPrefill is empty to prevent all the subfields to be prefilled >+ @subfields_to_prefill = split(' ', C4::Context->preference('SubfieldsToUseWhenPrefill')) || (""); >+} >+my $subfields = >+ Koha::UI::Form::Builder::Item->new( >+ { biblionumber => $biblionumber, item => $current_item } )->edit_form( >+ { >+ branchcode => $branchcode, >+ restricted_editition => $restrictededition, >+ ( >+ @subfields_to_prefill >+ ? ( subfields_to_prefill => \@subfields_to_prefill ) >+ : () >+ ) > } >+ ); >+ >+if( my $default_location = C4::Context->preference('NewItemsDefaultLocation') ) { >+ my ( $location_field ) = grep {$_->{kohafield} eq 'items.location'} @$subfields; >+ $location_field->{marc_value}->{value} ||= $default_location; > } >-@subfields = sort { $a->{display_order} <=> $b->{display_order} || $a->{subfield} cmp $b->{subfield} } @subfields; > > # what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit. > $template->param( > biblio => $biblio, > items => \@items, > item_header_loop => \@header_value_loop, >- subfields => \@subfields, >+ subfields => $subfields, > itemnumber => $itemnumber, > barcode => $current_item->{barcode}, > itemtagfield => $itemtagfield, >-- >2.25.1
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 28445
:
121372
|
123221
|
123222
|
123223
|
123224
|
123225
|
123226
|
123227
|
123228
|
123229
|
123239
|
123240
|
125801
|
125802
|
125803
|
125804
|
125805
|
125808
|
125810
|
125811
|
125812
|
125817
|
125865
|
126046
|
126047
|
126136
|
126137
|
126138
|
126139
|
126140
|
126141
|
126142
|
126217
|
126218
|
126219
|
126223
|
126328
|
126329
|
126330
|
126331
|
126332
|
126333
|
126334
|
126335
|
126336
|
126337
|
126338
|
126339
|
126352
|
126353
|
126354
|
126355
|
126356
|
126357
|
126358
|
126359
|
126360
|
126361
|
126362
|
126363
|
126364
|
126365
|
126366
|
126367
|
126374
|
126375
|
126376
|
126377
|
126378
|
126379
|
126380
|
126381
|
126382
|
126383
|
126384
|
126385
|
126386
|
126387
|
126388
|
126389
|
127033
|
127037
|
127038
|
127039
|
128007
|
128008
|
128009