[Koha-patches] [PATCH] (bug #4263) fix the edition of items with repeatable subfields

Henri-Damien LAURENT henridamien.laurent at biblibre.com
Thu May 27 22:03:16 CEST 2010


From: Nahuel ANGELINETTI <nahuel.angelinetti at biblibre.com>

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 <henridamien.laurent at biblibre.com>
---
 C4/Biblio.pm           |   19 ++-
 C4/Items.pm            |   24 ++-
 cataloguing/additem.pl |  419 +++++++++++++++++++++++++-----------------------
 3 files changed, 243 insertions(+), 219 deletions(-)

diff --git a/C4/Biblio.pm b/C4/Biblio.pm
index 91e9027..4c895cf 100644
--- a/C4/Biblio.pm
+++ b/C4/Biblio.pm
@@ -1743,13 +1743,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 3678bf9..120dc69 100644
--- a/C4/Items.pm
+++ b/C4/Items.pm
@@ -464,7 +464,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); 
 }
 
@@ -1696,6 +1696,7 @@ sub Item2Marc {
             defined($itemrecord->{$_}) && $itemrecord->{$_} ne '' ? ("items.$_" => $itemrecord->{$_}) : ()  
         } keys %{ $itemrecord } 
     };
+
     my $itemmarc = TransformKohaToMarc($mungeditem);
     my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField("items.itemnumber",GetFrameworkCode($biblionumber)||'');
 
@@ -2269,14 +2270,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);
         }
     }
 
@@ -2328,7 +2334,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 ea4daf9..c325fe4 100755
--- a/cataloguing/additem.pl
+++ b/cataloguing/additem.pl
@@ -30,25 +30,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;
@@ -69,6 +54,170 @@ sub set_item_default_location {
     }
 }
 
+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}   ="<span id=\"error$i\" title=\"".$subfieldlib->{lib}."\">".$subfieldlib->{lib}."</span>";
+        $subfield_data{mandatory}  = $subfieldlib->{mandatory};
+        $subfield_data{repeatable} = $subfieldlib->{repeatable};
+        
+        $value =~ s/"/&quot;/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} = "<input type=\"text\" $attributes />
+                    <a href=\"#\" class=\"buttonDot\"
+                        onclick=\"Dopop('/cgi-bin/koha/authorities/auth_finder.pl?authtypecode=".$subfieldlib->{authtypecode}."&index=$subfield_data{id}','$subfield_data{id}'); return false;\" title=\"Tag Editor\">...</a>
+            ";
+            # 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[<input $attributes
+                        onfocus="Focus$function_name($subfield_data{random}, '$subfield_data{id}');"
+                         onblur=" Blur$function_name($subfield_data{random}, '$subfield_data{id}');" />
+                        <a href="#" class="buttonDot" onclick="Clic$function_name('$subfield_data{id}'); return false;" title="Tag Editor">...</a>
+                        $javascript];
+                } else {
+                    warn "Plugin Failed: $plugin";
+                    $subfield_data{marc_value} = "<input $attributes />"; # supply default input form
+                }
+        }
+        elsif ( $tag eq '' ) {       # it's an hidden field
+            $subfield_data{marc_value} = qq(<input type="hidden" $attributes />);
+        }
+        elsif ( $subfieldlib->{'hidden'} ) {   # FIXME: shouldn't input type be "hidden" ?
+            $subfield_data{marc_value} = qq(<input type="text" $attributes />);
+        }
+        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} = "<textarea $attributes_no_value>$value</textarea>\n";
+        } else {
+           # it's a standard field
+           $subfield_data{marc_value} = "<input $attributes />";
+        }
+        
+        return \%subfield_data;
+}
+
+
 my $input = new CGI;
 my $dbh = C4::Context->dbh;
 my $error        = $input->param('error');
@@ -281,6 +430,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;
@@ -304,6 +454,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;
@@ -313,29 +464,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);
@@ -377,186 +533,43 @@ my ($location_field, $location_subfield) = GetMarcFromKohaField('items.location'
 # 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}   ="<span id=\"error$i\" title=\"".$tagslib->{$tag}->{$subfield}->{lib}."\">".$tagslib->{$tag}->{$subfield}->{lib}."</span>";
-    $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/"/&quot;/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 $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};
-             # $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  itemrecord
+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} );
-
-	  # 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} = "<input type=\"text\" $attributes />
-            <a href=\"#\" class=\"buttonDot\"
-                onclick=\"Dopop('/cgi-bin/koha/authorities/auth_finder.pl?authtypecode=".$tagslib->{$tag}->{$subfield}->{authtypecode}."&index=$subfield_data{id}','$subfield_data{id}'); return false;\" title=\"Tag Editor\">...</a>
-    ";
-    # 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[<input $attributes
-                onfocus="Focus$function_name($subfield_data{random}, '$subfield_data{id}');"
-                 onblur=" Blur$function_name($subfield_data{random}, '$subfield_data{id}');" />
-                <a href="#" class="buttonDot" onclick="Clic$function_name('$subfield_data{id}'); return false;" title="Tag Editor">...</a>
-                $javascript];
-        } else {
-            warn "Plugin Failed: $plugin";
-            $subfield_data{marc_value} = "<input $attributes />"; # 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(<input type="hidden" $attributes />);
-    }
-    elsif ( $tagslib->{$tag}->{$subfield}->{'hidden'} ) {   # FIXME: shouldn't input type be "hidden" ?
-        $subfield_data{marc_value} = qq(<input type="text" $attributes />);
-    }
-    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} = "<textarea $attributes_no_value>$value</textarea>\n";
-    } else {
-        # it's a standard field
-         $subfield_data{marc_value} = "<input $attributes />";
+}
+    # 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}="<input type=\"text\" name=\"field_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(
-- 
1.7.0.4



More information about the Koha-patches mailing list