From 5cbb6dfeb169aca83365ead01524bc024e9cfd8b Mon Sep 17 00:00:00 2001 From: Nahuel ANGELINETTI Date: Tue, 2 Mar 2010 09:57:33 +0100 Subject: [PATCH] [3.0.x] (bug #4263) fix the edition of items with repeatable subfields The subfield management in item level is broken, fields are concatenated in one field, and if the librarian edit it, the values are not selected. This big patch fix three things: 1) saving fields that are stocked in SQL(using koha2marc mapping) are now well cut and separated in _REAL_ subfields 2) loading records with repeatable subfields are now well returned 3) Editing items with repeatable fields works well Signed-off-by: Henri-Damien LAURENT --- C4/Biblio.pm | 20 +- C4/Items.pm | 24 ++- cataloguing/additem.pl | 408 ++++++++++++++++++++++------------------- 3 files changed, 243 insertions(+), 209 deletions(-) diff --git a/C4/Biblio.pm b/C4/Biblio.pm index 385f1413f7..1866718a4a 100755 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -1806,14 +1806,18 @@ sub TransformKohaToMarcOneField { } $sth->execute( $frameworkcode, $kohafieldname ); if ( ( $tagfield, $tagsubfield ) = $sth->fetchrow ) { - my $tag = $record->field($tagfield); - if ($tag) { - $tag->update( $tagsubfield => $value ); - $record->delete_field($tag); - $record->insert_fields_ordered($tag); - } - else { - $record->add_fields( $tagfield, " ", " ", $tagsubfield => $value ); + my @values = split(/\s?\|\s?/, $value, -1); + + foreach my $itemvalue (@values){ + my $tag = $record->field($tagfield); + if ($tag) { + $tag->add_subfields( $tagsubfield => $itemvalue ); + $record->delete_field($tag); + $record->insert_fields_ordered($tag); + } + else { + $record->add_fields( $tagfield, " ", " ", $tagsubfield => $itemvalue ); + } } } return $record; diff --git a/C4/Items.pm b/C4/Items.pm index 3242d71676..d19caf9a1d 100644 --- a/C4/Items.pm +++ b/C4/Items.pm @@ -426,7 +426,7 @@ sub ModItemFromMarc { $item->{$item_field} = $default_values_for_mod_from_marc{$item_field} unless exists $item->{$item_field}; } my $unlinked_item_subfields = _get_unlinked_item_subfields($localitemmarc, $frameworkcode); - + return ModItem($item, $biblionumber, $itemnumber, $dbh, $frameworkcode, $unlinked_item_subfields); } @@ -1619,6 +1619,7 @@ sub GetMarcItem { defined($itemrecord->{$_}) && $itemrecord->{$_} ne '' ? ("items.$_" => $itemrecord->{$_}) : () } keys %{ $itemrecord } }; + my $itemmarc = TransformKohaToMarc($mungeditem); my $unlinked_item_subfields = _parse_unlinked_item_subfields_from_xml($mungeditem->{'items.more_subfields_xml'}); @@ -2081,14 +2082,19 @@ sub _marc_from_item_hash { foreach my $item_field (keys %{ $mungeditem }) { my ($tag, $subfield) = GetMarcFromKohaField($item_field, $frameworkcode); next unless defined $tag and defined $subfield; # skip if not mapped to MARC field - if (my $field = $item_marc->field($tag)) { - $field->add_subfields($subfield => $mungeditem->{$item_field}); - } else { - my $add_subfields = []; - if (defined $unlinked_item_subfields and ref($unlinked_item_subfields) eq 'ARRAY' and $#$unlinked_item_subfields > -1) { - $add_subfields = $unlinked_item_subfields; + + + my @values = split(/\s?\|\s?/, $mungeditem->{$item_field}, -1); + foreach my $value (@values){ + if (my $field = $item_marc->field($tag)) { + $field->add_subfields($subfield => $value); + } else { + my $add_subfields = []; + if (defined $unlinked_item_subfields and ref($unlinked_item_subfields) eq 'ARRAY' and $#$unlinked_item_subfields > -1) { + $add_subfields = $unlinked_item_subfields; + } + $item_marc->add_fields( $tag, " ", " ", $subfield => $value, @$add_subfields); } - $item_marc->add_fields( $tag, " ", " ", $subfield => $mungeditem->{$item_field}, @$add_subfields); } } @@ -2140,7 +2146,7 @@ replace it with the tag from C<$item_marc>. sub _replace_item_field_in_biblio { my ($ItemRecord, $biblionumber, $itemnumber, $frameworkcode) = @_; my $dbh = C4::Context->dbh; - + # get complete MARC record & replace the item field by the new one my $completeRecord = GetMarcBiblio($biblionumber); my ($itemtag,$itemsubfield) = GetMarcFromKohaField("items.itemnumber",$frameworkcode); diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl index f91e3525eb..ad0d51aca8 100755 --- a/cataloguing/additem.pl +++ b/cataloguing/additem.pl @@ -29,25 +29,10 @@ use C4::Koha; # XXX subfield_is_koha_internal_p use C4::Branch; # XXX subfield_is_koha_internal_p use C4::ClassSource; use C4::Dates; +use List::MoreUtils qw/any/; use MARC::File::XML; -sub find_value { - my ($tagfield,$insubfield,$record) = @_; - my $result; - my $indicator; - foreach my $field ($record->field($tagfield)) { - my @subfields = $field->subfields(); - foreach my $subfield (@subfields) { - if (@$subfield[0] eq $insubfield) { - $result .= @$subfield[1]; - $indicator = $field->indicator(1).$field->indicator(2); - } - } - } - return($indicator,$result); -} - sub get_item_from_barcode { my ($barcode)=@_; my $dbh=C4::Context->dbh; @@ -58,6 +43,170 @@ sub get_item_from_barcode { return($result); } +sub generate_subfield_form { + my ($tag, $subfieldtag, $value, $tagslib,$subfieldlib, $branches, $today_iso, $biblionumber, $temp, $loop_data, $i) = @_; + + my %subfield_data; + my $dbh = C4::Context->dbh; + my $authorised_values_sth = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category=? ORDER BY lib"); + + 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{random} = int(rand(1000000)); # why do we need 2 different randoms? + $subfield_data{marc_lib} ="{lib}."\">".$subfieldlib->{lib}.""; + $subfield_data{mandatory} = $subfieldlib->{mandatory}; + $subfield_data{repeatable} = $subfieldlib->{repeatable}; + + $value =~ s/"/"/g; + if ( ! defined( $value ) || $value eq '') { + $value = $subfieldlib->{defaultvalue}; + # get today date & replace YYYY, MM, DD if provided in the default value + my ( $year, $month, $day ) = split ',', $today_iso; # FIXME: iso dates don't have commas! + $value =~ s/YYYY/$year/g; + $value =~ s/MM/$month/g; + $value =~ s/DD/$day/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) { + my $CNtag = substr($pref_itemcallnumber, 0, 3); + my $CNsubfield = substr($pref_itemcallnumber, 3, 1); + my $CNsubfield2 = substr($pref_itemcallnumber, 4, 1); + my $temp2 = $temp->field($CNtag); + if ($temp2) { + $value = ($temp2->subfield($CNsubfield)).' '.($temp2->subfield($CNsubfield2)); + #remove any trailing space incase one subfield is used + $value =~ s/^\s+|\s+$//g; + } + } + + my $attributes_no_value = qq(tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" ); + my $attributes = qq($attributes_no_value value="$value" ); + + if ( $subfieldlib->{authorised_value} ) { + my @authorised_values; + my %authorised_lib; + # builds list, depending on authorised value... + if ( $subfieldlib->{authorised_value} eq "branches" ) { + foreach my $thisbranch (@$branches) { + push @authorised_values, $thisbranch->{value}; + $authorised_lib{$thisbranch->{value}} = $thisbranch->{branchname}; + $value = $thisbranch->{value} if $thisbranch->{selected}; + } + } + elsif ( $subfieldlib->{authorised_value} eq "itemtypes" ) { + push @authorised_values, "" unless ( $subfieldlib->{mandatory} ); + my $sth = $dbh->prepare("SELECT itemtype,description FROM itemtypes ORDER BY description"); + $sth->execute; + while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) { + push @authorised_values, $itemtype; + $authorised_lib{$itemtype} = $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, "" unless ( $subfieldlib->{mandatory} ); + + 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, "" unless ( $subfieldlib->{mandatory} ); + $authorised_values_sth->execute( $subfieldlib->{authorised_value} ); + while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) { + push @authorised_values, $value; + $authorised_lib{$value} = $lib; + } + } + + $subfield_data{marc_value} =CGI::scrolling_list( # FIXME: factor out scrolling_list + -name => "field_value", + -values => \@authorised_values, + -default => $value, + -labels => \%authorised_lib, + -override => 1, + -size => 1, + -multiple => 0, + -tabindex => 1, + -id => "tag_".$tag."_subfield_".$subfieldtag."_".$index_subfield, + -class => "input_marceditor", + ); + + # it's a thesaurus / authority field + } + elsif ( $subfieldlib->{authtypecode} ) { + $subfield_data{marc_value} = " + {authtypecode}."&index=$subfield_data{id}','$subfield_data{id}'); return false;\" title=\"Tag Editor\">... + "; + # it's a plugin field + } + elsif ( $subfieldlib->{value_builder} ) { + # opening plugin + my $plugin = C4::Context->intranetdir . "/cataloguing/value_builder/" . $subfieldlib->{'value_builder'}; + if (do $plugin) { + my $extended_param = plugin_parameters( $dbh, $temp, $tagslib, $subfield_data{id}, $loop_data ); + my ( $function_name, $javascript ) = plugin_javascript( $dbh, $temp, $tagslib, $subfield_data{id}, $loop_data ); + $subfield_data{marc_value} = qq[ + ... + $javascript]; + } else { + warn "Plugin Failed: $plugin"; + $subfield_data{marc_value} = ""; # supply default input form + } + } + elsif ( $tag eq '' ) { # it's an hidden field + $subfield_data{marc_value} = qq(); + } + elsif ( $subfieldlib->{'hidden'} ) { # FIXME: shouldn't input type be "hidden" ? + $subfield_data{marc_value} = qq(); + } + elsif ( 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} = "\n"; + } else { + # it's a standard field + $subfield_data{marc_value} = ""; + } + + return \%subfield_data; +} + + my $input = new CGI; my $dbh = C4::Context->dbh; my $error = $input->param('error'); @@ -166,6 +315,7 @@ if ($op eq "additem") { my @indicator = $input->param('indicator'); # my $itemnumber = $input->param('itemnumber'); my $xml = TransformHtmlToXml(\@tags,\@subfields,\@values,\@indicator,\@ind_tag,'ITEM'); + my $itemtosave=MARC::Record::new_from_xml($xml, 'UTF-8'); # MARC::Record builded => now, record in DB # warn "R: ".$record->as_formatted; @@ -189,6 +339,7 @@ if ($op eq "additem") { # now, build existiing item list my $temp = GetMarcBiblio( $biblionumber ); my @fields = $temp->fields(); + #my @fields = $record->fields(); my %witness; #---- stores the list of subfields used at least once, with the "meaning" of the code my @big_array; @@ -198,29 +349,34 @@ my ($branchtagfield, $branchtagsubfield) = &GetMarcFromKohaField("items.homebran foreach my $field (@fields) { next if ($field->tag()<10); + my @subf = $field->subfields or (); # don't use ||, as that forces $field->subfelds to be interpreted in scalar context my %this_row; # loop through each subfield - for my $i (0..$#subf) { - next if ($tagslib->{$field->tag()}->{$subf[$i][0]}->{tab} ne 10 + my $i = 0; + foreach my $subfield (@subf){ + my $subfieldcode = $subfield->[0]; + my $subfieldvalue= $subfield->[1]; + + next if ($tagslib->{$field->tag()}->{$subfieldcode}->{tab} ne 10 && ($field->tag() ne $itemtagfield - && $subf[$i][0] ne $itemtagsubfield)); - - $witness{$subf[$i][0]} = $tagslib->{$field->tag()}->{$subf[$i][0]}->{lib} if ($tagslib->{$field->tag()}->{$subf[$i][0]}->{tab} eq 10); - if ($tagslib->{$field->tag()}->{$subf[$i][0]}->{tab} eq 10) { - $this_row{$subf[$i][0]}=GetAuthorisedValueDesc( $field->tag(), - $subf[$i][0], $subf[$i][1], '', $tagslib) - || $subf[$i][1]; + && $subfieldcode ne $itemtagsubfield)); + $witness{$subfieldcode} = $tagslib->{$field->tag()}->{$subfieldcode}->{lib} if ($tagslib->{$field->tag()}->{$subfieldcode}->{tab} eq 10); + if ($tagslib->{$field->tag()}->{$subfieldcode}->{tab} eq 10) { + $this_row{$subfieldcode} .= " | " if($this_row{$subfieldcode}); + $this_row{$subfieldcode} .= GetAuthorisedValueDesc( $field->tag(), + $subfieldcode, $subfieldvalue, '', $tagslib) + || $subfieldvalue; } - if (($field->tag eq $branchtagfield) && ($subf[$i][$0] eq $branchtagsubfield) && C4::Context->preference("IndependantBranches")) { + if (($field->tag eq $branchtagfield) && ($subfieldcode eq $branchtagsubfield) && C4::Context->preference("IndependantBranches")) { #verifying rights my $userenv = C4::Context->userenv(); - unless (($userenv->{'flags'} == 1) or (($userenv->{'branch'} eq $subf[$i][1]))){ + unless (($userenv->{'flags'} == 1) or (($userenv->{'branch'} eq $subfieldvalue))){ $this_row{'nomod'}=1; } } - $this_row{itemnumber} = $subf[$i][1] if ($field->tag() eq $itemtagfield && $subf[$i][0] eq $itemtagsubfield); + $this_row{itemnumber} = $subfieldvalue if ($field->tag() eq $itemtagfield && $subfieldcode eq $itemtagsubfield); } if (%this_row) { push(@big_array, \%this_row); @@ -252,7 +408,6 @@ foreach my $subfield_code (sort keys(%witness)) { # now, build the item form for entering a new item my @loop_data =(); my $i=0; -my $authorised_values_sth = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category=? ORDER BY lib"); my $onlymine = C4::Context->preference('IndependantBranches') && C4::Context->userenv && @@ -260,174 +415,43 @@ my $onlymine = C4::Context->preference('IndependantBranches') && C4::Context->userenv->{branch}; my $branches = GetBranchesLoop(undef,$onlymine); # build once ahead of time, instead of multiple times later. -foreach my $tag (sort keys %{$tagslib}) { -# loop through each subfield - foreach my $subfield (sort keys %{$tagslib->{$tag}}) { - next if subfield_is_koha_internal_p($subfield); - next if ($tagslib->{$tag}->{$subfield}->{'tab'} ne "10"); - my %subfield_data; - - my $index_subfield = int(rand(1000000)); - if ($subfield eq '@'){ - $subfield_data{id} = "tag_".$tag."_subfield_00_".$index_subfield; - } else { - $subfield_data{id} = "tag_".$tag."_subfield_".$subfield."_".$index_subfield; - } - $subfield_data{tag} = $tag; - $subfield_data{subfield} = $subfield; - $subfield_data{random} = int(rand(1000000)); # why do we need 2 different randoms? -# $subfield_data{marc_lib} = $tagslib->{$tag}->{$subfield}->{lib}; - $subfield_data{marc_lib} ="{$tag}->{$subfield}->{lib}."\">".$tagslib->{$tag}->{$subfield}->{lib}.""; - $subfield_data{mandatory} = $tagslib->{$tag}->{$subfield}->{mandatory}; - $subfield_data{repeatable} = $tagslib->{$tag}->{$subfield}->{repeatable}; - my ($x,$value); - ($x,$value) = find_value($tag,$subfield,$itemrecord) if ($itemrecord); - $value =~ s/"/"/g; - if ( ! defined( $value ) || $value eq '') { - $value = $tagslib->{$tag}->{$subfield}->{defaultvalue}; - # get today date & replace YYYY, MM, DD if provided in the default value - my ( $year, $month, $day ) = split ',', $today_iso; # FIXME: iso dates don't have commas! - $value =~ s/YYYY/$year/g; - $value =~ s/MM/$month/g; - $value =~ s/DD/$day/g; - } - $subfield_data{visibility} = "display:none;" if (($tagslib->{$tag}->{$subfield}->{hidden} > 4) || ($tagslib->{$tag}->{$subfield}->{hidden} < -4)); - # testing branch value if IndependantBranches. - # my $test = (C4::Context->preference("IndependantBranches")) && - # ($tag eq $branchtagfield) && ($subfield eq $branchtagsubfield) && - # (C4::Context->userenv->{flags} != 1) && ($value) && ($value ne C4::Context->userenv->{branch}) ; - # $test and print $input->redirect(".pl?biblionumber=$biblionumber") and exit; - # search for itemcallnumber if applicable - my $pref_itemcallnumber = C4::Context->preference('itemcallnumber'); - if (!$value && $tagslib->{$tag}->{$subfield}->{kohafield} eq 'items.itemcallnumber' && $pref_itemcallnumber) { - my $CNtag = substr($pref_itemcallnumber, 0, 3); - my $CNsubfield = substr($pref_itemcallnumber, 3, 1); - my $CNsubfield2 = substr($pref_itemcallnumber, 4, 1); - my $temp2 = $temp->field($CNtag); - if ($temp2) { - $value = ($temp2->subfield($CNsubfield)).' '.($temp2->subfield($CNsubfield2)); - #remove any trailing space incase one subfield is used - $value =~ s/^\s+|\s+$//g; - } - } - - my $attributes_no_value = qq(tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" ); - my $attributes = qq($attributes_no_value value="$value" ); - if ( $tagslib->{$tag}->{$subfield}->{authorised_value} ) { - my @authorised_values; - my %authorised_lib; - # builds list, depending on authorised value... - - if ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "branches" ) { - foreach my $thisbranch (@$branches) { - push @authorised_values, $thisbranch->{value}; - $authorised_lib{$thisbranch->{value}} = $thisbranch->{branchname}; - $value = $thisbranch->{value} if $thisbranch->{selected}; - } - } - elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) { - push @authorised_values, "" unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); - my $sth = $dbh->prepare("select itemtype,description from itemtypes order by description"); - $sth->execute; - while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) { - push @authorised_values, $itemtype; - $authorised_lib{$itemtype} = $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 ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "cn_source" ) { - push @authorised_values, "" unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); +# We generate form, from actuel record +my @fields; +if($itemrecord){ + foreach my $field ($itemrecord->fields()){ + my $tag = $field->{_tag}; + foreach my $subfield ( $field->subfields() ){ - 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, "" unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); - $authorised_values_sth->execute( $tagslib->{$tag}->{$subfield}->{authorised_value} ); - while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) { - push @authorised_values, $value; - $authorised_lib{$value} = $lib; - } - } - $subfield_data{marc_value} =CGI::scrolling_list( # FIXME: factor out scrolling_list - -name => "field_value", - -values => \@authorised_values, - -default => $value, - -labels => \%authorised_lib, - -override => 1, - -size => 1, - -multiple => 0, - -tabindex => 1, - -id => "tag_".$tag."_subfield_".$subfield."_".$index_subfield, - -class => "input_marceditor", - ); - # it's a thesaurus / authority field - } - elsif ( $tagslib->{$tag}->{$subfield}->{authtypecode} ) { - $subfield_data{marc_value} = " - {$tag}->{$subfield}->{authtypecode}."&index=$subfield_data{id}','$subfield_data{id}'); return false;\" title=\"Tag Editor\">... - "; - # it's a plugin field - } - elsif ( $tagslib->{$tag}->{$subfield}->{value_builder} ) { - # opening plugin - my $plugin = C4::Context->intranetdir . "/cataloguing/value_builder/" . $tagslib->{$tag}->{$subfield}->{'value_builder'}; - if (do $plugin) { - my $extended_param = plugin_parameters( $dbh, $temp, $tagslib, $subfield_data{id}, \@loop_data ); - my ( $function_name, $javascript ) = plugin_javascript( $dbh, $temp, $tagslib, $subfield_data{id}, \@loop_data ); - $subfield_data{marc_value} = qq[ - ... - $javascript]; - } else { - warn "Plugin Failed: $plugin"; - $subfield_data{marc_value} = ""; # supply default input form + my $subfieldtag = $subfield->[0]; + my $value = $subfield->[1]; + my $subfieldlib = $tagslib->{$tag}->{$subfieldtag}; + + next if subfield_is_koha_internal_p($subfieldtag); + next if ($tagslib->{$tag}->{$subfieldtag}->{'tab'} ne "10"); + + my $subfield_data = generate_subfield_form($tag, $subfieldtag, $value, $tagslib, $subfieldlib, $branches, $today_iso, $biblionumber, $temp, \@loop_data, $i); + + push @fields, "$tag$subfieldtag"; + push (@loop_data, $subfield_data); + $i++; } } - elsif ( $tag eq '' ) { # it's an hidden field - $subfield_data{marc_value} = qq(); - } - elsif ( $tagslib->{$tag}->{$subfield}->{'hidden'} ) { # FIXME: shouldn't input type be "hidden" ? - $subfield_data{marc_value} = qq(); - } - elsif ( length($value) > 100 - or (C4::Context->preference("marcflavour") eq "UNIMARC" and - 300 <= $tag && $tag < 400 && $subfield eq 'a' ) - or (C4::Context->preference("marcflavour") eq "MARC21" and - 500 <= $tag && $tag < 600 ) - ) { - # oversize field (textarea) - $subfield_data{marc_value} = "\n"; - } else { - # it's a standard field - $subfield_data{marc_value} = ""; +} + # and now we add fields that are empty + +foreach my $tag ( keys %{$tagslib}){ + foreach my $subtag (keys %{$tagslib->{$tag}}){ + next if subfield_is_koha_internal_p($subtag); + next if ($tagslib->{$tag}->{$subtag}->{'tab'} ne "10"); + next if any { /^$tag$subtag$/ } @fields; + + my $value = ""; + my $subfield_data = generate_subfield_form($tag, $subtag, $value, $tagslib, $tagslib->{$tag}->{$subtag}, $branches, $today_iso, $biblionumber, $temp, \@loop_data, $i); + + push (@loop_data, $subfield_data); + $i++; } -# $subfield_data{marc_value}=""; - push (@loop_data, \%subfield_data); - $i++ - } } - # what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit. $template->param( title => $record->title() ) if ($record ne "-1"); $template->param( -- 2.20.1