From 914a8e9dc059f35db23f5e00319924471874a3ec Mon Sep 17 00:00:00 2001
From: Julian Maurice <julian.maurice@biblibre.com>
Date: Fri, 2 Sep 2016 15:55:11 +0200
Subject: [PATCH] Bug 8995: Fix URL generation when the URL in syspref has a
 query part

---
 C4/Biblio.pm                                        | 21 +++++++++++++++++++++
 C4/XSLT.pm                                          |  3 ++-
 .../bootstrap/en/xslt/MARC21slim2OPACDetail.xsl     |  7 ++-----
 .../bootstrap/en/xslt/MARC21slim2OPACResults.xsl    |  7 ++-----
 .../bootstrap/en/xslt/UNIMARCslim2OPACDetail.xsl    |  7 ++-----
 .../bootstrap/en/xslt/UNIMARCslim2OPACResults.xsl   |  7 ++-----
 6 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/C4/Biblio.pm b/C4/Biblio.pm
index 8ac50966fe..522bae5641 100644
--- a/C4/Biblio.pm
+++ b/C4/Biblio.pm
@@ -28,6 +28,7 @@ use MARC::File::USMARC;
 use MARC::File::XML;
 use POSIX qw(strftime);
 use Module::Load::Conditional qw(can_load);
+use URI;
 use URI::Escape; # GetCOinSBiblio
 
 use C4::Koha;
@@ -1470,6 +1471,26 @@ sub GetCOinSBiblio {
     return $coins_value;
 }
 
+sub GetOpenURLResolverURL {
+    my ($record) = @_;
+
+    my $coins = GetCOinSBiblio($record);
+    my $OpenURLResolverURL = C4::Context->preference('OpenURLResolverURL');
+
+    if ($OpenURLResolverURL) {
+        my $uri = URI->new($OpenURLResolverURL);
+
+        if (not defined $uri->query) {
+            $OpenURLResolverURL .= '?';
+        } else {
+            $OpenURLResolverURL .= '&amp;';
+        }
+        $OpenURLResolverURL .= $coins;
+    }
+
+    return $OpenURLResolverURL;
+}
+
 
 =head2 GetMarcPrice
 
diff --git a/C4/XSLT.pm b/C4/XSLT.pm
index 791d7f3d19..d0ea0abefd 100644
--- a/C4/XSLT.pm
+++ b/C4/XSLT.pm
@@ -250,7 +250,8 @@ sub XSLTParse4Display {
         my ($biblio) = GetBiblioItemByBiblioNumber($biblionumber);
         my @itypes = split( /\s/, C4::Context->preference('OPACOpenURLItemTypes') );
         if (grep /^$biblio->{itemtype}$/, @itypes) {
-            $variables->{COinS} = C4::Biblio::GetCOinSBiblio($orig_record);
+            $variables->{OpenURLResolverURL} =
+              C4::Biblio::GetOpenURLResolverURL($orig_record);
         }
     }
     my $varxml = "<variables>\n";
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACDetail.xsl b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACDetail.xsl
index 10a78fbb60..3f3ac3b69d 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACDetail.xsl
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACDetail.xsl
@@ -1249,12 +1249,11 @@
 
         <!-- OpenURL -->
         <xsl:variable name="OPACShowOpenURL" select="marc:sysprefs/marc:syspref[@name='OPACShowOpenURL']" />
-        <xsl:variable name="OpenURLResolverURL" select="marc:sysprefs/marc:syspref[@name='OpenURLResolverURL']" />
         <xsl:variable name="OpenURLImageLocation" select="marc:sysprefs/marc:syspref[@name='OpenURLImageLocation']" />
         <xsl:variable name="OpenURLText" select="marc:sysprefs/marc:syspref[@name='OpenURLText']" />
-        <xsl:variable name="COinS" select="marc:variables/marc:variable[@name='COinS']" />
+        <xsl:variable name="OpenURLResolverURL" select="marc:variables/marc:variable[@name='OpenURLResolverURL']" />
 
-        <xsl:if test="$OPACShowOpenURL = 1 and $OpenURLResolverURL != '' and $COinS != ''">
+        <xsl:if test="$OPACShowOpenURL = 1 and $OpenURLResolverURL != ''">
           <xsl:variable name="openurltext">
             <xsl:choose>
               <xsl:when test="$OpenURLText != ''">
@@ -1281,8 +1280,6 @@
           <span class="results_summary"><a>
             <xsl:attribute name="href">
               <xsl:value-of select="$OpenURLResolverURL" />
-              <xsl:text>?</xsl:text>
-              <xsl:value-of select="$COinS" />
             </xsl:attribute>
             <xsl:attribute name="title">
               <xsl:value-of select="$openurltext" />
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACResults.xsl b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACResults.xsl
index 168e497e59..53f9f54656 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACResults.xsl
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACResults.xsl
@@ -446,12 +446,11 @@
 
     <!-- OpenURL -->
     <xsl:variable name="OPACShowOpenURL" select="marc:sysprefs/marc:syspref[@name='OPACShowOpenURL']" />
