Skip to content

Commit 0cd4211

Browse files
committed
improve filter method, add forceExactMatch
1 parent 35e4a64 commit 0cd4211

File tree

8 files changed

+143
-17
lines changed

8 files changed

+143
-17
lines changed

src/Column.php

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,19 @@ class Column
5050
* Custom filter
5151
* @var \Closure
5252
*/
53-
public $customFilter;
53+
public $customIndividualFilter;
54+
55+
/**
56+
* Custom filter
57+
* @var \Closure
58+
*/
59+
public $customGlobalFilter;
60+
61+
/**
62+
*
63+
* @var string
64+
*/
65+
public $customFilterType;
5466

5567
/**
5668
* Column constructor.
@@ -82,7 +94,7 @@ public function value($row): string
8294
* Set visibility of the column.
8395
* @param bool $searchable
8496
*/
85-
public function hide($searchable = false): void
97+
public function hide(bool $searchable = false): void
8698
{
8799
$this->hidden = true;
88100
$this->forceSearch = $searchable;
@@ -91,9 +103,17 @@ public function hide($searchable = false): void
91103
/**
92104
* @return bool
93105
*/
94-
public function hasFilter(): bool
106+
public function hasCustomIndividualFilter(): bool
107+
{
108+
return $this->customIndividualFilter instanceof \Closure;
109+
}
110+
111+
/**
112+
* @return bool
113+
*/
114+
public function hasCustomGlobalFilter(): bool
95115
{
96-
return $this->customFilter instanceof \Closure;
116+
return $this->customGlobalFilter instanceof \Closure;
97117
}
98118

99119
/**

src/CustomFilterType.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace Ozdemir\Datatables;
4+
5+
class CustomFilterType
6+
{
7+
const INDIVIDUAL = 'individual';
8+
const GLOBALLY = 'globally';
9+
const ALL = 'all';
10+
}

src/DB/DBAdapter.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
abstract class DBAdapter implements DatabaseInterface
1212
{
13+
public $exactMatch = false;
1314

1415
/**
1516
* @return void
@@ -64,17 +65,46 @@ public function makeWhereString(array $filter)
6465
return ' WHERE '.implode(' AND ', $filter);
6566
}
6667

68+
69+
/**
70+
* @return bool
71+
*/
72+
public function isExactMatch()
73+
{
74+
return $this->exactMatch;
75+
}
76+
77+
/**
78+
* @param bool $value
79+
* @return void
80+
*/
81+
public function setExactMatch(bool $value)
82+
{
83+
$this->exactMatch = $value;
84+
}
85+
6786
/**
6887
* @param Query $query
6988
* @param Column $column
70-
* @param $word
89+
* @param string $word
7190
* @return string
7291
*/
7392
public function makeLikeString(Query $query, Column $column, string $word)
7493
{
7594
return $column->name.' LIKE '.$this->escape('%'.$word.'%', $query);
7695
}
7796

97+
/**
98+
* @param Query $query
99+
* @param Column $column
100+
* @param string $word
101+
* @return string
102+
*/
103+
public function makeEqualString(Query $query, Column $column, string $word)
104+
{
105+
return $column->name.' = '.$this->escape( $word, $query);
106+
}
107+
78108
/**
79109
* @param array $o
80110
* @return string

src/DB/DatabaseInterface.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,17 @@ public function makeDistinctQueryString(Query $query, string $column);
5454
*/
5555
public function makeWhereString(array $filter);
5656

57+
/**
58+
* @param bool $value
59+
* @return void
60+
*/
61+
public function setExactMatch(bool $value);
62+
63+
/**
64+
* @return mixed
65+
*/
66+
public function isExactMatch();
67+
5768
/**
5869
* @param Query $query
5970
* @param Column $column
@@ -62,6 +73,15 @@ public function makeWhereString(array $filter);
6273
*/
6374
public function makeLikeString(Query $query, Column $column, string $word);
6475

76+
77+
/**
78+
* @param Query $query
79+
* @param Column $column
80+
* @param string $word
81+
* @return mixed
82+
*/
83+
public function makeEqualString(Query $query, Column $column, string $word);
84+
6585
/**
6686
* @param array $o
6787
* @return mixed

src/Datatables.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,18 @@ public function edit($column, Closure $closure): Datatables
110110
* @param Closure $closure
111111
* @return Datatables
112112
*/
113-
public function filter($column, Closure $closure): Datatables
113+
public function filter($column, Closure $closure, $filterType = CustomFilterType::INDIVIDUAL): Datatables
114114
{
115115
$column = $this->columns->getByName($column);
116-
$column->customFilter = $closure;
116+
$column->customIndividualFilter = $closure;
117+
118+
$column->customFilterType = $filterType;
119+
if ($filterType !== CustomFilterType::GLOBALLY) {
120+
$column->customIndividualFilter = $closure;
121+
}
122+
if ($filterType !== CustomFilterType::INDIVIDUAL) {
123+
$column->customGlobalFilter = $closure;
124+
}
117125

118126
return $this;
119127
}
@@ -130,6 +138,17 @@ public function escape($key, $value): Datatables
130138
return $this;
131139
}
132140

