[Koha-patches] [PATCH] bug_6210: Select framework if merging two records with different frameworks

Srdjan Jankovic srdjan at catalyst.net.nz
Mon Dec 19 07:24:35 CET 2011


ModBiblio() - set framework to "" if "Default"
---
 C4/Biblio.pm                                       |   41 ++++---
 cataloguing/merge.pl                               |  136 +++++++++++--------
 .../prog/en/modules/cataloguing/merge.tt           |   39 +++++-
 3 files changed, 136 insertions(+), 80 deletions(-)

diff --git a/C4/Biblio.pm b/C4/Biblio.pm
index ac78ae3..7df8412 100644
--- a/C4/Biblio.pm
+++ b/C4/Biblio.pm
@@ -320,7 +320,7 @@ sub ModBiblio {
     SetUTF8Flag($record);
     my $dbh = C4::Context->dbh;
 
-    $frameworkcode = "" unless $frameworkcode;
+    $frameworkcode = "" if !$frameworkcode || $frameworkcode eq "Default"; # XXX
 
     _strip_item_fields($record, $frameworkcode);
 
@@ -1043,9 +1043,13 @@ for the given frameworkcode
 
 sub GetMarcFromKohaField {
     my ( $kohafield, $frameworkcode ) = @_;
-    return 0, 0 unless $kohafield and defined $frameworkcode;
+    return (0, undef) unless $kohafield and defined $frameworkcode;
     my $relations = C4::Context->marcfromkohafield;
-    return ( $relations->{$frameworkcode}->{$kohafield}->[0], $relations->{$frameworkcode}->{$kohafield}->[1] );
+    if ( my $mf = $relations->{$frameworkcode}->{$kohafield} ) {
+        return @$mf;
+    }
+    warn qq{No marc tags for framework "$frameworkcode" field $kohafield};
+    return (0, undef);
 }
 
 =head2 GetMarcBiblio
@@ -3179,9 +3183,24 @@ sub _koha_marc_update_bib_ids {
     # we drop the original field
     # we add the new builded field.
     my ( $biblio_tag,     $biblio_subfield )     = GetMarcFromKohaField( "biblio.biblionumber",          $frameworkcode );
+    die qq{No biblionumber tag for framework "$frameworkcode"} unless $biblio_tag;
     my ( $biblioitem_tag, $biblioitem_subfield ) = GetMarcFromKohaField( "biblioitems.biblioitemnumber", $frameworkcode );
+    die qq{No biblioitemnumber tag for framework "$frameworkcode"} unless $biblio_tag;
 
-    if ( $biblio_tag != $biblioitem_tag ) {
+    if ( $biblio_tag == $biblioitem_tag ) {
+
+        # biblionumber & biblioitemnumber are in the same field (can't be <10 as fields <10 have only 1 value)
+        my $new_field = MARC::Field->new(
+            $biblio_tag, '', '',
+            "$biblio_subfield"     => $biblionumber,
+            "$biblioitem_subfield" => $biblioitemnumber
+        );
+
+        # drop old field and create new one...
+        my $old_field = $record->field($biblio_tag);
+        $record->delete_field($old_field) if $old_field;
+        $record->insert_fields_ordered($new_field);
+    } else {
 
         # biblionumber & biblioitemnumber are in different fields
 
@@ -3209,20 +3228,6 @@ sub _koha_marc_update_bib_ids {
         $old_field = $record->field($biblioitem_tag);
         $record->delete_field($old_field) if $old_field;
         $record->insert_fields_ordered($new_field);
-
-    } else {
-
-        # biblionumber & biblioitemnumber are in the same field (can't be <10 as fields <10 have only 1 value)
-        my $new_field = MARC::Field->new(
-            $biblio_tag, '', '',
-            "$biblio_subfield"     => $biblionumber,
-            "$biblioitem_subfield" => $biblioitemnumber
-        );
-
-        # drop old field and create new one...
-        my $old_field = $record->field($biblio_tag);
-        $record->delete_field($old_field) if $old_field;
-        $record->insert_fields_ordered($new_field);
     }
 }
 
diff --git a/cataloguing/merge.pl b/cataloguing/merge.pl
index 0b881f1..1aed8fa 100755
--- a/cataloguing/merge.pl
+++ b/cataloguing/merge.pl
@@ -27,6 +27,7 @@ use C4::Auth;
 use C4::Items;
 use C4::Biblio;
 use C4::Serials;
+use C4::Koha;
 use C4::Reserves qw/MergeHolds/;
 
 my $input = new CGI;
@@ -61,7 +62,7 @@ if ($merge) {
     # Rewriting the leader
     $record->leader(GetMarcBiblio($tobiblio)->leader());
 
-    my $frameworkcode = &GetFrameworkCode($tobiblio);
+    my $frameworkcode = $input->param('frameworkcode');
     my @notmoveditems;
 
     # Modifying the reference record
@@ -108,77 +109,98 @@ if ($merge) {
 	push @errors, $error if ($error); 
     }
 
-    # Errors
-    my @errors_loop  = map{{error => $_}}@errors;
-
     # Parameters
     $template->param(
-	errors  => \@errors_loop,
 	result => 1,
 	biblio1 => $input->param('biblio1')
     );
 
-
 #-------------------------
 # Show records to merge
 #-------------------------
 } else {
-
     my $mergereference = $input->param('mergereference');
     my $biblionumber = $input->param('biblionumber');
 
-    my $data1 = GetBiblioData($biblionumber[0]);
-    my $data2 = GetBiblioData($biblionumber[1]);
-
-    # Ask the user to choose which record will be the kept
-    if (not $mergereference) {
-	$template->param(
-	    choosereference => 1,	
-	    biblio1 => $biblionumber[0],
-	    biblio2 => $biblionumber[1],
-	    title1 => $data1->{'title'},
-	    title2 => $data2->{'title'}
-	    );
-    } else {
-
-	if (scalar(@biblionumber) != 2) {
-	    push @errors, "An unexpected number of records was provided for merging. Currently only two records at a time can be merged.";
-	}
-
-	# Checks if both records use the same framework
-	my $frameworkcode1 = &GetFrameworkCode($biblionumber[0]);
-	my $frameworkcode2 = &GetFrameworkCode($biblionumber[1]);
-	my $framework;
-	if ($frameworkcode1 ne $frameworkcode2) {
-	    push @errors, "The records selected for merging are using different frameworks. Currently merging is only available for records using the same framework.";
-	} else {
-	    $framework = $frameworkcode1;	
-	}
-
-	# Getting MARC Structure
-	my $tagslib = GetMarcStructure(1, $framework);
-
-	my $notreference = ($biblionumber[0] == $mergereference) ? $biblionumber[1] : $biblionumber[0];
-
-	# Creating a loop for display
-	my @record1 = _createMarcHash(GetMarcBiblio($mergereference), $tagslib);
-	my @record2 = _createMarcHash(GetMarcBiblio($notreference), $tagslib);
-
-	# Errors
-	my @errors_loop  = map{{error => $_}}@errors;
-
-	# Parameters
-	$template->param(
-	    errors  => \@errors_loop,
-	    biblio1 => $mergereference,
-	    biblio2 => $notreference,
-	    mergereference => $mergereference,
-	    record1 => @record1,
-	    record2 => @record2,
-	    framework => $framework
-	    );
+    if (scalar(@biblionumber) != 2) {
+        push @errors, "An unexpected number of records was provided for merging. Currently only two records at a time can be merged.";
+    }
+    else {
+        my $data1 = GetBiblioData($biblionumber[0]);
+        my $data2 = GetBiblioData($biblionumber[1]);
+
+        # Checks if both records use the same framework
+        my $frameworkcode1 = &GetFrameworkCode($biblionumber[0]);
+        my $frameworkcode2 = &GetFrameworkCode($biblionumber[1]);
+
+        if ($mergereference) {
+
+            my $framework;
+            if ($frameworkcode1 ne $frameworkcode2) {
+                $framework = $input->param('frameworkcode')
+                  or push @errors, "Famework not selected.";
+            } else {
+                $framework = $frameworkcode1;	
+            }
+
+            # Getting MARC Structure
+            my $tagslib = GetMarcStructure(1, $framework);
+
+            my $notreference = ($biblionumber[0] == $mergereference) ? $biblionumber[1] : $biblionumber[0];
+
+            # Creating a loop for display
+            my @record1 = _createMarcHash(GetMarcBiblio($mergereference), $tagslib);
+            my @record2 = _createMarcHash(GetMarcBiblio($notreference), $tagslib);
+
+            # Parameters
+            $template->param(
+                biblio1 => $mergereference,
+                biblio2 => $notreference,
+                mergereference => $mergereference,
+                record1 => @record1,
+                record2 => @record2,
+                framework => $framework,
+            );
+        }
+        else {
+
+        # Ask the user to choose which record will be the kept
+            $template->param(
+                choosereference => 1,	
+                biblio1 => $biblionumber[0],
+                biblio2 => $biblionumber[1],
+                title1 => $data1->{'title'},
+                title2 => $data2->{'title'}
+            );
+            if ($frameworkcode1 ne $frameworkcode2) {
+                my $frameworks = getframeworks;
+                my @frameworkselect;
+                foreach my $thisframeworkcode ( keys %$frameworks ) {
+                    my %row = (
+                        value         => $thisframeworkcode,
+                        frameworktext => $frameworks->{$thisframeworkcode}->{'frameworktext'},
+                    );
+                    if ($frameworkcode1 eq $thisframeworkcode){
+                        $row{'selected'} = 1;
+                        }
+                    push @frameworkselect, \%row;
+                }
+                $template->param(
+                    frameworkselect => \@frameworkselect,
+                    frameworkcode1 => $frameworkcode1,
+                    frameworkcode2 => $frameworkcode2,
+                );
+            }
+        }
     }
 }
+
+if (@errors) {
+    # Errors
+    my @errors_loop  = map{{error => $_}}@errors;
+    $template->param( errors  => \@errors_loop );
+}
+
 output_html_with_http_headers $input, $cookie, $template->output;
 exit;
 
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/merge.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/merge.tt
index 0d8a84c..3300f78 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/merge.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/merge.tt
@@ -161,6 +161,10 @@ $(document).ready(function(){
 
 });
 
+function changeFramework(fw) {
+    $("#Frameworks").val(fw);
+}
+
 //]]>
 </script>
 </head>
@@ -194,10 +198,34 @@ $(document).ready(function(){
 <form id="mergeform" action="/cgi-bin/koha/cataloguing/merge.pl" method="post">
     <fieldset class="rows">
 	<legend>Merge reference</legend>
+    <table>
+      <tr>
+        <td style="border-width: 0px; text-align: left">
 	<ol>
-	<li class="radio"><input type="radio" value="[% biblio1 %]" checked="checked" id="mergereference1" name="mergereference" /><label style="float:none" for="mergereference1">[% title1 %] ([% biblio1 %])</label></li>
-	<li class="radio"><input type="radio" value="[% biblio2 %]" id="mergereference2" name="mergereference" /><label style="float:none" for="mergereference2">[% title2 %] ([% biblio2 %])</label></li>
+	<li class="radio"><input type="radio" value="[% biblio1 %]" checked="checked" id="mergereference1" name="mergereference" onclick="changeFramework('[% frameworkcode1 %]')" /><label style="float:none" for="mergereference1">[% title1 %] ([% biblio1 %])</label></li>
+	<li class="radio"><input type="radio" value="[% biblio2 %]" id="mergereference2" name="mergereference" onclick="changeFramework('[% frameworkcode2 %]')" /><label style="float:none" for="mergereference2">[% title2 %] ([% biblio2 %])</label></li>
 </ol>
+        </td>
+        <td style="border-width: 0px">
+    [% IF frameworkselect %]
+          <label style="float:none" for="frameworkcode">Framework:</label><br>
+            <select name="frameworkcode" id="Frameworks">
+                            <option value="Default">Default</option>
+                            [% FOREACH frameworkcodeloo IN frameworkselect %]
+                                [% IF ( frameworkcodeloo.selected ) %]
+                                    <option value="[% frameworkcodeloo.value %]" selected="selected">
+                                [% ELSE %]
+                                    <option value="[% frameworkcodeloo.value %]">
+                                [% END %]
+                                 [% frameworkcodeloo.frameworktext %]                              
+                                 </option>
+                            [% END %]
+            </select>
+    [% END %]
+        </td>
+      </tr>
+    </table>
+
 	<input type="hidden" name="biblionumber" value="[% biblio1 %]" />
 	<input type="hidden" name="biblionumber" value="[% biblio2 %]" />
 	<fieldset class="action"><input type="submit" value="Next" /></fieldset>
@@ -332,14 +360,15 @@ $(document).ready(function(){
 		[% END %]
 
 	    </ul>
+</div>
+</div> <!-- // #result -->
+</div> <!-- .yui-u -->
 
 <input type="hidden" name="biblio1" value="[% biblio1 %]" />
 <input type="hidden" name="biblio2" value="[% biblio2 %]" />
 <input type="hidden" name="mergereference" value="[% mergereference %]" />
+<input type="hidden" name="frameworkcode" value="[% framework %]" />
 
-</div>
-</div> <!-- // #result -->
-</div> <!-- .yui-u -->
 <fieldset class="action"><input type="submit" name="merge" value="Merge" /></fieldset>
 </div>
 </form>
-- 
1.6.5



More information about the Koha-patches mailing list