From 5a9403316304834ad44bf467269480dd33a1da07 Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@biblibre.com>
Date: Thu, 17 Jul 2014 13:26:46 +0200
Subject: [PATCH] Bug 12595: Search a patron by his/her firstname and surname
Before bug 9811, if you searched for "John Doe" and only 1 patron with
this firstname/surname existed, the patron detail page was displayed.
Now the result lists all patrons with ( firstname=john or doe ) or (
surname=john or doe). Which is quite annoying when you expect only 1
result.
Test plan:
0/ Create some patrons like: "John Doe", "Jane Doe", "John Smith".
1/ Search for "John Doe" in the patron search box
2/ Verify you got 2 results
3/ Apply the patch
4/ Search for "John Doe" in the patron search box
5/ Verify you are redirected to the right patron detail page.
---
C4/Utils/DataTables/Members.pm | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/C4/Utils/DataTables/Members.pm b/C4/Utils/DataTables/Members.pm
index 992d67f..c52007a 100644
--- a/C4/Utils/DataTables/Members.pm
+++ b/C4/Utils/DataTables/Members.pm
@@ -54,7 +54,6 @@ sub search {
# split on coma
$searchmember =~ s/,/ /g if $searchmember;
- my @where_strs_or;
my $searchfields = {
standard => 'surname,firstname,othernames,cardnumber',
email => 'email,emailpro,B_email',
@@ -65,21 +64,23 @@ sub search {
sort1 => 'sort1',
sort2 => 'sort2',
};
- for my $searchfield ( split /,/, $searchfields->{$searchfieldstype} ) {
- foreach my $term ( split / /, $searchmember) {
- next unless $term;
- $searchmember =~ s/\*/%/g; # * is replaced with % for sql
- $term .= '%' # end with anything
- if $term !~ /%$/;
- $term = "%$term" # begin with anythin unless start_with
- if $term !~ /^%/
- and $searchtype eq "contain";
+ foreach my $term ( split / /, $searchmember) {
+ next unless $term;
+ $searchmember =~ s/\*/%/g; # * is replaced with % for sql
+ $term .= '%' # end with anything
+ if $term !~ /%$/;
+ $term = "%$term" # begin with anythin unless start_with
+ if $term !~ /^%/
+ and $searchtype eq "contain";
+ my @where_strs_or;
+ for my $searchfield ( split /,/, $searchfields->{$searchfieldstype} ) {
push @where_strs_or, "borrowers." . $dbh->quote_identifier($searchfield) . " LIKE ?";
push @where_args, $term;
}
+
+ push @where_strs, '('. join (' OR ', @where_strs_or) . ')'
+ if @where_strs_or;
}
- push @where_strs, '('. join (' OR ', @where_strs_or) . ')'
- if @where_strs_or;
my $where;
$where = " WHERE " . join (" AND ", @where_strs) if @where_strs;
--
2.0.0.rc2