dbXapp 2.0
RAD, CMS, Module und Runtime-IDE fuer dbXapp
Loading...
Searching...
No Matches
user_list.class.php
Go to the documentation of this file.
1<?php
2namespace dbx\dbxUser_admin;
3dbx()->use_system_class('dbxReport');
4
6 public function run_body($content) {
7 $this->_record = is_array($this->_record) ? $this->_record : array();
8 return $content;
9 }
10}
11
12Class user_list {
13
14 private $dd = 'dbxUser';
15
16 private function base_url($run2, $params = array()) {
17 $url = '?dbx_modul=dbxUser_admin&dbx_run1=user&dbx_run2=' . rawurlencode((string) $run2);
18 foreach ($params as $key => $value) {
19 $url .= '&' . rawurlencode((string) $key) . '=' . rawurlencode((string) $value);
20 }
21 return $url;
22 }
23
24 private function request_json() {
25 $raw = file_get_contents('php://input');
26 $data = $raw ? json_decode($raw, true) : array();
27 return is_array($data) ? $data : array();
28 }
29
30 private function avatar_file($file) {
31 $file = trim((string) $file);
32 if ($file === '' || !preg_match('/^[A-Za-z0-9_.-]+\.(png|jpg|jpeg|webp|gif)$/i', $file)) {
33 return 'avatar-0.png';
34 }
35
36 $path = dbx_get_base_dir() . 'dbx/modules/dbxUser/img/avatar/' . $file;
37 return is_file($path) ? $file : 'avatar-0.png';
38 }
39
40 private function status_label($status) {
41 $status = (string) $status;
42 if ($status === '1') return 'Aktiv';
43 if ($status === '2') return 'Gesperrt';
44 if ($status === '3') return 'Archiv';
45 return 'Neu';
46 }
47
48 private function user_row($row) {
49 $row = is_array($row) ? $row : array();
50 $avatar = $this->avatar_file($row['avatar'] ?? '');
51 $name = trim((string)($row['name'] ?? '') . ' ' . (string)($row['name2'] ?? ''));
52
53 $row['avatar'] = $avatar;
54 $row['avatar_img'] = dbx()->get_base_url() . 'dbx/modules/dbxUser/img/avatar/' . $avatar;
55 $row['display_name'] = $name !== '' ? $name : (string)($row['uname'] ?? '');
56 $row['status_label'] = $this->status_label($row['status'] ?? 0);
57 $row['profile_link'] = $this->base_url('edit_profil', array('rid' => (int)($row['id'] ?? 0)));
58
59 return $row;
60 }
61
62 private function allowed_grid_fields() {
63 return array(
64 'uname', 'name', 'name2', 'email', 'roles', 'status', 'language',
65 'telefon', 'handy', 'strasse', 'plz', 'ort', 'land', 'BSNR', 'LANR',
66 'emailbill', 'is_confirm', 'login_pid', 'logout_pid', 'design', 'color'
67 );
68 }
69
70 private function normalize_grid_row($row, $is_new = false) {
71 $allowed = array_flip($this->allowed_grid_fields());
72 $out = array();
73
74 foreach ((array) $row as $key => $value) {
75 if (!isset($allowed[$key])) {
76 continue;
77 }
78 if (is_array($value)) {
79 $value = implode(',', $value);
80 }
81 $out[$key] = trim((string) $value);
82 }
83
84 foreach (array('status', 'is_confirm') as $intField) {
85 if (isset($out[$intField])) {
86 $out[$intField] = (int) $out[$intField];
87 }
88 }
89
90 if ($is_new) {
91 if (empty($out['uname'])) {
92 $out['uname'] = 'neuer.benutzer.' . date('YmdHis');
93 }
94 if (empty($out['status'])) {
95 $out['status'] = 1;
96 }
97 if (empty($out['language'])) {
98 $out['language'] = 'de';
99 }
100 if (empty($out['name'])) {
101 $out['name'] = 'Neuer';
102 }
103 if (empty($out['name2'])) {
104 $out['name2'] = 'Benutzer';
105 }
106 $out['pass'] = md5(bin2hex(random_bytes(8)));
107 }
108
109 return $out;
110 }
111
112 private function grid_cols() {
113 return implode(',', array(
114 'id[ID]:number:p:width=72;hozAlign=center;headerHozAlign=center',
115 'avatar_img[Avatar]:image:p:width=78;imgWidth=38px;imgHeight=38px',
116 'uname[Login]:text::width=160',
117 'display_name[Name]:text:p:width=210',
118 'name[Vorname]:text::width=150',
119 'name2[Nachname]:text::width=150',
120 'email[E-Mail]:text::width=230',
121 'roles[Gruppen]:text::width=180',
122 'status[Status]:text::editor=list;values=0=Neu~1=Aktiv~2=Gesperrt~3=Archiv;width=110',
123 'language[Sprache]:text::editor=list;values=de=Deutsch~en=English;width=105',
124 'telefon[Telefon]:text::width=140',
125 'handy[Mobil]:text::width=140',
126 'plz[PLZ]:text::width=90',
127 'ort[Ort]:text::width=150',
128 'lastvisit[Letzter Login]:text:p:width=170',
129 'is_confirm[Best.]:text::editor=list;values=0=Nein~1=Ja;width=90'
130 ));
131 }
132
133 private function grid_read() {
134 $oDB = dbx()->get_system_obj('dbxDB');
135 $search = dbx()->get_request_var('dbx_search', '', 'sqlsearch|max=128');
136 $where = $oDB->build_search_where($this->dd, $search, array('uname', 'name', 'name2', 'email', 'roles', 'ort'), array('id'), 'contains');
137 $sort = dbx()->get_request_var('dbx_sorters', '', '*');
138 $rsort = 'id';
139 $rdesc = 'ASC';
140
141 if ($sort) {
142 $sorters = json_decode($sort, true);
143 if (is_array($sorters) && isset($sorters[0]['field'])) {
144 $field = (string) $sorters[0]['field'];
145 if (in_array($field, array('id', 'uname', 'name', 'name2', 'email', 'status', 'lastvisit'), true)) {
146 $rsort = $field;
147 $rdesc = strtolower((string)($sorters[0]['dir'] ?? 'asc')) === 'desc' ? 'DESC' : 'ASC';
148 }
149 }
150 }
151
152 $flds = array('id', 'uname', 'name', 'name2', 'email', 'roles', 'status', 'language', 'telefon', 'handy', 'plz', 'ort', 'lastvisit', 'is_confirm', 'avatar');
153 $rows = $oDB->select($this->dd, $where, $flds, $rsort, $rdesc, '', 1000, 0);
154 if (!is_array($rows)) {
155 $rows = array();
156 }
157
158 $out = array();
159 foreach ($rows as $row) {
160 $out[] = $this->user_row($row);
161 }
162
163 dbx()->json_response(array(
164 'ok' => 1,
165 'count' => count($out),
166 'rows' => $out,
167 'server_time' => date('Y-m-d H:i:s')
168 ));
169 }
170
171 private function grid_save() {
172 $oDB = dbx()->get_system_obj('dbxDB');
173 $payload = $this->request_json();
174 $rows = is_array($payload['rows'] ?? null) ? $payload['rows'] : array();
175 $saved = array();
176
177 foreach ($rows as $row) {
178 $id = (int)($row['id'] ?? 0);
179 if ($id <= 0) {
180 continue;
181 }
182 $data = $this->normalize_grid_row($row);
183 if (!$data) {
184 continue;
185 }
186 $ok = $oDB->update($this->dd, $data, $id);
187 if ($ok >= 0) {
188 $saved[] = $this->user_row($oDB->select1($this->dd, $id));
189 }
190 }
191
192 dbx()->json_response(array('ok' => 1, 'success' => true, 'rows' => $saved));
193 }
194
195 private function grid_insert() {
196 $oDB = dbx()->get_system_obj('dbxDB');
197 $data = $this->normalize_grid_row(array(), true);
198 $id = ($oDB->insert($this->dd, $data) === 1) ? $oDB->get_insert_id() : 0;
199
200 if ($id > 0) {
201 $row = $oDB->select1($this->dd, $id);
202 dbx()->json_response(array('ok' => 1, 'success' => true, 'row' => $this->user_row($row)));
203 }
204
205 dbx()->json_response(array('ok' => 0, 'success' => false, 'msg' => 'Benutzer konnte nicht angelegt werden.'));
206 }
207
208 private function grid_delete() {
209 $payload = $this->request_json();
210 $id = (int)($payload['id'] ?? 0);
211 if ($id <= 0) {
212 dbx()->json_response(array('ok' => 0, 'success' => false, 'msg' => 'ID fehlt.'));
213 }
214
215 $oDB = dbx()->get_system_obj('dbxDB');
216 $ok = $oDB->delete($this->dd, $id);
217 dbx()->json_response(array('ok' => $ok ? 1 : 0, 'success' => $ok ? true : false));
218 }
219
220 public function edit($rid=0) {
221 $obj=dbx()->get_include_obj('dbxUser_view');
222 $content=$obj->run();
223 return $content;
224 }
225
226 public function list() {
227 $oReport = dbx()->get_system_obj('dbxReport');
228 $oDB = dbx()->get_system_obj('dbxDB');
229 $all = $oDB->count($this->dd);
230 $active = $oDB->count($this->dd, 'status = 1');
231 $locked = $oDB->count($this->dd, 'status = 2');
232
233 $oReport->init('report-user-grid', 'user-admin-grid');
234 $oReport->add_rep('shell_panel_class', 'dbx-grid dbx-user-admin dbx-ajax-root');
235 $oReport->add_rep('bar_title', 'Benutzerverwaltung');
236 $oReport->add_rep('bar_subtitle', 'Benutzer, Gruppen, Status und Profildaten zentral verwalten');
237 $oReport->_mode = 'tabulurator';
238 $oReport->_rrows = 620;
239 $oReport->_grid_id = 'dbx_user_admin_grid';
240 $oReport->_grid_cols = $this->grid_cols();
241 $oReport->_grid_layout = 'fitDataStretch';
242 $oReport->_grid_read_url = $this->base_url('user_grid_read');
243 $oReport->_grid_save_url = $this->base_url('user_grid_save');
244 $oReport->_grid_insert_url = $this->base_url('user_grid_insert');
245 $oReport->_grid_delete_url = $this->base_url('user_grid_delete');
246 $oReport->add_grid_stats(array(
247 array('label' => 'Gesamt', 'value' => (string)$all),
248 array('label' => 'Aktiv', 'value' => (string)$active, 'tone' => 'ok'),
249 array('label' => 'Gesperrt', 'value' => (string)$locked, 'tone' => 'lock'),
250 ), 'Benutzer Kennzahlen');
251 $oReport->add_obj('new_user_url', 'obj-value', $this->base_url('new_user'));
252 $oReport->add_obj('groups_url', 'obj-value', $this->base_url('list_groups'));
253 $oReport->add_obj('bar_actions', 'obj-value',
254 '<a class="btn btn-primary btn-sm dbx-win" href="' . dbx()->esc($this->base_url('new_user')) . '" data-url="' . dbx()->esc($this->base_url('new_user')) . '" data-title="Benutzer" title="Neuer Benutzer"><i class="bi bi-person-plus"></i></a>'
255 . '<a class="btn btn-outline-secondary btn-sm" href="' . dbx()->esc($this->base_url('list_groups')) . '" title="Gruppen verwalten"><i class="bi bi-people"></i></a>'
256 );
257
258 return $oReport->run();
259 }
260
261 public function run() {
262 $work = dbx()->get_modul_var('dbx_run2', 'list_user', 'parameter');
263 $content = '';
264
265 switch ($work) {
266 case 'user_grid_read':
267 $this->grid_read();
268 break;
269 case 'user_grid_save':
270 $this->grid_save();
271 break;
272 case 'user_grid_insert':
273 $this->grid_insert();
274 break;
275 case 'user_grid_delete':
276 $this->grid_delete();
277 break;
278 default:
279 $content=$this->list();
280 break;
281 }
282
283 return $content;
284 }
285}
286
287?>
$field
Definition config.dd.php:4
dbx_get_base_dir($cut_Data=0)
Definition index.php:157
DBX schema administration.