@@ -13,14 +13,17 @@ class Filtrator implements FiltratorContract {
1313 'limit ' , 'first ' , 'last ' , 'keys '
1414 ];
1515
16+ private $ customFilters = [];
17+
1618 /**
19+ * Очередь фильтров с параметрами
1720 *
1821 * @var array
1922 */
2023 protected $ sequenceFilters ;
2124
2225 public function addFilter (string $ filterType , array $ filterParams = []): void {
23- if ($ this ->hasFilter ($ filterType )) {
26+ if ($ this ->hasFilter ($ filterType ) || $ this -> hasCustomFilter ( $ filterType ) ) {
2427 $ this ->sequenceFilters [] = [
2528 'type ' => $ filterType ,
2629 'params ' => $ filterParams
@@ -73,7 +76,13 @@ public function clearFilters(): void {
7376 public function filtrate ($ data ) {
7477 if (!empty ($ this ->sequenceFilters ) && !empty ($ data )) {
7578 foreach ($ this ->sequenceFilters as $ arFilter ) {
76- $ data = $ this ->filtrateItem ($ arFilter ['type ' ], $ arFilter ['params ' ], $ data );
79+ if ($ this ->hasCustomFilter ($ arFilter ['type ' ]))
80+ {
81+ $ data = $ this ->customFiltrateItem ($ arFilter ['type ' ], $ arFilter ['params ' ], $ data );
82+ }
83+ else {
84+ $ data = $ this ->filtrateItem ($ arFilter ['type ' ], $ arFilter ['params ' ], $ data );
85+ }
7786 }
7887 }
7988
@@ -84,4 +93,20 @@ public function hasFilter(string $filterType): bool {
8493 return \in_array ($ filterType , self ::FILTERS_NAME );
8594 }
8695
96+ public function addCustomFilter (string $ filterName , callable $ callback ) {
97+ if (!$ this ->hasCustomFilter ($ filterName )) {
98+ $ this ->customFilters [$ filterName ] = $ callback ;
99+ }
100+
101+ return $ this ;
102+ }
103+
104+ public function customFiltrateItem (string $ filterType , array $ filterParams , $ data ) {
105+ return $ this ->customFilters [$ filterType ]($ data , $ filterParams );
106+ }
107+
108+ public function hasCustomFilter (string $ filterName ) {
109+ return \array_key_exists ($ filterName , $ this ->customFilters );
110+ }
111+
87112}
0 commit comments