Skip to content

Commit b6a6b85

Browse files
committed
Add filterable results
1 parent 7208539 commit b6a6b85

File tree

1 file changed

+99
-3
lines changed

1 file changed

+99
-3
lines changed

src/controllers/Servers.php

Lines changed: 99 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@
1414
class Servers extends Controller {
1515
public function &run(Router &$router, View &$view, array &$args) {
1616
$model = new ServersModel();
17-
$this->getServers($model);
17+
18+
$query = $router->getRequestQueryArray();
19+
$this->getServers($model, $query);
1820

1921
$view->render($model);
2022
$model->_responseCode = 200;
2123
return $model;
2224
}
2325

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();
2628
$model->servers = ServerLib::getAllServers();
2729
$model->status_bitmasks = [
2830
[
@@ -36,5 +38,99 @@ protected function getServers(ServersModel &$model) {
3638
'label' => 'Disabled'
3739
]
3840
];
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+
39135
}
40136
}

0 commit comments

Comments
 (0)