dbxapp 4.1.3
CMS, Shop, Workflows und modulare Geschäftsanwendungen
Loading...
Searching...
No Matches
dbxReport_Modules.class.php
Go to the documentation of this file.
1<?php
2namespace dbx\dbxAdmin;
3
4dbx()->use_system_class('dbxReport');
5
7
8 private $registry;
9
10 public function __construct() {
11 parent::__construct();
12 $this->registry = new dbxModuleRegistry();
13 $this->_fd = 'dbxAdmin|module-admin';
14 $this->load_fd_messages();
15 $this->set_form_help_enabled(false);
16 }
17
18 public function renderCard(array $record): string {
19 $tpl = dbx()->get_system_obj('dbxTPL');
20 $active = (string)($record['active'] ?? '1') === '1';
21 $record['active_label'] = $this->get_fd_message($active ? 'active' : 'inactive');
22 $record['toggle_title'] = $this->get_fd_message('toggle_panel');
23 $record['graphic_html'] = $this->renderModuleImages($record);
24 $record['groups_html'] = $this->renderGroups($record);
25 $record['dd_html'] = $this->renderDdList($record);
26 $record['card_state_class'] = ((string)($record['active'] ?? '1') === '0') ? ' dbx-module-row-inactive' : '';
27 $record['install_button_html'] = $this->renderInstallButton($record);
28 $record['active_toggle_button_html'] = $this->renderActiveToggleButton($record);
29 $record['delete_button_html'] = $this->renderDeleteButton($record);
30 $record['actions_html'] = $tpl->get_tpl('dbxAdmin|module-card-actions', $record);
31 $record['access_inline_html'] = $this->renderAccessInline($record);
32 $record['select_html'] = $this->_create_row_select
33 ? $this->render_table_row_select($record, 'dbx-module-row-select')
34 : '';
35 return $tpl->get_tpl('dbxAdmin|module-card', $record);
36 }
37
38 public function renderDdHtml(array $record): string {
39 return $this->renderDdList($record);
40 }
41
42 public function run_body($content) {
43 $record = is_array($this->_record) ? $this->_record : array();
44 $card = $this->renderCard($record);
45 $content = (string)$content;
46
47 if (strpos($content, '[rpt:row]') !== false) {
48 $content = str_replace('[rpt:row]', $card, $content);
49 } else {
50 $content = $card;
51 }
52
53 return $this->forward_run_body($content);
54 }
55
56 public function moduleImagesTargetHtml(array $record): string {
57 return $this->buildModuleImagesTargetHtml($record);
58 }
59
60 public function moduleImagesGalleryHtml(array $record): string {
61 return $this->buildModuleImagesGalleryHtml($record);
62 }
63
64 private function renderModuleImages(array $record): string {
65 $tpl = dbx()->get_system_obj('dbxTPL');
66 $defaultRun1 = trim((string)($record['default_run1'] ?? 'run'));
67 if ($defaultRun1 === '') {
68 $defaultRun1 = 'run';
69 }
70 $defaultRun2 = trim((string)($record['default_run2'] ?? ''));
71 $record['symbol_preview_html'] = $this->buildModuleSymbolPreviewHtml($record);
72 $record['images_gallery_html'] = $this->buildModuleImagesGalleryHtml($record);
73 $record['default_run1'] = dbx()->esc($defaultRun1);
74 $record['default_run2'] = dbx()->esc($defaultRun2);
75 $record['image_count'] = (string)count($record['image_items'] ?? array());
76 $record['images_add_url'] = dbx()->esc((string)($record['images_add_url'] ?? ''));
77 $record['images_upload_url'] = dbx()->esc((string)($record['images_upload_url'] ?? ''));
78 $record['images_remove_url'] = dbx()->esc((string)($record['images_remove_url'] ?? ''));
79 $record['symbol_add_url'] = dbx()->esc((string)($record['symbol_add_url'] ?? '?dbx_modul=dbxAdmin&dbx_run1=modules&dbx_run2=modul_symbol_add'));
80 $record['symbol_media_url'] = dbx()->esc((string)($record['symbol_media_url'] ?? '?dbx_modul=dbxContent_admin&dbx_run1=cms_media&images=1&media_type=image'));
81 $record['symbol_upload_url'] = dbx()->esc((string)($record['symbol_upload_url'] ?? '?dbx_modul=dbxContent_admin&dbx_run1=cms_upload'));
82 $record['symbol_mediafolders_url'] = dbx()->esc((string)($record['symbol_mediafolders_url'] ?? '?dbx_modul=dbxContent_admin&dbx_run1=cms_media_folders'));
83 $record['symbol_mediafoldercreate_url'] = dbx()->esc((string)($record['symbol_mediafoldercreate_url'] ?? '?dbx_modul=dbxContent_admin&dbx_run1=cms_media_folder_create'));
84 $record['symbol_mediafolderdelete_url'] = dbx()->esc((string)($record['symbol_mediafolderdelete_url'] ?? '?dbx_modul=dbxContent_admin&dbx_run1=cms_media_folder_delete'));
85 $record['symbol_deletemedia_url'] = dbx()->esc((string)($record['symbol_deletemedia_url'] ?? '?dbx_modul=dbxContent_admin&dbx_run1=cms_delete_media'));
86 $record['placeholder_url'] = dbx()->esc((string)($record['placeholder_url'] ?? ''));
87 $record['placeholder_alt'] = dbx()->esc($this->moduleImagesPlaceholderAlt());
88 $run1List = $this->buildModuleImagesRun1Datalist($record, $defaultRun1);
89 $record['run1_list_id'] = dbx()->esc((string)($run1List['id'] ?? ''));
90 $record['run1_options_html'] = (string)($run1List['options_html'] ?? '');
91 return $tpl->get_tpl('dbxAdmin|module-card-images', $record);
92 }
93
94 private function buildModuleImagesRun1Datalist(array $record, string $defaultRun1): array {
95 $modul = (string)($record['xmodul'] ?? 'mod');
96 $listId = 'dbx_modimg_run1_' . preg_replace('/[^a-zA-Z0-9_]/', '_', $modul);
97 $cases = $record['run_cases'] ?? array();
98 if (!is_array($cases)) {
99 $cases = array();
100 }
101 if (!$cases && $defaultRun1 !== '') {
102 $cases = array($defaultRun1);
103 }
104
105 $options = '';
106 $seen = array();
107 foreach ($cases as $run1) {
108 $run1 = trim((string)$run1);
109 if ($run1 === '' || isset($seen[$run1])) {
110 continue;
111 }
112 $seen[$run1] = 1;
113 $options .= '<option value="' . dbx()->esc($run1) . '"></option>';
114 }
115
116 return array(
117 'id' => $listId,
118 'options_html' => $options,
119 );
120 }
121
122 private function buildModuleSymbolPreviewHtml(array $record): string {
123 $modul = dbx()->esc((string)($record['xmodul'] ?? ''));
124 $url = dbx()->esc((string)($record['graphic_url'] ?? ''));
125 $alt = dbx()->esc((string)($record['graphic_alt'] ?? $modul));
126
127 if ($url !== '') {
128 return '<img src="' . $url . '" alt="' . $alt . '" class="dbx-module-symbol-img" loading="lazy">';
129 }
130
131 $placeholder = dbx()->esc($this->moduleImagesPlaceholderUrl($record));
132 if ($placeholder !== '') {
133 return '<img src="' . $placeholder . '" alt="' . dbx()->esc($this->moduleImagesPlaceholderAlt()) . '" class="dbx-module-symbol-img is-placeholder" loading="lazy">';
134 }
135
136 return '<span class="dbx-module-images-placeholder-icon" aria-hidden="true"><i class="bi bi-box-seam"></i></span>';
137 }
138
139 private function moduleImagesPlaceholderUrl(array $record): string {
140 return $this->registry->moduleImageEmptyPlaceholderUrl();
141 }
142
143 private function moduleImagesPlaceholderAlt(): string {
144 return $this->get_fd_message('placeholder_alt');
145 }
146
147 private function buildModuleImagesPreviewHtml(array $record): string {
148 $modul = dbx()->esc((string)($record['xmodul'] ?? ''));
149 $items = $record['image_items'] ?? array();
150 if (is_array($items) && isset($items[0]) && is_array($items[0])) {
151 $first = $items[0];
152 $url = dbx()->esc((string)($first['url'] ?? ''));
153 $label = dbx()->esc((string)($first['label'] ?? ($first['file'] ?? $modul)));
154 if ($url !== '') {
155 return '<img src="' . $url . '" alt="' . $label . '" class="dbx-module-images-preview-img" loading="lazy">';
156 }
157 }
158
159 $placeholder = dbx()->esc($this->moduleImagesPlaceholderUrl($record));
160 if ($placeholder !== '') {
161 $alt = dbx()->esc($this->moduleImagesPlaceholderAlt());
162 return '<img src="' . $placeholder . '" alt="' . $alt . '" class="dbx-module-images-preview-img is-placeholder" loading="lazy">';
163 }
164
165 return '<span class="dbx-module-images-placeholder-icon" aria-hidden="true"><i class="bi bi-box-seam"></i></span>';
166 }
167
168 private function buildModuleImagesTargetHtml(array $record): string {
169 $modul = dbx()->esc((string)($record['xmodul'] ?? ''));
170 $defaultRun1 = trim((string)($record['default_run1'] ?? 'run'));
171 if ($defaultRun1 === '') {
172 $defaultRun1 = 'run';
173 }
174 $defaultRun2 = trim((string)($record['default_run2'] ?? ''));
175 $usesRun2 = (string)($record['uses_run2'] ?? '0') === '1';
176 $cases = $record['run_cases'] ?? array();
177 if (!is_array($cases)) {
178 $cases = array();
179 }
180 if (!$cases) {
181 $cases = array($defaultRun1);
182 }
183
184 $listId = 'dbx_modimg_run1_' . preg_replace('/[^a-zA-Z0-9_]/', '_', (string)($record['xmodul'] ?? 'mod'));
185 $options = '';
186 $seen = array();
187 foreach ($cases as $run1) {
188 $run1 = trim((string)$run1);
189 if ($run1 === '' || isset($seen[$run1])) {
190 continue;
191 }
192 $seen[$run1] = 1;
193 $selected = ($run1 === $defaultRun1) ? ' selected' : '';
194 $options .= '<option value="' . dbx()->esc($run1) . '"' . $selected . '>' . dbx()->esc($run1) . '</option>';
195 }
196
197 $run2Class = 'dbx-module-images-run2-wrap';
198 $run2Disabled = '';
199
200 $images = new dbxModuleImages();
201 $previewName = dbx()->esc($images->stemForRuns((string)($record['xmodul'] ?? ''), $defaultRun1, $defaultRun2) . '.*');
202
203 return '<div class="dbx-module-images-target">'
204 . '<label class="dbx-module-images-target-field">'
205 . '<span>dbx_run1</span>'
206 . '<input type="text" class="form-control form-control-sm dbx-module-images-run1" list="' . $listId . '" value="' . dbx()->esc($defaultRun1) . '" placeholder="' . dbx()->esc($this->get_fd_message('run1_placeholder')) . '" required>'
207 . '<datalist id="' . $listId . '">' . $options . '</datalist>'
208 . '</label>'
209 . '<label class="' . $run2Class . ' dbx-module-images-target-field">'
210 . '<span>dbx_run2</span>'
211 . '<input type="text" class="form-control form-control-sm dbx-module-images-run2" value="' . dbx()->esc($defaultRun2) . '" placeholder="' . dbx()->esc($this->get_fd_message('optional')) . '"' . $run2Disabled . '>'
212 . '</label>'
213 . '<div class="dbx-module-images-filename">'
214 . '<span>' . dbx()->esc($this->get_fd_message('filename')) . '</span>'
215 . '<code class="dbx-module-images-filename-preview" data-modul="' . $modul . '">' . $previewName . '</code>'
216 . '</div>'
217 . '</div>';
218 }
219
220 private function resolveImagePreviewRuns(array $item, array $record): array {
221 $run1 = trim((string)($item['run1'] ?? ''));
222 $run2 = trim((string)($item['run2'] ?? ''));
223
224 if ($run1 === '' || $run2 === '') {
225 $params = trim((string)($item['default_params'] ?? ''));
226 if ($params !== '') {
227 if ($run1 === '' && preg_match('/(?:^|&)dbx_run1=([^&]+)/', $params, $m)) {
228 $run1 = rawurldecode($m[1]);
229 }
230 if ($run2 === '' && preg_match('/(?:^|&)dbx_run2=([^&]+)/', $params, $m)) {
231 $run2 = rawurldecode($m[1]);
232 }
233 }
234 }
235
236 if ($run1 === '') {
237 $run1 = trim((string)($record['default_run1'] ?? ''));
238 }
239 if ($run2 === '') {
240 $run2 = trim((string)($record['default_run2'] ?? ''));
241 }
242
243 return array($run1, $run2);
244 }
245
246 private function buildModuleImagesGalleryHtml(array $record): string {
247 $items = $record['image_items'] ?? array();
248 $xmodul = (string)($record['xmodul'] ?? '');
249 if (!is_array($items) || !$items) {
250 return '<div class="dbx-module-images-empty-list text-muted small">' . dbx()->esc($this->get_fd_message('no_module_images')) . '</div>';
251 }
252
253 $html = '';
254 foreach ($items as $i => $item) {
255 if (!is_array($item)) {
256 continue;
257 }
258 $file = dbx()->esc((string)($item['file'] ?? ''));
259 $url = dbx()->esc((string)($item['url'] ?? ''));
260 $label = dbx()->esc((string)($item['label'] ?? $file));
261 $params = trim((string)($item['default_params'] ?? ''));
262 $call = 'dbx_modul=' . rawurlencode($xmodul);
263 if ($params !== '') {
264 $call .= '&' . $params;
265 }
266 $call = dbx()->esc($call);
267 list($run1, $run2) = $this->resolveImagePreviewRuns($item, $record);
268 $run1Esc = dbx()->esc($run1);
269 $run2Esc = dbx()->esc($run2);
270 $previewUrl = dbx()->esc($this->registry->modulUrl($xmodul, $run1, $run2));
271 $previewTitle = dbx()->esc($this->format_fd_message('module_preview', array('module' => $xmodul)));
272 $active = ($i === 0) ? ' is-active' : '';
273 $previewBtn = '';
274 if ($run1 !== '' || $params !== '') {
275 $previewBtn = '<a class="btn btn-outline-secondary btn-sm dbx-win dbx-module-images-preview" href="' . $previewUrl . '" data-url="' . $previewUrl . '" data-title="' . $previewTitle . '" data-width="88%" data-height="88%" title="' . dbx()->esc($this->get_fd_message('open_module')) . '"><i class="bi bi-box-arrow-up-right"></i></a>';
276 }
277 $html .= '<div class="dbx-module-images-item' . $active . '" data-file="' . $file . '" data-params="' . dbx()->esc($params) . '" data-url="' . $url . '" data-run1="' . $run1Esc . '" data-run2="' . $run2Esc . '">'
278 . '<span class="dbx-module-images-thumb">'
279 . '<img src="' . $url . '" alt="' . $label . '" loading="lazy">'
280 . '</span>'
281 . '<span class="dbx-module-images-meta">'
282 . '<code class="dbx-module-images-call">' . $call . '</code>'
283 . '<span class="dbx-module-images-file">' . $file . '</span>'
284 . '</span>'
285 . '<span class="dbx-module-images-actions">'
286 . $previewBtn
287 . '<button type="button" class="btn btn-outline-danger btn-sm dbx-module-images-remove" title="' . dbx()->esc($this->get_fd_message('remove_image')) . '"><i class="bi bi-trash"></i></button>'
288 . '</span>'
289 . '</div>';
290 }
291
292 return $html !== '' ? $html : '<div class="dbx-module-images-empty-list text-muted small">' . dbx()->esc($this->get_fd_message('no_module_images')) . '</div>';
293 }
294
295 public function moduleImagesPreviewHtml(array $record): string {
296 return $this->buildModuleImagesPreviewHtml($record);
297 }
298
299 private function renderGraphic(array $record): string {
300 $previewUrl = dbx()->esc((string)($record['preview_url'] ?? ''));
301 $title = dbx()->esc((string)($record['title'] ?? ''));
302 $winAttrs = ' class="dbx-module-graphic dbx-win" href="' . $previewUrl . '" data-url="' . $previewUrl
303 . '" data-title="' . dbx()->esc($this->format_fd_message('module_preview', array('module' => (string)($record['title'] ?? ''))))
304 . '" data-width="88%" data-height="88%" title="' . dbx()->esc($this->get_fd_message('open_preview')) . '"';
305
306 $items = $record['image_items'] ?? array();
307 if (!is_array($items)) {
308 $items = array();
309 }
310
311 if ($items) {
312 $slides = '';
313 foreach ($items as $i => $item) {
314 if (!is_array($item)) {
315 continue;
316 }
317 $url = dbx()->esc((string)($item['url'] ?? ''));
318 $label = dbx()->esc((string)($item['label'] ?? ''));
319 $active = ($i === 0) ? ' is-active' : '';
320 $slides .= '<img src="' . $url . '" alt="' . $label . '" class="dbx-module-graphic-img' . $active . '" loading="lazy">';
321 }
322 if ($slides !== '') {
323 return '<a' . $winAttrs . '><div class="dbx-module-graphic-stack">' . $slides . '</div></a>';
324 }
325 }
326
327 $graphicUrl = trim((string)($record['graphic_url'] ?? ''));
328 $alt = dbx()->esc((string)($record['graphic_alt'] ?? $record['title'] ?? ''));
329
330 if ($graphicUrl !== '') {
331 $badge = trim((string)($record['graphic_badge'] ?? ''));
332 $badgeHtml = '';
333 if ($badge !== '') {
334 $badgeHtml = '<span class="dbx-module-graphic-badge">' . dbx()->esc($badge) . '</span>';
335 }
336
337 return '<a' . $winAttrs . '>'
338 . '<img src="' . dbx()->esc($graphicUrl) . '" alt="' . $alt . '" class="dbx-module-graphic-img is-active" loading="lazy">'
339 . $badgeHtml
340 . '</a>';
341 }
342
343 return '<a' . $winAttrs . '>'
344 . '<span class="dbx-module-graphic-placeholder" aria-hidden="true">'
345 . '<i class="bi bi-box-seam dbx-module-graphic-fallback-icon"></i>'
346 . '<span class="dbx-module-graphic-placeholder-label">' . dbx()->esc($this->get_fd_message('preview_label')) . '</span>'
347 . '</span>'
348 . '</a>';
349 }
350
351 private function renderInstallButton(array $record): string {
352 if (empty($record['install_url'])) {
353 return '';
354 }
355
356 $url = dbx()->esc((string)$record['install_url']);
357 $title = (string)($record['title'] ?? '');
358 $dialogTitle = dbx()->esc($this->format_fd_message('install_title', array('module' => $title)));
359
360 return '<a class="btn btn-outline-secondary dbx-win" href="' . $url . '" data-url="' . $url . '" data-title="' . $dialogTitle . '" data-width="82%" data-height="82%" title="' . dbx()->esc($this->get_fd_message('install_module')) . '">'
361 . '<i class="bi bi-database-gear"></i> ' . dbx()->esc($this->get_fd_message('install_module')) . '</a>';
362 }
363
364 private function renderActiveToggleButton(array $record): string {
365 $modul = dbx()->esc((string)($record['xmodul'] ?? ''));
366 $url = dbx()->esc((string)($record['active_toggle_url'] ?? ''));
367 if ($modul === '' || $url === '') {
368 return '';
369 }
370 $active = (string)($record['active'] ?? '1') === '1';
371 $btnClass = $active ? 'btn-success' : 'btn-outline-secondary';
372 $icon = $active ? 'bi-toggle-on' : 'bi-toggle-off';
373 $label = $this->get_fd_message($active ? 'active' : 'inactive');
374 $state = $active ? '1' : '0';
375
376 return '<button type="button" class="btn ' . $btnClass . ' dbx-module-active-toggle" data-modul="' . $modul
377 . '" data-active="' . $state . '" data-toggle-url="' . $url . '" title="' . dbx()->esc($this->get_fd_message('toggle_module')) . '">'
378 . '<i class="bi ' . $icon . '"></i> ' . dbx()->esc($label) . '</button>';
379 }
380
381 private function renderDeleteButton(array $record): string {
382 if ((string)($record['can_delete'] ?? '0') !== '1') {
383 return '';
384 }
385 $modul = dbx()->esc((string)($record['xmodul'] ?? ''));
386 $title = dbx()->esc((string)($record['title'] ?? ''));
387 $url = dbx()->esc((string)($record['delete_url'] ?? ''));
388 if ($modul === '' || $url === '') {
389 return '';
390 }
391
392 return '<button type="button" class="btn btn-outline-danger dbx-module-delete-btn" data-modul="' . $modul
393 . '" data-delete-url="' . $url . '" data-title="' . $title . '" title="' . dbx()->esc($this->get_fd_message('delete_module')) . '">'
394 . '<i class="bi bi-trash"></i> ' . dbx()->esc($this->get_fd_message('delete_button')) . '</button>';
395 }
396
397 private function renderAccessInline(array $record): string {
398 $tpl = dbx()->get_system_obj('dbxTPL');
399 $groups = $record['groups'] ?? array();
400 if (!is_array($groups)) {
401 $groups = array();
402 }
403 $selected = array_flip($groups);
404 $options = '';
405 foreach ($this->registry->groupOptions() as $value => $label) {
406 $sel = isset($selected[$value]) ? ' selected' : '';
407 $options .= '<option value="' . dbx()->esc($value) . '"' . $sel . '>' . dbx()->esc($this->localizedGroupLabel((string)$value, (string)$label)) . '</option>';
408 }
409
410 $data = array(
411 'xmodul' => dbx()->esc((string)($record['xmodul'] ?? '')),
412 'access_save_url' => dbx()->esc((string)($record['access_save_url'] ?? '')),
413 'groups_options_html' => $options,
414 );
415
416 return $tpl->get_tpl('dbxAdmin|module-card-access-inline', $data);
417 }
418
419 private function renderGroups(array $record): string {
420 $groups = $record['groups'] ?? array();
421 if (!is_array($groups)) {
422 $groups = array();
423 }
424
425 $labels = $this->registry->groupOptions();
426 $html = '';
427 foreach ($groups as $group) {
428 $group = trim((string)$group);
429 if ($group === '') {
430 continue;
431 }
432 $label = $this->localizedGroupLabel($group, (string)($labels[$group] ?? $group));
433 $html .= '<span class="badge rounded-pill text-bg-light border">' . dbx()->esc($label) . '</span>';
434 }
435
436 if ($html === '') {
437 $html = '<span class="text-muted small">' . dbx()->esc($this->get_fd_message('no_group')) . '</span>';
438 }
439
440 return $html;
441 }
442
443 private function renderDdList(array $record): string {
444 $tpl = dbx()->get_system_obj('dbxTPL');
445 $items = $record['dd_items'] ?? array();
446 if (!is_array($items) || !$items) {
447 return $tpl->get_tpl('dbxAdmin|module-card-dd-empty', $record);
448 }
449
450 $gallery = '';
451 $selectId = (string)($record['dd_select_id'] ?? '');
452 foreach ($items as $i => $item) {
453 if (!is_array($item)) {
454 continue;
455 }
456 $url = dbx()->esc((string)($item['edit_url'] ?? ''));
457 $title = dbx()->esc($this->format_fd_message('edit_dd_title', array(
458 'module' => (string)($record['xmodul'] ?? ''),
459 'dd' => (string)($item['label'] ?? ''),
460 )));
461 $label = dbx()->esc((string)($item['label'] ?? ''));
462 $active = ($i === 0) ? ' is-active' : '';
463 $stripe = ($i % 2 === 0) ? ' odd' : ' even';
464 $gallery .= '<button type="button" class="dbx-module-dd-item' . $active . $stripe . '" role="option"'
465 . ' data-edit-url="' . $url . '" data-edit-title="' . $title . '"'
466 . ' aria-selected="' . ($i === 0 ? 'true' : 'false') . '" title="' . $title . '">'
467 . '<span class="dbx-module-dd-item-name">' . $label . '</span>'
468 . '</button>';
469 }
470
471 $record['dd_gallery_html'] = $gallery;
472 return $tpl->get_tpl('dbxAdmin|module-card-dd', $record);
473 }
474
475 private function localizedGroupLabel(string $value, string $fallback): string {
476 $messageKeys = array(
477 'admin' => 'group_admin',
478 'guest' => 'group_guest',
479 'member' => 'group_member',
480 '*' => 'group_all',
481 );
482 return isset($messageKeys[$value]) ? $this->get_fd_message($messageKeys[$value]) : $fallback;
483 }
484}
Erkennt Modul-Metadaten aus Dateisystem und PHP-Quellen (ohne manuelle Registry).
set_form_help_enabled(bool $enabled=true)
Schaltet die automatische Formular-Hilfeleiste gezielt ein oder aus.
get_fd_message(string $key, string $default='')
Liefert eine Meldung aus der aktuell geladenen FD.
load_fd_messages(string $fd='')
Lädt ausschließlich den Meldungsvertrag einer sprachabhängigen FD.
forward_run_body($content)
render_table_row_select(array $record, $class)
Rendert die Row-Checkbox.
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
$messageOnlyForm _fd
if($web->content_permalink_redirect_target() !=='') $tpl
if(!defined( 'IMG_WEBP')) define( 'IMG_WEBP'
if( $demoId<=0) foreach(array('create_date', 'create_uid', 'update_date', 'update_uid', 'owner',) as $systemField) $items
DBX schema administration.