dbxapp 4.1.3
CMS, Shop, Workflows und modulare Geschäftsanwendungen
Loading...
Searching...
No Matches
dbxSysMsg.class.php
Go to the documentation of this file.
1<?php
2namespace dbx\dbxAdmin;
3
4require_once dbx()->get_base_dir() . 'dbx/include/dbxForm.class.php';
5
6class dbxSysMsg {
7
14 public function get_error_log_file(): string {
15 return dbx()->get_file_dir() . 'dbxError.log';
16 }
17
19 public function error_log_exists(): bool {
20 return is_file($this->get_error_log_file());
21 }
22
28 public function delete_error_log(): string {
29 $file = $this->get_error_log_file();
30
31 if (!file_exists($file)) {
32 return 'empty';
33 }
34
35 if (!is_file($file) || !@unlink($file)) {
36 return 'error';
37 }
38
39 clearstatcache(true, $file);
40 return file_exists($file) ? 'error' : 'deleted';
41 }
42
43 private function create_error_log_info($oReport) {
44 $file = $this->get_error_log_file();
45
46 if (!file_exists($file)) {
47 $oReport->add_obj('error_log', 'dbxAdmin|sysmsg-error-log-empty');
48 return;
49 }
50
51 $content = file_get_contents($file);
52
53 if ($content === false) {
54 $content = '';
55 }
56
57 $data = array(
58 'file' => 'files/dbxError.log',
59 'size' => number_format((float) filesize($file), 0, ',', '.'),
60 'content' => htmlspecialchars($content, ENT_QUOTES, 'UTF-8'),
61 'action' => dbx()->action_url(
62 '?dbx_modul=dbxAdmin&dbx_run1=sysmsg&dbx_run2=list_sysmsg'
63 . '&dbx_do=delete_error_log&rid=error_log'
64 ),
65 );
66
67 $oReport->add_obj('error_log', 'dbxAdmin|sysmsg-error-log-box', $data);
68 }
69
70 private function normalize_sys_msg_level($level): string {
71 $level = strtolower(trim((string) $level));
72 if ($level === 'warn') {
73 $level = 'warning';
74 }
75
76 return in_array($level, array('error', 'warning', 'all'), true) ? $level : 'all';
77 }
78
79 private function sys_msg_level_config(): string {
80 return $this->normalize_sys_msg_level(dbx()->get_config('dbx', 'sys_msg_level', 'all'));
81 }
82
83 private function sys_msg_level_options(string $current, $texts): string {
84 $options = array(
85 'error' => $texts->get_fd_message('level_error_only'),
86 'warning' => $texts->get_fd_message('level_error_warning'),
87 'all' => $texts->get_fd_message('level_all'),
88 );
89 $html = '';
90
91 foreach ($options as $value => $label) {
92 $selected = $value === $current ? ' selected' : '';
93 $html .= '<option value="' . dbx()->esc($value) . '"' . $selected . '>' . dbx()->esc($label) . '</option>';
94 }
95
96 return $html;
97 }
98
99 private function set_sys_msg_level_config(string $level): bool {
100 $config = dbx()->get_config('dbx');
101 if (!is_array($config)) {
102 $config = array();
103 }
104
105 $config['sys_msg_level'] = $this->normalize_sys_msg_level($level);
106 return (int) dbx()->set_config('dbx', $config) > 0;
107 }
108
109 private function sys_msg_level_control(): string {
110 $oForm = new \dbxForm();
111 $oForm->init('admin-dashboard-sysmsg-level-control', 'admin-dashboard-sysmsg-level-control');
112 $oForm->_fd = 'dbxAdmin|rpt-sysmsg-selection';
113 $oForm->load_fd_messages();
114 $oForm->_action = '?dbx_modul=dbxAdmin&dbx_run1=sysmsg&dbx_run2=sysmsg_level_save';
115 $oForm->_msg_info = '';
116 $current = $this->sys_msg_level_config();
117 $oForm->add_rep('action', dbx()->esc($oForm->_action));
118 $oForm->add_rep('sys_msg_level_save_base', dbx()->esc($oForm->_action));
119 $oForm->add_rep(
120 'sys_msg_level_options',
121 $this->sys_msg_level_options($current, $oForm)
122 );
123
124 return $oForm->add_norep($oForm->run());
125 }
126
127 private function report_sysmsg() {
128 $dd = 'dbxSysMsg';
129 $db = dbx()->get_system_obj('dbxDB');
130 $oReport = dbx()->get_system_obj('dbxReport');
131
132 $oReport->init('report-sysmsg');
133 $oReport->_fd = 'dbxAdmin|rpt-sysmsg-selection';
134 $oReport->load_fd_messages();
135 $oReport->_dd = $dd;
136 $oReport->add_rep('report_shell_class', 'dbx-admin-dashboard-panel dbx-admin-dashboard-sysmsg-report');
137
138 $work = dbx()->get_modul_var('dbx_do', '', 'parameter');
139 $rid = dbx()->get_modul_var('rid', 0, 'int');
140
141 if ($work == 'row_delete' && $rid) {
142 $ok = $oReport->del_selected($rid);
143 $ok = $db->delete($dd, $rid);
144
145 if ($ok) {
146 $oReport->_msg_success = $oReport->get_fd_message(
147 'row_delete_success'
148 );
149 } else {
150 $oReport->_msg_error = $oReport->get_fd_message(
151 'row_delete_error'
152 );
153 }
154 }
155
156 if ($work == 'multi_delete') {
157 $result = $oReport->delete_multi_selected_records($dd);
158 $oReport->apply_multi_delete_result($result);
159 }
160
161 if ($work == 'delete_tab') {
162 $ok = $db->delete_tab($dd);
163 dbx()->debug("##delete tab dd=($dd) ok=($ok)");
164 if ($ok) {
165 $oReport->_msg_success = $oReport->get_fd_message(
166 'delete_tab_success'
167 );
168 } else {
169 $oReport->_msg_error = $oReport->get_fd_message(
170 'delete_tab_error'
171 );
172 }
173 }
174
175 if ($work == 'delete_error_log') {
176 $result = $this->delete_error_log();
177
178 if ($result === 'empty') {
179 $oReport->_msg_success = $oReport->get_fd_message(
180 'error_log_empty'
181 );
182 } elseif ($result === 'deleted') {
183 $oReport->_msg_success = $oReport->get_fd_message(
184 'error_log_deleted'
185 );
186 } else {
187 $oReport->_msg_error = $oReport->get_fd_message(
188 'error_log_delete_error'
189 );
190 }
191 }
192
193 $flds['id'] = 'ID';
194 $flds['create_date'] = $oReport->get_fd_message('column_created');
195 $flds['level'] = $oReport->get_fd_message('column_level');
196 $flds['status'] = $oReport->get_fd_message('column_status');
197 $flds['about'] = $oReport->get_fd_message('column_context');
198 $flds['modul'] = $oReport->get_fd_message('column_module');
199 $flds['action'] = $oReport->get_fd_message('column_action');
200 $flds['work'] = $oReport->get_fd_message('column_process');
201 $flds['rid'] = 'RID';
202 $flds['xuser'] = $oReport->get_fd_message('column_user');
203 $flds['message'] = $oReport->get_fd_message('column_message');
204
205 $rformat['create_date'] = 'php-datetime-usr';
206 $oReport->_rpt_format = $rformat;
207
208 $oReport->_action = '?dbx_modul=dbxAdmin&dbx_run1=sysmsg&dbx_run2=list_sysmsg';
209 $oReport->_pages = true;
210 $oReport->_create_row_select = true;
211 $oReport->_create_row_edit = false;
212 $oReport->_create_row_delete = true;
213 $oReport->_create_sel_flds = true;
214 $oReport->_but_pagination = 5;
215
216 $oReport->enable_delete_tab($dd);
217
218 $oReport->add_action('rows_delete' , 'action_button_delete' , '&dbx_do=multi_delete');
219
220 $oReport->create_selection_fields('dbxAdmin|rpt-sysmsg-selection');
221 $this->create_error_log_info($oReport);
222
223 if ($work != 'delete_tab' && $work != 'delete_error_log' && $work != 'multi_delete' && $work != 'row_delete' && $oReport->submit()) {
224 if (!$oReport->errors()) {
225 $oReport->_msg_success = '';
226 } else {
227 $oReport->_msg_error = $oReport->get_fd_message(
228 'validation_error'
229 );
230 }
231 }
232
233 $rwhere = $oReport->get_fld_val('dbx_rwhere' , '' , 'sqlsearch|max=64');
234 $rstatus= $oReport->get_fld_val('dbx_rstatus', 'all' , 'parameter');
235 $rrows = $oReport->get_fld_val('dbx_rrows' , 15 , 'int');
236 $rpos = $oReport->get_fld_val('dbx_rpos' , 0 , 'int');
237 $rsort = $oReport->get_fld_val('dbx_rsort' , 'create_date', 'parameter');
238 $rdesc = $oReport->get_fld_val('dbx_rdesc' , 'DESC' , 'parameter');
239 $select = $oReport->get_fld_val('dbx_rselect', 0 , 'int');
240 $rgroup = '';
241
242 if ($rwhere != '') {
243 $rwhere = array(
244 'search' => array(
245 'value' => $rwhere,
246 'like' => array('message', 'about', 'why', 'what', 'modul', 'action', 'work', 'rid'),
247 'equal' => array('level', 'status', 'xuser'),
248 'mode' => 'contains',
249 ),
250 );
251 }
252
253 if ($rstatus != '' && $rstatus != 'all') {
254 if (!is_array($rwhere)) {
255 $rwhere = array();
256 }
257
258 $rwhere['status'] = $rstatus;
259 }
260
261 if ($select) {
262 if (is_array($rwhere)) {
263 $rwhere = $db->normalize_where($dd, $rwhere);
264 }
265
266 $rwhere = $oReport->add_rwhere_select($rwhere);
267 }
268
269 $oReport->_rflds = $flds;
270 $oReport->_rrows = $rrows;
271 $oReport->_rpos = $rpos;
272 $oReport->_count_all = $db->count($dd);
273 $oReport->_rcount = $db->count($dd, $rwhere);
274 $oReport->_rdata = $db->select($dd, $rwhere, $flds, $rsort, $rdesc, $rgroup, $rrows, $rpos);
275
276 return $oReport->run();
277 }
278
279 private function process_sys_msg_level_action(): string {
280 $level = dbx()->get_request_var('sys_msg_level', null, 'parameter');
281 if ($level === null || $level === '') {
282 $level = $_POST['sys_msg_level'] ?? 'all';
283 }
284 $this->set_sys_msg_level_config((string) $level);
285 return $this->sys_msg_level_control();
286 }
287
292 private function client_diag() {
293 header('Content-Type: application/json; charset=utf-8');
294
295 $uid = (int) dbx()->user('id');
296
297 $raw = file_get_contents('php://input');
298 $data = json_decode((string) $raw, true);
299 if (!is_array($data)) {
300 $data = $_POST;
301 }
302
303 $entries = array();
304 if (isset($data['entries']) && is_array($data['entries'])) {
305 $entries = $data['entries'];
306 } elseif (is_array($data) && !empty($data)) {
307 $entries = array($data);
308 }
309
310 $allowed = array('warning' => 1, 'error' => 1, 'security' => 1);
311 $count = 0;
312
313 foreach ($entries as $entry) {
314 if (!is_array($entry)) {
315 continue;
316 }
317
318 $status = strtolower(trim((string) ($entry['level'] ?? 'warning')));
319 if ($status === 'warn') {
320 $status = 'warning';
321 }
322 if (!isset($allowed[$status])) {
323 $status = 'warning';
324 }
325
326 $about = trim((string) ($entry['lib'] ?? 'dbxClient'));
327 $code = trim((string) ($entry['code'] ?? ''));
328 $message = trim((string) ($entry['message'] ?? ''));
329 $element = trim((string) ($entry['element'] ?? ''));
330
331 if ($about === '') {
332 $about = 'dbxClient';
333 }
334 if ($message === '') {
335 $message = $code !== '' ? $code : 'client diagnostic';
336 }
337
338 $rid = $code !== '' ? $code : $element;
339 if ($rid === '') {
340 $rid = 'client';
341 }
342
343 $detail = array(
344 'element' => $element,
345 'ctx' => is_array($entry['ctx'] ?? null) ? $entry['ctx'] : array(),
346 'page' => (string) ($_SERVER['HTTP_REFERER'] ?? ($_SERVER['REQUEST_URI'] ?? '')),
347 'uid' => $uid,
348 );
349
350 dbx()->sys_msg($status, $about, $rid, $message, $detail);
351 $count++;
352 }
353
354 echo json_encode(array('ok' => 1, 'count' => $count), JSON_UNESCAPED_UNICODE);
355 exit;
356 }
357
358 public function run() {
359 $run2 = dbx()->get_modul_var('dbx_run2', '', 'parameter');
360 if ($run2 === 'client_diag') {
361 return $this->client_diag();
362 }
363 if ($run2 === 'sysmsg_level_save') {
364 if (dbx()->get_modul_var('dbx_do', '', 'parameter') !== '') {
365 return $this->report_sysmsg();
366 }
367 return $this->process_sys_msg_level_action();
368 }
369
370 return $this->report_sysmsg();
371 }
372}
373?>
get_error_log_file()
Liefert ausschließlich den zentral konfigurierten Fehlerprotokoll-Pfad.
error_log_exists()
Meldet, ob das zentrale Fehlerprotokoll als Datei vorhanden ist.
delete_error_log()
Löscht das vollständige zentrale Fehlerprotokoll.
init($fid, $tpl='')
Öffentliche Init-Methode.
action_url(string $url, string $action='', array $bindings=array())
Tokenisiert eine automatisch erkannte zustandsaendernde Route.
Definition dbxApi.php:1270
dbx()
Liefert die zentrale dbXapp-API als Singleton.
Definition dbxApi.php:2805
esc($value)
Escaped einen Wert fuer HTML-Text und HTML-Attribute.
Definition dbxApi.php:2310
get_file_dir()
Liefert das files/-Verzeichnis der Installation.
Definition dbxApi.php:1524
$_SERVER['REQUEST_METHOD']
if($resolved !==$expectedBase . 'files/test/') $config
exit
Definition index.php:146
DBX schema administration.