|
Lines 25-31
use vars qw(@ISA @EXPORT);
Link Here
|
| 25 |
BEGIN { |
25 |
BEGIN { |
| 26 |
|
26 |
|
| 27 |
@ISA = qw(Exporter); |
27 |
@ISA = qw(Exporter); |
| 28 |
@EXPORT = qw(dt_build_orderby dt_build_having dt_get_params); |
28 |
@EXPORT = qw(dt_build_orderby dt_get_params); |
| 29 |
} |
29 |
} |
| 30 |
|
30 |
|
| 31 |
=head1 NAME |
31 |
=head1 NAME |
|
Lines 46-53
C4::Utils::DataTables - Utility subs for building query when DataTables source i
Link Here
|
| 46 |
FROM borrowers |
46 |
FROM borrowers |
| 47 |
WHERE borrowernumber = ? |
47 |
WHERE borrowernumber = ? |
| 48 |
}; |
48 |
}; |
| 49 |
my ($having, $having_params) = dt_build_having($vars); |
|
|
| 50 |
$query .= $having; |
| 51 |
$query .= dt_build_orderby($vars); |
49 |
$query .= dt_build_orderby($vars); |
| 52 |
$query .= " LIMIT ?,? "; |
50 |
$query .= " LIMIT ?,? "; |
| 53 |
|
51 |
|
|
Lines 106-187
sub dt_build_orderby {
Link Here
|
| 106 |
return $orderby; |
104 |
return $orderby; |
| 107 |
} |
105 |
} |
| 108 |
|
106 |
|
| 109 |
=head2 dt_build_having |
|
|
| 110 |
|
| 111 |
my ($having, $having_params) = dt_build_having($dt_params) |
| 112 |
|
| 113 |
This function takes a reference to a hash containing DataTables parameters |
| 114 |
and build the corresponding 'HAVING' clause. |
| 115 |
This hash must contains the following keys: |
| 116 |
sSearch is the text entered in the global filter |
| 117 |
iColumns is the number of columns |
| 118 |
bSearchable_N is a boolean value that is true if the column is searchable |
| 119 |
mDataProp_N is a mapping between the column index, and the name of a SQL field |
| 120 |
sSearch_N is the text entered in individual filter for column N |
| 121 |
|
| 122 |
=cut |
| 123 |
|
| 124 |
sub dt_build_having { |
| 125 |
my $param = shift; |
| 126 |
|
| 127 |
my @filters; |
| 128 |
my @params; |
| 129 |
|
| 130 |
# Global filter |
| 131 |
if($param->{'sSearch'}) { |
| 132 |
my $sSearch = $param->{'sSearch'}; |
| 133 |
my $i = 0; |
| 134 |
my @gFilters; |
| 135 |
my @gParams; |
| 136 |
while($i < $param->{'iColumns'}) { |
| 137 |
if($param->{'bSearchable_'.$i} eq 'true') { |
| 138 |
my $mDataProp = $param->{'mDataProp_'.$i}; |
| 139 |
my @filter_fields = $param->{$mDataProp.'_filteron'} |
| 140 |
? split(' ', $param->{$mDataProp.'_filteron'}) |
| 141 |
: (); |
| 142 |
if(@filter_fields > 0) { |
| 143 |
foreach my $field (@filter_fields) { |
| 144 |
push @gFilters, " $field LIKE ? "; |
| 145 |
push @gParams, "%$sSearch%"; |
| 146 |
} |
| 147 |
} else { |
| 148 |
push @gFilters, " $mDataProp LIKE ? "; |
| 149 |
push @gParams, "%$sSearch%"; |
| 150 |
} |
| 151 |
} |
| 152 |
$i++; |
| 153 |
} |
| 154 |
push @filters, " (" . join(" OR ", @gFilters) . ") "; |
| 155 |
push @params, @gParams; |
| 156 |
} |
| 157 |
|
| 158 |
# Individual filters |
| 159 |
my $i = 0; |
| 160 |
while($i < $param->{'iColumns'}) { |
| 161 |
my $sSearch = $param->{'sSearch_'.$i}; |
| 162 |
if($sSearch) { |
| 163 |
my $mDataProp = $param->{'mDataProp_'.$i}; |
| 164 |
my @filter_fields = $param->{$mDataProp.'_filteron'} |
| 165 |
? split(' ', $param->{$mDataProp.'_filteron'}) |
| 166 |
: (); |
| 167 |
if(@filter_fields > 0) { |
| 168 |
my @localfilters; |
| 169 |
foreach my $field (@filter_fields) { |
| 170 |
push @localfilters, " $field LIKE ? "; |
| 171 |
push @params, "%$sSearch%"; |
| 172 |
} |
| 173 |
push @filters, " ( ". join(" OR ", @localfilters) ." ) "; |
| 174 |
} else { |
| 175 |
push @filters, " $mDataProp LIKE ? "; |
| 176 |
push @params, "%$sSearch%"; |
| 177 |
} |
| 178 |
} |
| 179 |
$i++; |
| 180 |
} |
| 181 |
|
| 182 |
return (\@filters, \@params); |
| 183 |
} |
| 184 |
|
| 185 |
=head2 dt_get_params |
107 |
=head2 dt_get_params |
| 186 |
|
108 |
|
| 187 |
my %dtparam = = dt_get_params( $input ) |
109 |
my %dtparam = = dt_get_params( $input ) |