Skip to content
This repository was archived by the owner on Feb 4, 2023. It is now read-only.

Commit e7ff38c

Browse files
committedDec 17, 2020
added 'keywords_string' global search type
1 parent 257592e commit e7ff38c

File tree

3 files changed

+49
-19
lines changed

3 files changed

+49
-19
lines changed
 

‎Datatable/Options.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ public function configureOptions(OptionsResolver $resolver)
299299
$resolver->setAllowedTypes('global_search_type', 'string');
300300

301301
$resolver->setAllowedValues('individual_filtering_position', ['head', 'foot', 'both']);
302-
$resolver->setAllowedValues('global_search_type', ['like', '%like', 'like%', 'notLike', 'eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'in', 'notIn', 'isNull', 'isNotNull']);
302+
$resolver->setAllowedValues('global_search_type', ['like', 'keywords_string', '%like', 'like%', 'notLike', 'eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'in', 'notIn', 'isNull', 'isNotNull']);
303303

304304
return $this;
305305
}

‎Resources/doc/options.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ With 'null' initialized options uses the default value of the DataTables plugin.
2626
| individual_filtering | bool | false | Enable or disable individual filtering. |
2727
| individual_filtering_position | string | 'head' | Position of individual search filter ('head', 'foot' or 'both'). |
2828
| search_in_non_visible_columns | bool | false | Determines whether to search in non-visible columns. |
29-
| global_search_type | string | 'like' | The global search type (example: 'eq'). |
29+
| global_search_type | string | 'like' | The global search type (example: 'eq'). Use 'keywords_string' to search by multiple keywords. |
3030

3131
``` php
3232
class PostDatatable extends AbstractDatatable

‎Response/DatatableQueryBuilder.php

+47-17
Original file line numberDiff line numberDiff line change
@@ -500,38 +500,68 @@ private function setJoins(QueryBuilder $qb)
500500
*/
501501
private function setWhere(QueryBuilder $qb)
502502
{
503+
// Retrieving parameter counter
504+
$parameterCounter = self::INIT_PARAMETER_COUNTER;
505+
503506
// global filtering
504507
if (isset($this->requestParams['search']) && '' !== $this->requestParams['search']['value']) {
505-
$orExpr = $qb->expr()->orX();
506508

507509
$globalSearch = $this->requestParams['search']['value'];
508510
$globalSearchType = $this->options->getGlobalSearchType();
509511

510-
foreach ($this->columns as $key => $column) {
511-
if (true === $this->isSearchableColumn($column)) {
512-
/** @var AbstractFilter $filter */
513-
$filter = $this->accessor->getValue($column, 'filter');
514-
$searchType = $globalSearchType;
515-
$searchFields = (array) $this->searchColumns[$key];
516-
$searchValue = $globalSearch;
517-
$searchTypeOfField = $column->getTypeOfField();
518-
foreach ($searchFields as $searchField) {
519-
$orExpr = $filter->addOrExpression($orExpr, $qb, $searchType, $searchField, $searchValue, $searchTypeOfField, $key);
512+
// If global search type is a list of key words
513+
if ($globalSearchType == 'keywords_string') {
514+
515+
// Removing unnecessary spaces at the beginning and at the end
516+
$globalSearch = trim($globalSearch);
517+
518+
// Removing multiples spaces
519+
$globalSearch = preg_replace('!\s+!', ' ', $globalSearch);
520+
521+
// Parsing search value to array of keywords
522+
$keywords = explode(' ', $globalSearch);
523+
524+
// Setting type of search type to 'like'
525+
$globalSearchType = 'like';
526+
527+
// Else considering only one searchstring
528+
} else {
529+
$keywords = [$globalSearch];
530+
}
531+
532+
// Iterating through each keyword
533+
foreach ($keywords as $k => $word) {
534+
535+
// Initialising 'OR' expression
536+
$orExpr = $qb->expr()->orX();
537+
538+
// Iterating through columns
539+
foreach ($this->columns as $key => $column) {
540+
541+
if (true === $this->isSearchableColumn($column)) {
542+
/** @var AbstractFilter $filter */
543+
$filter = $this->accessor->getValue($column, 'filter');
544+
$searchType = $globalSearchType;
545+
$searchFields = (array) $this->searchColumns[$key];
546+
$searchValue = $keywords[$k];
547+
$searchTypeOfField = $column->getTypeOfField();
548+
foreach ($searchFields as $searchField) {
549+
$orExpr = $filter->addOrExpression($orExpr, $qb, $searchType, $searchField, $searchValue, $searchTypeOfField, $parameterCounter);
550+
}
520551
}
521552
}
522-
}
523-
524-
if ($orExpr->count() > 0) {
525-
$qb->andWhere($orExpr);
553+
554+
// Adding 'OR' expression to global 'WHERE'
555+
if ($orExpr->count() > 0) {
556+
$qb->andWhere($orExpr);
557+
}
526558
}
527559
}
528560

529561
// individual filtering
530562
if (true === $this->accessor->getValue($this->options, 'individualFiltering')) {
531563
$andExpr = $qb->expr()->andX();
532564

533-
$parameterCounter = self::INIT_PARAMETER_COUNTER;
534-
535565
foreach ($this->columns as $key => $column) {
536566
if (true === $this->isSearchableColumn($column)) {
537567
if (false === \array_key_exists($key, $this->requestParams['columns'])) {

0 commit comments

Comments
 (0)