/
FilterByKeywordTrait.php
97 lines (84 loc) · 3.71 KB
/
FilterByKeywordTrait.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
/**
* Created by PhpStorm.
* User: Bojidar
* Date: 10/15/2020
* Time: 3:42 PM
*/
namespace MicroweberPackages\Content\Models\ModelFilters\Traits;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Config;
use MicroweberPackages\Helper\XSSClean;
use MicroweberPackages\Multilanguage\Models\MultilanguageTranslations;
use MicroweberPackages\Multilanguage\MultilanguageHelpers;
trait FilterByKeywordTrait
{
public function keyword($keyword)
{
$model = $this->getModel();
$table = $model->getTable();
$searchInFields = $model->getSearchable();
$keywordToSearch = false;
$xssClean = new XSSClean();
if (is_string($keyword)) {
$keyword = $xssClean->clean($keyword);
if ($keyword) {
$keywordToSearch = $keyword;
}
}
if ($keywordToSearch) {
if (isset($this->input['searchInFields'])) {
$searchInFieldsNew = [];
$searchInFieldsInput = $this->input['searchInFields'];
if (strpos($this->input['searchInFields'], ',') !== false) {
$searchInFieldsInputArr = explode(',', $this->input['searchInFields']);
}
if (is_string($searchInFieldsInput)) {
$searchInFieldsInputArr = array($searchInFieldsInput);
}
if ($searchInFieldsInputArr) {
$searchInFieldsInputArr = array_map('trim', $searchInFieldsInputArr);
if ($searchInFieldsInputArr) {
foreach ($searchInFieldsInputArr as $item) {
if (in_array($item, $searchInFields)) {
$searchInFieldsNew[] = $item;
}
}
}
}
if (!empty($searchInFieldsNew)) {
$searchInFields = $searchInFieldsNew;
}
}
$this->query->where(function ($subQuerySearch) use ($table, $searchInFields, $keywordToSearch) {
if ($searchInFields) {
$antiXss = new \MicroweberPackages\Helper\HTMLClean();
$keywordToSearch = $antiXss->clean($keywordToSearch);
$keywordToSearch = mb_trim($keywordToSearch);
if ($keywordToSearch != '') {
if (mb_strlen($keywordToSearch) > 1000) {
$keywordToSearch = mb_substr($keywordToSearch, 0, 1000);
}
foreach ($searchInFields as $field) {
$subQuerySearch->orWhere($table . '.' . $field, 'LIKE', '%' . $keywordToSearch . '%');
}
}
}
return $subQuerySearch;
});
if (MultilanguageHelpers::multilanguageIsEnabled()) {
$multilanguageTranslationsQuery = MultilanguageTranslations::query();
$multilanguageTranslationsQuery->where('rel_type', $table);
$multilanguageTranslationsQuery->whereIn('field_name', ['url', 'description', 'title']);
$multilanguageTranslationsQuery->where('field_value', 'LIKE', '%' . $keywordToSearch . '%');
$multilanguageTranslationsQuery->limit(3000); // MYSQL LIMIT FOR WHERE IN
$multilanguageTranslations = $multilanguageTranslationsQuery->get();
$relIds = $multilanguageTranslations->pluck('rel_id');
if (!empty($relIds)) {
$this->query->orWhereIn($table.'.id', $relIds);
}
}
return $this->query;
}
}
}