- my $i=0;
- my $authorised_values_sth = $dbh->prepare("select authorised_value,lib
- from authorised_values
- where category=? order by lib");
-
- my @loop_data = ();
- foreach my $tag (sort(keys (%{$tagslib}))) {
- my $indicator;
-# warn "TAG : $tag => ".$tagslib->{$tag}->{lib}."//";
-# if MARC::Record is not empty => use it as master loop, then add missing subfields that should be in the tab.
-# if MARC::Record is empty => use tab as master loop.
- if ($record ne -1 && $record->field($tag)) {
- my @fields = $record->field($tag);
- foreach my $field (@fields) {
- my @subfields_data;
- if ($tag<10) {
- my $value=$field->data();
- my $subfield="@";
- next if ($tagslib->{$tag}->{$subfield}->{tab} eq -1);
- push(@subfields_data, &create_input($tag,$subfield,char_decode($value,$encoding),$i,$record,$authorised_values_sth));
- $i++;
- } else {
- my @subfields=$field->subfields();
- foreach my $subfieldcount (0..$#subfields) {
- my $subfield=$subfields[$subfieldcount][0];
- my $value=$subfields[$subfieldcount][1];
- next if (length $subfield !=1);
- next if ($tagslib->{$tag}->{$subfield}->{tab} eq -1);
- push(@subfields_data, &create_input($tag,$subfield,char_decode($value,$encoding),$i,$record,$authorised_values_sth));
- $i++;
- }
- }
-# now, loop again to add parameter subfield that are not in the MARC::Record
- foreach my $subfield (sort( keys %{$tagslib->{$tag}})) {
- next if (length $subfield !=1);
- next if ($tagslib->{$tag}->{$subfield}->{tab} eq -1);
- next if ($tag<10);
- next if (defined($record->field($tag)->subfield($subfield)));
- push(@subfields_data, &create_input($tag,$subfield,'',$i,$record,$authorised_values_sth));
- $i++;
- }
- if ($#subfields_data >= 0) {
- my %tag_data;
- $tag_data{tag} = $tag;
- $tag_data{tag_lib} = $tagslib->{$tag}->{lib};
- $tag_data{repeatable} = $tagslib->{$tag}->{repeatable};
- $tag_data{indicator} = $record->field($tag)->indicator(1). $record->field($tag)->indicator(2) if ($tag>=10);
- $tag_data{subfield_loop} = \@subfields_data;
- push (@loop_data, \%tag_data);
- }
-# If there is more than 1 field, add an empty hidden field as separator.
- if ($#fields >=1) {
- my @subfields_data;
- my %tag_data;
- push(@subfields_data, &create_input('','','',$i,$record,$authorised_values_sth));
- $tag_data{tag} = '';
- $tag_data{tag_lib} = '';
- $tag_data{indicator} = '';
- $tag_data{subfield_loop} = \@subfields_data;
- push (@loop_data, \%tag_data);
- $i++;
- }
- }
-# if breeding is empty
- } else {
- my @subfields_data;
- foreach my $subfield (sort(keys %{$tagslib->{$tag}})) {
- next if (length $subfield !=1);
- next if ($tagslib->{$tag}->{$subfield}->{tab} eq -1);
- push(@subfields_data, &create_input($tag,$subfield,'',$i,$record,$authorised_values_sth));
- $i++;
- }
- if ($#subfields_data >= 0) {
- my %tag_data;
- $tag_data{tag} = $tag;
- $tag_data{tag_lib} = $tagslib->{$tag}->{lib};
- $tag_data{indicator} = $indicator;
- $tag_data{subfield_loop} = \@subfields_data;
- push (@loop_data, \%tag_data);
- }
- }
- }
- $template->param("0XX" =>\@loop_data);
+
+ my $authorised_values_sth = $dbh->prepare(
+ "SELECT authorised_value,lib
+ FROM authorised_values
+ WHERE category=? ORDER BY lib"
+ );
+
+ # in this array, we will push all the 10 tabs
+ # to avoid having 10 tabs in the template : they will all be in the same BIG_LOOP
+ my @BIG_LOOP;
+ my %seen;
+ my @tab_data; # all tags to display
+
+ foreach my $used ( keys %$tagslib ){
+ push @tab_data,$used if not $seen{$used};
+ $seen{$used}++;
+ }
+
+ my $max_num_tab=9;
+ # loop through each tab 0 through 9
+ for ( my $tabloop = 0 ; $tabloop <= $max_num_tab ; $tabloop++ ) {
+ my @loop_data = (); #innerloop in the template.
+ my $i = 0;
+ foreach my $tag (sort @tab_data) {
+ $i++;
+ next if ! $tag;
+ my ($indicator1, $indicator2);
+ my $index_tag = CreateKey;
+
+ # if MARC::Record is not empty =>use it as master loop, then add missing subfields that should be in the tab.
+ # if MARC::Record is empty => use tab as master loop.
+ if ( $record != -1 && ( $record->field($tag) || $tag eq '000' ) ) {
+ my @fields;
+ if ( $tag ne '000' ) {
+ @fields = $record->field($tag);
+ }
+ else {
+ push @fields, $record->leader(); # if tag == 000
+ }
+ # loop through each field
+ foreach my $field (@fields) {
+
+ my @subfields_data;
+ if ( $tag < 10 ) {
+ my ( $value, $subfield );
+ if ( $tag ne '000' ) {
+ $value = $field->data();
+ $subfield = "@";
+ }
+ else {
+ $value = $field;
+ $subfield = '@';
+ }
+ next if ( $tagslib->{$tag}->{$subfield}->{tab} ne $tabloop );
+ push(
+ @subfields_data,
+ &create_input(
+ $tag, $subfield, $value, $index_tag, $tabloop, $record,
+ $authorised_values_sth,$input
+ )
+ );
+ }
+ else {
+ my @subfields = $field->subfields();
+ foreach my $subfieldcount ( 0 .. $#subfields ) {
+ my $subfield = $subfields[$subfieldcount][0];
+ my $value = $subfields[$subfieldcount][1];
+ next if ( length $subfield != 1 );
+ next if ( $tagslib->{$tag}->{$subfield}->{tab} ne $tabloop );
+ push(
+ @subfields_data,
+ &create_input(
+ $tag, $subfield, $value, $index_tag, $tabloop,
+ $record, $authorised_values_sth,$input
+ )
+ );
+ }
+ }
+
+ # now, loop again to add parameter subfield that are not in the MARC::Record
+ foreach my $subfield ( sort( keys %{ $tagslib->{$tag} } ) )
+ {
+ next if ( length $subfield != 1 );
+ next if ( $tagslib->{$tag}->{$subfield}->{tab} ne $tabloop );
+ next if ( $tag < 10 );
+ next
+ if ( ( $tagslib->{$tag}->{$subfield}->{hidden} <= -4 )
+ or ( $tagslib->{$tag}->{$subfield}->{hidden} >= 5 )
+ ); #check for visibility flag
+ next if ( defined( $field->subfield($subfield) ) );
+ push(
+ @subfields_data,
+ &create_input(
+ $tag, $subfield, '', $index_tag, $tabloop, $record,
+ $authorised_values_sth,$input
+ )
+ );
+ }
+ if ( $#subfields_data >= 0 ) {
+ # build the tag entry.
+ # note that the random() field is mandatory. Otherwise, on repeated fields, you'll
+ # have twice the same "name" value, and cgi->param() will return only one, making
+ # all subfields to be merged in a single field.
+ my %tag_data = (
+ tag => $tag,
+ index => $index_tag,
+ tag_lib => $tagslib->{$tag}->{lib},
+ repeatable => $tagslib->{$tag}->{repeatable},
+ mandatory => $tagslib->{$tag}->{mandatory},
+ subfield_loop => \@subfields_data,
+ fixedfield => ($tag < 10)?(1):(0),
+ random => CreateKey,
+ );
+ if ($tag >= 10){ # no indicator for theses tag
+ $tag_data{indicator1} = format_indicator($field->indicator(1)),
+ $tag_data{indicator2} = format_indicator($field->indicator(2)),
+ }
+ push( @loop_data, \%tag_data );
+ }
+ } # foreach $field end
+
+ # if breeding is empty
+ }
+ else {
+ my @subfields_data;
+ foreach my $subfield ( sort( keys %{ $tagslib->{$tag} } ) ) {
+ next if ( length $subfield != 1 );
+ next if ( ( $tagslib->{$tag}->{$subfield}->{hidden} <= -5 )
+ or ( $tagslib->{$tag}->{$subfield}->{hidden} >= 4 ) )
+ ; #check for visibility flag
+ next if ( $tagslib->{$tag}->{$subfield}->{tab} ne $tabloop );
+ push(
+ @subfields_data,
+ &create_input(
+ $tag, $subfield, '', $index_tag, $tabloop, $record,
+ $authorised_values_sth,$input
+ )
+ );
+ }
+ if ( $#subfields_data >= 0 ) {
+ my %tag_data = (
+ tag => $tag,
+ index => $index_tag,
+ tag_lib => $tagslib->{$tag}->{lib},
+ repeatable => $tagslib->{$tag}->{repeatable},
+ mandatory => $tagslib->{$tag}->{mandatory},
+ indicator1 => $indicator1,
+ indicator2 => $indicator2,
+ subfield_loop => \@subfields_data,
+ tagfirstsubfield => $subfields_data[0],
+ fixedfield => ($tag < 10)?(1):(0)
+ );
+
+ push @loop_data, \%tag_data ;
+ }
+ }
+ }
+ if ( $#loop_data >= 0 ) {
+ push @BIG_LOOP, {
+ number => $tabloop,
+ innerloop => \@loop_data,
+ };
+ }
+ }
+ $template->param( BIG_LOOP => \@BIG_LOOP );