-    <xsl:variable name="OpenURLResolverURL" select="marc:sysprefs/marc:syspref[@name='OpenURLResolverURL']" />
     <xsl:variable name="OpenURLImageLocation" select="marc:sysprefs/marc:syspref[@name='OpenURLImageLocation']" />
     <xsl:variable name="OpenURLText" select="marc:sysprefs/marc:syspref[@name='OpenURLText']" />
-    <xsl:variable name="COinS" select="marc:variables/marc:variable[@name='COinS']" />
+    <xsl:variable name="OpenURLResolverURL" select="marc:variables/marc:variable[@name='OpenURLResolverURL']" />
 
-    <xsl:if test="$OPACShowOpenURL = 1 and $OpenURLResolverURL != '' and $COinS != ''">
+    <xsl:if test="$OPACShowOpenURL = 1 and $OpenURLResolverURL != ''">
       <xsl:variable name="openurltext">
         <xsl:choose>
           <xsl:when test="$OpenURLText != ''">
@@ -478,8 +477,6 @@
       <span class="results_summary"><a>
         <xsl:attribute name="href">
           <xsl:value-of select="$OpenURLResolverURL" />
-          <xsl:text>?</xsl:text>
-          <xsl:value-of select="$COinS" />
         </xsl:attribute>
         <xsl:attribute name="title">
           <xsl:value-of select="$openurltext" />
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/UNIMARCslim2OPACDetail.xsl b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/UNIMARCslim2OPACDetail.xsl
index b24a459944..9cf3554a47 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/UNIMARCslim2OPACDetail.xsl
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/UNIMARCslim2OPACDetail.xsl
@@ -445,12 +445,11 @@
 
   <!-- OpenURL -->
   <xsl:variable name="OPACShowOpenURL" select="marc:sysprefs/marc:syspref[@name='OPACShowOpenURL']" />
-  <xsl:variable name="OpenURLResolverURL" select="marc:sysprefs/marc:syspref[@name='OpenURLResolverURL']" />
   <xsl:variable name="OpenURLImageLocation" select="marc:sysprefs/marc:syspref[@name='OpenURLImageLocation']" />
   <xsl:variable name="OpenURLText" select="marc:sysprefs/marc:syspref[@name='OpenURLText']" />
-  <xsl:variable name="COinS" select="marc:variables/marc:variable[@name='COinS']" />
+  <xsl:variable name="OpenURLResolverURL" select="marc:variables/marc:variable[@name='OpenURLResolverURL']" />
 
-  <xsl:if test="$OPACShowOpenURL = 1 and $OpenURLResolverURL != '' and $COinS != ''">
+  <xsl:if test="$OPACShowOpenURL = 1 and $OpenURLResolverURL != ''">
     <xsl:variable name="openurltext">
       <xsl:choose>
         <xsl:when test="$OpenURLText != ''">
@@ -477,8 +476,6 @@
     <span class="results_summary"><a>
       <xsl:attribute name="href">
         <xsl:value-of select="$OpenURLResolverURL" />
-        <xsl:text>?</xsl:text>
-        <xsl:value-of select="$COinS" />
       </xsl:attribute>
       <xsl:attribute name="title">
         <xsl:value-of select="$openurltext" />
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/UNIMARCslim2OPACResults.xsl b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/UNIMARCslim2OPACResults.xsl
index cdf56df7b1..2cebcd00d1 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/UNIMARCslim2OPACResults.xsl
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/UNIMARCslim2OPACResults.xsl
@@ -86,12 +86,11 @@
 
   <!-- OpenURL -->
   <xsl:variable name="OPACShowOpenURL" select="marc:sysprefs/marc:syspref[@name='OPACShowOpenURL']" />
-  <xsl:variable name="OpenURLResolverURL" select="marc:sysprefs/marc:syspref[@name='OpenURLResolverURL']" />
   <xsl:variable name="OpenURLImageLocation" select="marc:sysprefs/marc:syspref[@name='OpenURLImageLocation']" />
   <xsl:variable name="OpenURLText" select="marc:sysprefs/marc:syspref[@name='OpenURLText']" />
-  <xsl:variable name="COinS" select="marc:variables/marc:variable[@name='COinS']" />
+  <xsl:variable name="OpenURLResolverURL" select="marc:variables/marc:variable[@name='OpenURLResolverURL']" />
 
-  <xsl:if test="$OPACShowOpenURL = 1 and $OpenURLResolverURL != '' and $COinS != ''">
+  <xsl:if test="$OPACShowOpenURL = 1 and $OpenURLResolverURL != ''">
     <xsl:variable name="openurltext">
       <xsl:choose>
         <xsl:when test="$OpenURLText != ''">
@@ -118,8 +117,6 @@
     <span class="results_summary"><a>
       <xsl:attribute name="href">
         <xsl:value-of select="$OpenURLResolverURL" />
-        <xsl:text>?</xsl:text>
-        <xsl:value-of select="$COinS" />
       </xsl:attribute>
       <xsl:attribute name="title">
         <xsl:value-of select="$openurltext" />
-- 
2.11.0