From 1f6f0e5c78fb959cc331220fa6c488c915ab9d6b Mon Sep 17 00:00:00 2001 From: Jonathan Druart 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. Signed-off-by: Dobrica Pavlinusic --- C4/Utils/DataTables/Members.pm | 25 +++++++++++++------------ 1 files 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; -- 1.7.2.5