141+
/**
142+
* @param bool $value
143+
* @return Datatables
144+
*/
145+
public function forceExactMatch(bool $value): Datatables
146+
{
147+
$this->db->setExactMatch($value);
148+
149+
return $this;
150+
}
151+
133152
/**
134153
* @param $name
135154
* @return Datatables

src/FilterHelper.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,24 @@ class FilterHelper
2424
*/
2525
private $db;
2626

27+
/**
28+
* @var string|null
29+
*/
30+
private $searchValue;
31+
32+
2733
/**
2834
* FilterHelper constructor.
2935
* @param Query $query
3036
* @param Column $column
3137
* @param DatabaseInterface $db
3238
*/
33-
public function __construct(Query $query, Column $column, DatabaseInterface $db)
39+
public function __construct(Query $query, Column $column, DatabaseInterface $db, $searchValue = null)
3440
{
3541
$this->query = $query;
3642
$this->column = $column;
3743
$this->db = $db;
44+
$this->searchValue = $searchValue;
3845
}
3946

4047
/**
@@ -51,14 +58,18 @@ public function escape($value): string
5158
*/
5259
public function searchValue(): string
5360
{
54-
return $this->column->searchValue();
61+
return $this->searchValue ?? $this->column->searchValue();
5562
}
5663

5764
/**
5865
* @return string
5966
*/
6067
public function defaultFilter(): string
6168
{
69+
if ($this->db->isExactMatch()) {
70+
return $this->db->makeEqualString($this->query, $this->column, $this->searchValue());
71+
}
72+
6273
return $this->db->makeLikeString($this->query, $this->column, $this->searchValue());
6374
}
6475

@@ -116,4 +127,4 @@ public function lessThan($value): string
116127
return $this->column->name.' <= '.$this->escape($value);
117128
}
118129

119-
}
130+
}

src/Iterators/IndividualSearchableColumns.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ class IndividualSearchableColumns extends FilterIterator
1717
*/
1818
public function accept(): bool
1919
{
20-
return $this->current()->searchValue() !== '' || $this->current()->hasFilter();
20+
return $this->current()->searchValue() !== '' || $this->current()->hasCustomIndividualFilter();
2121
}
22-
}
22+
}

src/QueryBuilder.php

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -231,9 +231,11 @@ protected function filterGlobal(Query $query): string
231231
$look = [];
232232

233233
foreach ($columns as $column) {
234-
$look[] = $this->db->makeLikeString($query, $column, $word);
234+
$look[] = $this->columnGlobalFilter($column, new FilterHelper($query, $column, $this->db, $word));
235235
}
236236

237+
$look = array_filter($look);
238+
237239
$search[] = '('.implode(' OR ', $look).')';
238240
}
239241

@@ -250,7 +252,7 @@ protected function filterIndividual(Query $query): string
250252
$look = [];
251253

252254
foreach ($columns as $column) {
253-
$look[] = $this->columnFilter($column, new FilterHelper($query, $column, $this->db));
255+
$look[] = $this->columnIndividualFilter($column, new FilterHelper($query, $column, $this->db));
254256
}
255257

256258
$look = array_filter($look);
@@ -319,10 +321,24 @@ public function defaultOrder(): string
319321
* @param FilterHelper $helper
320322
* @return string
321323
*/
322-
public function columnFilter(Column $column, FilterHelper $helper): string
324+
public function columnIndividualFilter(Column $column, FilterHelper $helper): string
325+
{
326+
if ($column->hasCustomIndividualFilter()) {
327+
return $column->customIndividualFilter->call($helper) ?? $helper->defaultFilter();
328+
}
329+
330+
return $helper->defaultFilter();
331+
}
332+
333+
/**
334+
* @param Column $column
335+
* @param FilterHelper $helper
336+
* @return string
337+
*/
338+
public function columnGlobalFilter(Column $column, FilterHelper $helper): string
323339
{
324-
if ($column->hasFilter()) {
325-
return $column->customFilter->call($helper) ?? $helper->defaultFilter();
340+
if ($column->hasCustomGlobalFilter()) {
341+
return $column->customGlobalFilter->call($helper) ?? $helper->defaultFilter();
326342
}
327343

328344
return $helper->defaultFilter();

0 commit comments

Comments
 (0)