2namespace dbx\dbxUser_admin;
3dbx()->use_system_class(
'dbxReport');
7 $this->_record = is_array($this->_record) ? $this->_record : array();
14 private $dd =
'dbxUser';
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);
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();
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';
37 return is_file($path) ? $file :
'avatar-0.png';
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';
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'] ??
''));
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)));
62 private function allowed_grid_fields() {
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'
70 private function normalize_grid_row($row, $is_new =
false) {
71 $allowed = array_flip($this->allowed_grid_fields());
74 foreach ((array) $row as $key => $value) {
75 if (!isset($allowed[$key])) {
78 if (is_array($value)) {
79 $value = implode(
',', $value);
81 $out[$key] = trim((
string) $value);
84 foreach (array(
'status',
'is_confirm') as $intField) {
85 if (isset($out[$intField])) {
86 $out[$intField] = (int) $out[$intField];
91 if (empty($out[
'uname'])) {
92 $out[
'uname'] =
'neuer.benutzer.' . date(
'YmdHis');
94 if (empty($out[
'status'])) {
97 if (empty($out[
'language'])) {
98 $out[
'language'] =
'de';
100 if (empty($out[
'name'])) {
101 $out[
'name'] =
'Neuer';
103 if (empty($out[
'name2'])) {
104 $out[
'name2'] =
'Benutzer';
106 $out[
'pass'] = md5(bin2hex(random_bytes(8)));
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'
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',
'',
'*');
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)) {
147 $rdesc = strtolower((
string)($sorters[0][
'dir'] ??
'asc')) ===
'desc' ?
'DESC' :
'ASC';
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)) {
159 foreach ($rows as $row) {
160 $out[] = $this->user_row($row);
163 dbx()->json_response(array(
165 'count' => count($out),
167 'server_time' => date(
'Y-m-d H:i:s')
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();
177 foreach ($rows as $row) {
178 $id = (int)($row[
'id'] ?? 0);
182 $data = $this->normalize_grid_row($row);
186 $ok = $oDB->update($this->dd, $data, $id);
188 $saved[] = $this->user_row($oDB->select1($this->dd, $id));
192 dbx()->json_response(array(
'ok' => 1,
'success' =>
true,
'rows' => $saved));
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;
201 $row = $oDB->select1($this->dd, $id);
202 dbx()->json_response(array(
'ok' => 1,
'success' =>
true,
'row' => $this->user_row($row)));
205 dbx()->json_response(array(
'ok' => 0,
'success' =>
false,
'msg' =>
'Benutzer konnte nicht angelegt werden.'));
208 private function grid_delete() {
209 $payload = $this->request_json();
210 $id = (int)($payload[
'id'] ?? 0);
212 dbx()->json_response(array(
'ok' => 0,
'success' =>
false,
'msg' =>
'ID fehlt.'));
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));
221 $obj=
dbx()->get_include_obj(
'dbxUser_view');
222 $content=$obj->run();
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');
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>'
258 return $oReport->run();
261 public function run() {
262 $work =
dbx()->get_modul_var(
'dbx_run2',
'list_user',
'parameter');
266 case 'user_grid_read':
269 case 'user_grid_save':
272 case 'user_grid_insert':
273 $this->grid_insert();
275 case 'user_grid_delete':
276 $this->grid_delete();
279 $content=$this->
list();
dbx_get_base_dir($cut_Data=0)
DBX schema administration.