From 200dbc1a74b892356838a8cd1f18b68347bcbc42 Mon Sep 17 00:00:00 2001 From: Chris Cormack Date: Thu, 3 Feb 2011 12:17:37 +1300 Subject: [PATCH] Bug: 4263 - Repeatable subfields in items Squashed commit of the following: commit f441094d5095d165eab18340c983a831cce8f6e0 Author: Henri-Damien LAURENT Date: Mon Jul 5 20:33:23 2010 +0200 bug4263 followup : Can't blank subfields Previous bug4263 reintroduced bug 2466: fix clearing item field This keeps bug4263 followup to be assigned (donot blank dateaccessioned) But also allow to blank item subfields. commit 92889b766c41b48bdd0e3a33ca4b183b1e259805 Author: Nahuel ANGELINETTI Date: Fri Apr 23 13:54:30 2010 +0200 (bug #4263) dateaccessionned is cleaned on item modification Every item modification, date accessionned is cleaned, if there is no modification made, we must'nt reset to "undef" the value. commit 5abb2db16b2564d32e84b7cc680acbc301d73179 Author: Nahuel ANGELINETTI Date: Tue Mar 2 09:57:33 2010 +0100 (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 --- C4/Biblio.pm | 11 +- C4/Items.pm | 37 +++-- cataloguing/additem.pl | 421 +++++++++++++++++++++++++++--------------------- 3 files changed, 268 insertions(+), 201 deletions(-) diff --git a/C4/Biblio.pm b/C4/Biblio.pm index b151d71..7eb3124 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -1680,13 +1680,18 @@ sub TransformKohaToMarcOneField { } $sth->execute( $frameworkcode, $kohafieldname ); if ( ( $tagfield, $tagsubfield ) = $sth->fetchrow ) { + my @values = split(/\s?\|\s?/, $value, -1); + + foreach my $itemvalue (@values){ my $tag = $record->field($tagfield); if ($tag) { - $tag->update( $tagsubfield => $value ); + $tag->add_subfields( $tagsubfield => $itemvalue ); $record->delete_field($tag); $record->insert_fields_ordered($tag); - } else { - $record->add_fields( $tagfield, " ", " ", $tagsubfield => $value ); + } + else { + $record->add_fields( $tagfield, " ", " ", $tagsubfield => $itemvalue ); + } } } return $record; diff --git a/C4/Items.pm b/C4/Items.pm index a7c190c..80877ca 100644 --- a/C4/Items.pm +++ b/C4/Items.pm @@ -402,7 +402,7 @@ my %default_values_for_mod_from_marc = ( 'items.cn_source' => undef, copynumber => undef, damaged => 0, - dateaccessioned => undef, +# dateaccessioned => undef, enumchron => undef, holdingbranch => undef, homebranch => undef, @@ -429,6 +429,18 @@ sub ModItemFromMarc { my $biblionumber = shift; my $itemnumber = shift; + my $dbh = C4::Context->dbh; + my $frameworkcode = GetFrameworkCode($biblionumber); + my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode ); + + my $localitemmarc = MARC::Record->new; + $localitemmarc->append_fields( $item_marc->field($itemtag) ); + my $item = &TransformMarcToKoha( $dbh, $localitemmarc, $frameworkcode, 'items' ); + foreach my $item_field ( keys %default_values_for_mod_from_marc ) { + $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 ); + my $dbh = C4::Context->dbh; my $frameworkcode = GetFrameworkCode( $biblionumber ); my ($itemtag,$itemsubfield)=GetMarcFromKohaField("items.itemnumber",$frameworkcode); @@ -2136,17 +2148,20 @@ sub _marc_from_item_hash { : () } keys %{ $item } }; my $item_marc = MARC::Record->new(); - 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; + 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 + 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); } } diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl index 6dc190a..ffc14d5 100755 --- a/cataloguing/additem.pl +++ b/cataloguing/additem.pl @@ -30,6 +30,7 @@ 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; @@ -91,7 +92,176 @@ sub _increment_barcode { } -my $input = new CGI; +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 ); + my $change = index($javascript, 'function Change') > -1 ? + "return Change$function_name($subfield_data{random}, '$subfield_data{id}');" : + 'return 1;'; + $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'); my $biblionumber = $input->param('biblionumber'); my $itemnumber = $input->param('itemnumber'); @@ -318,30 +488,35 @@ my ( $itemtagfield, $itemtagsubfield) = &GetMarcFromKohaField("items.itemnumb my ($branchtagfield, $branchtagsubfield) = &GetMarcFromKohaField("items.homebranch", $frameworkcode); 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 + 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 - && ($field->tag() ne $itemtagfield - && $subf[$i][0] ne $itemtagsubfield)); + # loop through each subfield + my $i = 0; + foreach my $subfield (@subf){ + my $subfieldcode = $subfield->[0]; + my $subfieldvalue= $subfield->[1]; - $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]; - } + next if ($tagslib->{$field->tag()}->{$subfieldcode}->{tab} ne 10 + && ($field->tag() ne $itemtagfield + && $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]))){ - $this_row{'nomod'}=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); @@ -374,177 +549,50 @@ foreach my $subfield_code (sort keys(%witness)) { my @loop_data =(); my $i=0; -my $branches = GetBranchesLoop(); # build once ahead of time, instead of multiple times later. my $pref_itemcallnumber = C4::Context->preference('itemcallnumber'); -# Getting the fields where the item location is -my ($location_field, $location_subfield) = GetMarcFromKohaField('items.location', $frameworkcode); - -# Getting the name of the authorised values' category for item location -my $item_location_category = $tagslib->{$location_field}->{$location_subfield}->{'authorised_value'}; - -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; - unless ($value) { - $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. - 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 $onlymine = C4::Context->preference('IndependantBranches') && + C4::Context->userenv && + C4::Context->userenv->{flags}!=1 && + C4::Context->userenv->{branch}; +my $branches = GetBranchesLoop(undef,$onlymine); # build once ahead of time, instead of multiple times later. - my $attributes_no_value = qq(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}; - # in edit item this is set to the data value otherwise use default - if ($op ne 'edititem' && $thisbranch->{selected} ) { - $value = $thisbranch->{value}; - } - } - } - 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} ); - - 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} ); - - # Are we dealing with item location ? - my $item_location = ($tagslib->{$tag}->{$subfield}->{authorised_value} eq $item_location_category) ? 1 : 0; - - # If so, we sort by authorised_value, else by libelle - my $orderby = $item_location ? 'authorised_value' : 'lib'; - - my $authorised_values_sth = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category=? ORDER BY $orderby"); - - $authorised_values_sth->execute( $tagslib->{$tag}->{$subfield}->{authorised_value}); - - - while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) { - push @authorised_values, $value; - if ($tagslib->{$tag}->{$subfield}->{authorised_value} eq $item_location_category) { - $authorised_lib{$value} = $value . " - " . $lib; - } else { - $authorised_lib{$value} = $lib; - } - - # For item location, we show the code and the libelle - $authorised_lib{$value} = ($item_location) ? $value . " - " . $lib : $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 ); - my $change = index($javascript, 'function Change') > -1 ? - "return Change$function_name($subfield_data{random}, '$subfield_data{id}');" : - 'return 1;'; - $subfield_data{marc_value} = qq[ - ... - $javascript]; - } else { - warn "Plugin Failed: $plugin"; - $subfield_data{marc_value} = ""; # supply default input form - } +# 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 $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++; + } + + } + } + # 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++; } elsif ( $tag eq '' ) { # it's an hidden field $subfield_data{marc_value} = qq(); @@ -569,7 +617,6 @@ foreach my $tag (sort keys %{$tagslib}) { $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( -- 1.7.1