[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 <henridamien.laurent@biblibre.com>
This commit is contained in:
parent
b22c1a1e10
commit
5cbb6dfeb1
20
C4/Biblio.pm
20
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;
|
||||
|
|
|
|||
24
C4/Items.pm
24
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);
|
||||
|
|
|
|||
|
|
@ -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} ="<span id=\"error$i\" title=\"".$subfieldlib->{lib}."\">".$subfieldlib->{lib}."</span>";
|
||||
$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} = "<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');
|
||||
|
|
@ -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} ="<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/"/"/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} = "<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 />";
|
||||
}
|
||||
# $subfield_data{marc_value}="<input type=\"text\" name=\"field_value\">";
|
||||
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++;
|
||||
}
|
||||
}
|
||||
# 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(
|
||||
|
|
|
|||
Loading…
Reference in New Issue