14
14
class Servers extends Controller {
15
15
public function &run (Router &$ router , View &$ view , array &$ args ) {
16
16
$ model = new ServersModel ();
17
- $ this ->getServers ($ model );
17
+
18
+ $ query = $ router ->getRequestQueryArray ();
19
+ $ this ->getServers ($ model , $ query );
18
20
19
21
$ view ->render ($ model );
20
22
$ model ->_responseCode = 200 ;
21
23
return $ model ;
22
24
}
23
25
24
- protected function getServers (ServersModel &$ model ) {
25
- $ model ->server_types = ServerTypeLib:: getAllServerTypes ();
26
+ protected function getServers (ServersModel &$ model, array & $ q ) {
27
+ $ model ->server_types = array ();
26
28
$ model ->servers = ServerLib::getAllServers ();
27
29
$ model ->status_bitmasks = [
28
30
[
@@ -36,5 +38,99 @@ protected function getServers(ServersModel &$model) {
36
38
'label ' => 'Disabled '
37
39
]
38
40
];
41
+
42
+ // collect filter queries
43
+
44
+ $ sort = (isset ($ q ['sort ' ]) ? $ q ['sort ' ] : null );
45
+ $ status = (isset ($ q ['status ' ]) ? $ q ['status ' ] : null );
46
+ $ type_id = (isset ($ q ['type_id ' ]) ? $ q ['type_id ' ] : null );
47
+ $ user_id = (isset ($ q ['user_id ' ]) ? $ q ['user_id ' ] : null );
48
+
49
+ // filter by status bitmask
50
+
51
+ if (!is_null ($ status ) && is_numeric ($ status )) {
52
+ foreach ($ model ->servers as $ it => $ server ) {
53
+ if (!($ server ->getStatusBitmask () & $ status )) {
54
+ unset($ model ->servers [$ it ]);
55
+ }
56
+ }
57
+ }
58
+
59
+ // filter by type_id
60
+
61
+ if (!is_null ($ type_id ) && is_numeric ($ type_id )) {
62
+ // type_id is a single integer
63
+ foreach ($ model ->servers as $ it => $ server ) {
64
+ if ($ server ->getTypeId () != $ type_id ) {
65
+ unset($ model ->servers [$ it ]);
66
+ }
67
+ }
68
+ }
69
+
70
+ if (is_string ($ type_id ) && preg_match ('/^(?:\d+,?)+$/ ' , $ type_id )) {
71
+ // type_id is a string like "1,2,3"
72
+ $ type_id = explode (', ' , $ type_id );
73
+ }
74
+
75
+ if ($ type_id && is_array ($ type_id )) {
76
+ foreach ($ model ->servers as $ it => $ server ) {
77
+ $ found = false ;
78
+ foreach ($ type_id as $ _type ) {
79
+ if ($ server ->getTypeId () == $ _type ) {
80
+ $ found = true ;
81
+ break ;
82
+ }
83
+ }
84
+ if (!$ found ) unset($ model ->servers [$ it ]);
85
+ }
86
+ }
87
+
88
+ // filter by user_id
89
+
90
+ if (!is_null ($ user_id ) && is_numeric ($ user_id )) {
91
+ // user_id is a single integer
92
+ foreach ($ model ->servers as $ it => $ server ) {
93
+ if ($ server ->getUserId () != $ user_id ) {
94
+ unset($ model ->servers [$ it ]);
95
+ }
96
+ }
97
+ }
98
+
99
+ if (is_string ($ user_id ) && preg_match ('/^(?:\d+,?)+$/ ' , $ user_id )) {
100
+ // user_id is a string like "1,2,3"
101
+ $ user_id = explode (', ' , $ user_id );
102
+ }
103
+
104
+ if ($ user_id && is_array ($ user_id )) {
105
+ foreach ($ model ->servers as $ it => $ server ) {
106
+ $ found = false ;
107
+ foreach ($ user_id as $ _user ) {
108
+ if ($ server ->getUserId () == $ _user ) {
109
+ $ found = true ;
110
+ break ;
111
+ }
112
+ }
113
+ if (!$ found ) unset($ model ->servers [$ it ]);
114
+ }
115
+ }
116
+
117
+ // reindex servers after removal of indices using unset()
118
+
119
+ $ model ->servers = array_values ($ model ->servers );
120
+
121
+ // collect types and filter
122
+
123
+ $ server_types = array ();
124
+ foreach ($ model ->servers as $ server ) {
125
+ $ server_types [] = $ server ->getTypeId ();
126
+ }
127
+ sort ($ server_types );
128
+ $ server_types = array_unique ($ server_types );
129
+
130
+ $ model ->server_types = array ();
131
+ foreach ($ server_types as $ id ) {
132
+ $ model ->server_types [] = new ServerTypeLib ($ id );
133
+ }
134
+
39
135
}
40
136
}
0 commit comments