dbXapp 2.0
RAD, CMS, Module und Runtime-IDE fuer dbXapp
Loading...
Searching...
No Matches
dbxWebApp.class.php
Go to the documentation of this file.
1<?php
6
26class dbxWebApp {
27
28
42 function get_base_url(string $uri): string {
43 $base_url = dbx()->get_remember_var('base_url', 0, 'dbx');
44
45 $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
46 ? 'https://' : 'http://';
47 $host = $_SERVER['HTTP_HOST'] ?? ($_SERVER['SERVER_ADDR'] ?? 'localhost');
48 $host = preg_replace('/:\d+$/', '', (string) $host);
49
50 if ($host === 'heserver') {
51 $host = 'heserver';
52 } elseif ($host === 'localhost' || $host === '127.0.0.1') {
53 $host = 'localhost';
54 }
55
56 $port = (int) ($_SERVER['SERVER_PORT'] ?? 0);
57 $xport = ($port && $port != 80 && $port != 443) ? ":$port" : '';
58 $request_origin = $protocol . $host . $xport;
59
60 if ($base_url && $port != 4221) {
61 $cached = parse_url((string) $base_url);
62 $cached_scheme = strtolower((string) ($cached['scheme'] ?? ''));
63 $cached_host = strtolower((string) ($cached['host'] ?? ''));
64 $cached_port = (int) ($cached['port'] ?? ($cached_scheme === 'https' ? 443 : 80));
65 $request_port = $port ?: ($protocol === 'https://' ? 443 : 80);
66
67 if (
68 $cached_scheme !== rtrim($protocol, ':/') ||
69 $cached_host !== strtolower($host) ||
70 $cached_port !== $request_port
71 ) {
72 $base_url = 0;
73 }
74 }
75
76 if (!$base_url) {
77 // Erstellt die Basis-URL
78 $base_url = $request_origin . rtrim($uri, '/');
79
80 // Falls der Port 4221 ist, wird die URL aus einer Datei gelesen
81 if ($port == 4221) {
82 $base_href_file = dbx_os_path_file(dbx_get_file_dir() . 'base_href.cfg');
83
84 if (file_exists($base_href_file)) {
85 $base_url = trim(preg_replace('/[\x00-\x1F\x7F]/', '', file_get_contents($base_href_file)));
86 }
87 }
88
89 // Ersetzt Backslashes durch Slashes und sorgt für einen abschließenden Slash
90 $base_url = str_replace('\\', '/', rtrim($base_url, '\\'));
91 if (!in_array(substr($base_url, -1), ['/', '?'])) {
92 $base_url .= '/';
93 }
94
95 dbx()->set_remember_var('base_url', $base_url, 'dbx');
96 }
97
98 return $base_url;
99 }
100
101
102
103
110 function create_new_cfg($modul='dbx') {
111 if ($modul == 'dbx') {
112 $config['host']='localhost';
113 $config['name']='';
114 $config['user']='root';
115 $config['password']='';
116 $config['port']='';
117 $config['default_lng'] ='de';
118 $config['accessible_lng'] ='de,en,es';
119 $config['default_color'] ='blau';
120 $config['default_design_user'] ='lda';
121 $config['default_design_admin'] ='_admin';
122 $config['cache']=0;
123 $config['intro']=0;
124 $config['trace']=0;
125 $config['construct']=0;
126 $config['secure']='secure-key';
127 $config['ok']=0;
128
129 } else {
130 // create Modul cfg;
131 }
132 dbx()->set_config($modul,$config);
133 return $config;
134 }
135
141 function check_uri() {
142 $uri='';
143 $request = $_SERVER['REQUEST_URI'];
144
145 // Zerlege die URL in ihre Komponenten
146 $url_components = parse_url($request);
147
148 // Speichere den Pfad in $_GET mit dem Schlüssel 'dbx_request_path'
149 if (isset($url_components['path'])) {
150 $uri = $url_components['path'];
151 }
152
153 // Zerlege die Query-Parameter und speichere sie in $_GET
154 if (isset($url_components['query'])) {
155 parse_str($url_components['query'], $query_params);
156 foreach ($query_params as $key => $value) {
157 $_GET[$key] = $value;
158 }
159 }
160 return $uri;
161}
162
163
176function parse_route_url($url) {
177 $url = trim(str_replace('&amp;', '&', (string) $url));
178
179 $fragment = '';
180 $hashPos = strpos($url, '#');
181 if ($hashPos !== false) {
182 $fragment = substr($url, $hashPos);
183 $url = substr($url, 0, $hashPos);
184 }
185
186 $path = $url;
187 $params = array();
188
189 if (substr($url, 0, 1) === '?') {
190 $query = substr($url, 1);
191 if ($query !== '') {
192 parse_str($query, $params);
193 }
194 return array(
195 'permalink' => '',
196 'params' => $this->normalize_route_params($params),
197 'fragment' => $fragment,
198 );
199 }
200
201 $delimPos = false;
202 foreach (array('?', '&') as $delimiter) {
203 $pos = strpos($url, $delimiter);
204 if ($pos !== false && ($delimPos === false || $pos < $delimPos)) {
205 $delimPos = $pos;
206 }
207 }
208
209 if ($delimPos !== false) {
210 $path = substr($url, 0, $delimPos);
211 $query = substr($url, $delimPos + 1);
212 if ($query !== '') {
213 parse_str($query, $params);
214 }
215 }
216
217 $path = $this->peel_glued_params_from_path($path, $params);
218
219 return array(
220 'permalink' => str_replace('\\', '/', $path),
221 'params' => $this->normalize_route_params($params),
222 'fragment' => $fragment,
223 );
224}
225
242 function build_route_url($permalink, $params = array(), $fragment = '') {
243 $permalink = str_replace('\\', '/', trim((string) $permalink));
244 $permalink = trim($permalink, '/');
245 $params = $this->normalize_route_params($params);
246
247 if ($permalink === '') {
248 if (empty($params)) {
249 return '?' . $fragment;
250 }
251 return '?' . http_build_query($params, '', '&', PHP_QUERY_RFC3986) . $fragment;
252 }
253
254 if (empty($params)) {
255 return $permalink . $fragment;
256 }
257
258 return $permalink . '?' . http_build_query($params, '', '&', PHP_QUERY_RFC3986) . $fragment;
259 }
260
279 function append_route_params($url, $params = array()) {
280 $route = $this->parse_route_url($url);
281 foreach ($params as $key => $value) {
282 $route['params'][(string) $key] = (string) $value;
283 }
284 return $this->build_route_url($route['permalink'], $route['params'], $route['fragment']);
285 }
286
293 function route_param_prefix($url) {
294 $route = $this->parse_route_url($url);
295 if ($route['permalink'] === '') {
296 return empty($route['params'])
297 ? '?'
298 : $this->build_route_url('', $route['params']) . '&';
299 }
300
301 if (empty($route['params'])) {
302 return $route['permalink'] . '?';
303 }
304
305 return $this->build_route_url($route['permalink'], $route['params']) . '&';
306 }
307
314 function get_request_route_string($baseUri = '') {
315 $requestUri = $_SERVER['REQUEST_URI'] ?? '';
316 if ($requestUri === '') {
317 return '';
318 }
319
320 if ($baseUri === '') {
321 $baseUri = $this->get_base_uri();
322 }
323
324 $path = parse_url($requestUri, PHP_URL_PATH) ?? '';
325 $path = str_replace('\\', '/', $path);
326 $baseUri = str_replace('\\', '/', $baseUri);
327
328 if ($baseUri !== '/' && $baseUri !== '' && strpos($path, $baseUri) === 0) {
329 $path = substr($path, strlen($baseUri));
330 }
331
332 $route = ltrim($path, '/');
333 $query = parse_url($requestUri, PHP_URL_QUERY);
334
335 if ($query !== null && $query !== '') {
336 if ($route === '') {
337 return '?' . $query;
338 }
339 if (strpos($route, '?') === false && strpos($route, '&') === false) {
340 return $route . '?' . $query;
341 }
342 return $route . '&' . $query;
343 }
344
345 return $route;
346 }
347
355 function strip_unwanted_route_params($params, $unwanted = '') {
356 $remove = array_merge(
357 explode(',', (string) $unwanted),
358 $this->memory_switch_params()
359 );
360
361 foreach ($remove as $key) {
362 $key = trim($key);
363 if ($key === '') {
364 continue;
365 }
366 unset($params[$key]);
367 }
368
369 return $params;
370 }
371
379function get_self_url($permalink,$unwanted) {
380 $route = $this->parse_route_url($this->get_request_route_string($this->get_base_uri()));
381 $params = $this->strip_unwanted_route_params($route['params'], $unwanted);
382
383 if ($permalink !== '') {
384 $route['permalink'] = str_replace('\\', '/', trim((string) $permalink, '/'));
385 }
386
387 return $this->build_route_url($route['permalink'], $params, $route['fragment']);
388}
389
396 return array('dbx_edit', 'dbx_design', 'dbx_color', 'dbx_lng');
397 }
398
405 function normalize_self_url($url) {
406 $route = $this->parse_route_url($url);
407 $route['params'] = $this->strip_unwanted_route_params($route['params']);
408 return $this->build_route_url($route['permalink'], $route['params'], $route['fragment']);
409 }
410
418 function peel_glued_params_from_path($path, &$params = array()) {
419 $path = str_replace('\\', '/', (string) $path);
420 $changed = true;
421
422 while ($changed) {
423 $changed = false;
424
425 if (preg_match('/^(.*)[?&]([a-zA-Z_][a-zA-Z0-9_]*)=([^\/&?#]+)$/', $path, $match)) {
426 $path = $match[1];
427 $params[$match[2]] = rawurldecode($match[3]);
428 $changed = true;
429 continue;
430 }
431
432 if (preg_match('/^(.*?)([a-zA-Z_][a-zA-Z0-9_]*)=([^\/&?#]+)$/', $path, $match)) {
433 if (preg_match('/^dbx_/', $match[2]) || strpos($match[2], '_') !== false) {
434 $path = $match[1];
435 $params[$match[2]] = rawurldecode($match[3]);
436 $changed = true;
437 }
438 }
439 }
440
441 return rtrim($path, '-&?/');
442 }
443
450 function normalize_route_params($params) {
451 $normalized = array();
452
453 if (!is_array($params)) {
454 return $normalized;
455 }
456
457 foreach ($params as $key => $value) {
458 if ($key === '' || $value === null) {
459 continue;
460 }
461 if (is_array($value)) {
462 $normalized[(string) $key] = implode(',', $value);
463 } else {
464 $normalized[(string) $key] = (string) $value;
465 }
466 }
467
468 return $normalized;
469 }
470
471
477 function get_base_uri() {
478 // Versuche zuerst, den URI aus $_SERVER['SCRIPT_NAME'] zu holen
479 if (!empty($_SERVER['SCRIPT_NAME'])) {
480 $uri = $_SERVER['SCRIPT_NAME'];
481 }
482 // Fallback auf $_SERVER['PHP_SELF'], falls $_SERVER['SCRIPT_NAME'] nicht verfügbar ist
483 elseif (!empty($_SERVER['PHP_SELF'])) {
484 $uri = $_SERVER['PHP_SELF'];
485 }
486 // Als letzte Option, versuche den URI aus $_SERVER['REQUEST_URI'] ohne Query-Parameter
487 elseif (!empty($_SERVER['REQUEST_URI'])) {
488 $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
489 }
490 // Falls keine der Optionen verfügbar ist, gib einen leeren String zurück oder eine Fehlermeldung
491 else {
492 $uri = ''; // Oder ein bestimmter Wert, z.B. "/unknown" oder ein Fehlerwert
493 }
494
495 // Entferne den Dateinamen, um nur das Verzeichnis zurückzugeben
496 $uri=dirname($uri);
497 if ($uri=='\\') $uri='/';
498 $uri = str_replace('\\', '/', $uri);
499 return $uri;
500 }
501
502
503
510 function get_permalink($uri) {
511 $route = $this->parse_route_url($this->get_request_route_string($uri));
512 return $route['permalink'];
513 }
514
515
525 $route = $this->parse_route_url($this->get_request_route_string($this->get_base_uri()));
526 if (!empty($route['params'])) {
527 $_GET = array_merge($_GET, $route['params']);
528 }
529 }
530
531
549 function check_request() {
550 //dbx_debug("dbxApp check request");
551 //dbx_debug('#INCOME-POST',$_POST);
552 //dbx_debug('#INCOME-GET' ,$_GET);
553 //dbx_debug("SERVER" ,$_SERVER);
554
555 // JSON-Body einlesen (z. B. von fetch)
556 $raw = file_get_contents('php://input');
557 $data = json_decode($raw, true);
558
559 // Falls gültiges JSON → $_POST damit befüllen
560 if (is_array($data)) {
561 $_POST = array_merge($_POST, $data);
562 }
563
564
565
566 $pvx=array(); $gvx=array();
567
568
569
570 if (isset($_POST['dbx_get'])) { // Ajax Formular
571 $get = $_POST['dbx_get'];
572 $get = ltrim($get, '?');
573 parse_str($get, $gvx);
574 $_GET=array_merge($_GET, $gvx);
575 unset($_POST['dbx_get']);
576 }
577
578 if (isset($_POST['dbx_post'])) { // Ajax Formular
579 $post= $_POST['dbx_post'];
580 $post= ltrim($post, '?');
581 parse_str($post, $pvx);
582 $_POST=array_merge($_POST, $pvx);
583 unset($_POST['dbx_post']);
584 }
585
586 /*
587 if (!empty($_GET)) {
588 // Hol den ersten Schlüssel und den ersten Wert
589 $firstKey = array_key_first($_GET);
590 $firstValue = $_GET[$firstKey];
591
592 // Prüfen, ob das erste Zeichen des Schlüssels ein '?' ist
593 if (strpos($firstKey, '?') === 0) {
594 // Entferne den Eintrag mit dem alten Schlüssel
595 dbx()->debug("FIX-GET Key ($firstKey)");
596 unset($_GET[$firstKey]);
597 // Entferne das '?' am Anfang des Schlüssels
598 $newKey = ltrim($firstKey, '?');
599 // Füge den Wert mit dem neuen Schlüssel hinzu
600 $_GET[$newKey] = $firstValue;
601 }
602 }
603 */
604
605
606
607
608 $base_uri =$this->get_base_uri();
609 $route = $this->parse_route_url($this->get_request_route_string($base_uri));
610 if (!empty($route['params'])) {
611 $_GET = array_merge($route['params'], $_GET);
612 }
613
614 //dbx_debug('#OUT-GET POST' ,$_GET,$_POST);
615
616 $base_url =$this->get_base_url($base_uri);
617 $permalink=$this->get_permalink($base_uri);
618 $self_url =$this->get_self_url($permalink,'dbx_ajax,dbx_window,dbx_target,dbx_go');
619 $go = dbx()->get_request_var('dbx_go' ,0,'parameter');
620 $ajax = dbx()->get_request_var('dbx_ajax' ,0,'int');
621 $window = dbx()->get_request_var('dbx_window',0,'int');
622
623
624 dbx()->debug("#SYS Self-url=($self_url) base-Url=($base_url) base_uri=($base_uri) Perma=($permalink)");
625
626 //dbx_debug('#-POST',$_POST);
627 //dbx_debug('#-GET' ,$_GET);
628
629
630
631 dbx()->set_system_var('dbx_permalink',$permalink);
632 dbx()->set_system_var('dbx_self_url' ,$self_url);
633 dbx()->set_system_var('dbx_base_url' ,$base_url);
634 dbx()->set_system_var('dbx_base_uri' ,$base_uri);
635 dbx()->set_system_var('dbx_window' ,$window);
636 dbx()->set_system_var('dbx_ajax' ,$ajax);
637 dbx()->set_system_var('dbx_go' ,$go);
638
639
640 }
641
642
649 function get_is_resorce($ext) {
650 $ext=strtolower($ext);
651 $extensions = ['gif', 'jpg', 'png', 'jpeg', 'pdf', 'css', 'js', 'exe'];
652 // Überprüfen, ob die Erweiterung im Array vorhanden ist
653 return in_array($ext, $extensions) ? 1 : 0;
654 }
655
665 private function get_resource_file($permalink) {
666 $path = str_replace('\\', '/', rawurldecode((string) $permalink));
667 $path = ltrim($path, '/');
668
669 if ($path === '' || strpos($path, "\0") !== false) {
670 return '';
671 }
672
673 $parts = explode('/', $path);
674 foreach ($parts as $part) {
675 if ($part === '..') {
676 return '';
677 }
678 }
679
680 $base = realpath(dbx_get_base_dir());
681 if (!$base) {
682 return '';
683 }
684
685 $file = realpath($base . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $parts));
686 if (!$file || !is_file($file)) {
687 return '';
688 }
689
690 $baseCheck = rtrim(str_replace('\\', '/', strtolower($base)), '/') . '/';
691 $fileCheck = str_replace('\\', '/', strtolower($file));
692
693 if (strpos($fileCheck, $baseCheck) !== 0) {
694 return '';
695 }
696
697 return $file;
698 }
699
706 private function get_resource_mime($ext) {
707 $ext = strtolower((string) $ext);
708
709 $types = array(
710 'css' => 'text/css; charset=UTF-8',
711 'js' => 'application/javascript; charset=UTF-8',
712 'gif' => 'image/gif',
713 'jpg' => 'image/jpeg',
714 'jpeg' => 'image/jpeg',
715 'png' => 'image/png',
716 'pdf' => 'application/pdf',
717 'exe' => 'application/octet-stream',
718 );
719
720 return isset($types[$ext]) ? $types[$ext] : 'application/octet-stream';
721 }
722
730 private function send_resource_file($file, $ext) {
731 if (headers_sent()) {
732 return;
733 }
734
735 header('Content-Type: ' . $this->get_resource_mime($ext));
736 header('X-Content-Type-Options: nosniff');
737 header('Cache-Control: public, max-age=3600');
738
739 readfile($file);
740 exit;
741 }
742
743
744
750 function check_config() {
751 $config=dbx()->get_config('dbx');
752 if (!is_array($config)) {
753 $config=$this->create_new_cfg('dbx');
754 } else {
755 if (!isset($config['ok'])) $config=$this->create_new_cfg('dbx');
756 }
757 dbx()->set_system_var('dbx_install' ,$config['install']);
758 dbx()->set_system_var('dbx_construct',$config['construct']);
759 If (!$config['ok']) dbx()->set_system_var('dbx_install',1);
760 }
761
762
763
772 function check_missing() {
773 $ext='dbx';
774 $permalink=dbx()->get_system_var('dbx_permalink','','parameter+/');
775
776 if ($permalink > ' ') {
777 $info = pathinfo($permalink);
778 if (isset($info['extension'])) $ext=$info['extension'];
779 $ext=strtolower($ext);
780
781 if ($this->get_is_resorce($ext)) { // request missing ressorce
782 $resourceFile = $this->get_resource_file($permalink);
783 if ($resourceFile) {
784 dbx()->debug("## resource exists, not missing ($permalink) file=($resourceFile)");
785 $this->send_resource_file($resourceFile, $ext);
786 return;
787 }
788
789 dbx()->debug("## check missing ($permalink)");
790
791 $ok = dbx()->log_missing($permalink);
792 dbx()->debug("#MISSING# ($permalink) Ext=($ext) ok=($ok)");
793 // maybe return default resource.$ext
794 dbx()->debug('###EXIT###');
795 exit; // !
796 }
797 }
798 }
799
807 public function check_remember() {
808 // #Session switch values
809 //$page =dbx()->get_remember_var('dbx_page' ,'default','dbx');
810 $design=dbx()->get_remember_var('dbx_design','user' ,'dbx');
811 $edit =dbx()->get_remember_var('dbx_edit' ,0 ,'dbx');
812 $lng =dbx()->get_remember_var('dbx_lng' ,'de' ,'dbx');
813 $defaultColor = dbx()->normalize_skin((string) dbx()->get_config('dbx', 'default_color', 'blau'));
814 $color = dbx()->get_remember_var('dbx_color', $defaultColor, 'dbx');
815
816 //$page =dbx()->get_request_var('dbx_page' ,$page);
817 $design=dbx()->get_request_var('dbx_design',$design);
818 $edit =dbx()->get_request_var('dbx_edit' ,$edit);
819 $lng =dbx()->get_request_var('dbx_lng' ,$lng);
820 $color = dbx()->normalize_skin((string) dbx()->get_request_var('dbx_color', $color));
821
822 //dbx()->set_remember_var('dbx_page' ,$page ,'dbx');
823 dbx()->set_remember_var('dbx_design',$design,'dbx');
824 dbx()->set_remember_var('dbx_edit' ,$edit ,'dbx');
825 dbx()->set_remember_var('dbx_lng' ,$lng ,'dbx');
826 dbx()->set_remember_var('dbx_color' ,$color ,'dbx');
827
828 dbx()->set_system_var('dbx_design', $design);
829 dbx()->set_system_var('dbx_edit' , $edit);
830 dbx()->set_system_var('dbx_lng' , $lng);
831 dbx()->set_system_var('dbx_color' , $color);
832 dbx()->set_system_var('dbx_last_editor_tpl_paths', array());
833
834 }
835
841 private function get_content_permalink_mode(): string {
842 return dbx()->get_content_permalink_mode();
843 }
844
850 private function get_content_root(): int {
851 $requestRoot = dbx()->get_request_var('root', '', 'int');
852
853 if ($requestRoot !== '') {
854 return (int) $requestRoot;
855 }
856
857 $configRoot = dbx()->get_config('dbxContent', 'root');
858 if ($configRoot === 'undef' || $configRoot === '') {
859 return 0;
860 }
861
862 return (int) $configRoot;
863 }
864
872 private function set_content_route(int $cid, string $source = ''): void {
873 if ($cid <= 0) {
874 return;
875 }
876
877 $mode = $this->get_content_permalink_mode();
878 $root = $this->get_content_root();
879
880 dbx()->set_system_var('dbx_modul', 'dbxContent');
881 dbx()->set_system_var('dbx_cid', $cid);
882 dbx()->set_system_var('cid', $cid);
883 dbx()->set_system_var('dbx_content_route_cid', $cid);
884 $source = (string) $source;
885 $cacheableContentRoute = str_starts_with($source, 'permalink-');
886 dbx()->set_system_var('dbx_content_permalink_request', $cacheableContentRoute ? 1 : 0);
887
888 if ($mode === 'cms') {
889 dbx()->set_system_var('dbx_run1', 'cms');
890 dbx()->set_system_var('dbx_run2', 'show');
891 dbx()->set_system_var('root', $root);
892 } else {
893 dbx()->set_system_var('dbx_run1', 'show');
894 }
895
896 dbx()->debug("#PERMALINK set dbxContent mode=($mode) root=($root) cid=($cid) source=($source)");
897 }
898
904 private function get_home_content_cid(): int {
905 $this->load_content_cache_classes();
906
907 return \dbx\dbxContent\dbxContentHome::resolveCid();
908 }
909
915 private function load_content_cache_classes(): void {
916 dbx()->load_content_cache_classes();
917 }
918
932 public function check_perma() {
933 $cid=0; $home=0;
934 $permalink= dbx()->get_system_var('dbx_permalink');
935 dbx()->set_system_var('dbx_content_permalink_request', 0);
936 dbx()->set_system_var('dbx_content_route_cid', 0);
937 dbx()->debug("check perma ($permalink)");
938
939 if ($permalink =='undef') $permalink='';
940 if ($permalink =='/') $permalink='';
941
942
943 $lng=dbx()->get_system_var('dbx_lng','de');
944
945 $modul = dbx()->get_request_var('dbx_modul');
946 $action = dbx()->get_request_var('dbx_run1');
947 $hasExplicitRoute = ($modul !== '' && $action !== '');
948
949 if ($hasExplicitRoute) {
950 dbx()->set_system_var('dbx_modul', $modul);
951 dbx()->set_system_var('dbx_run1', $action);
952 dbx()->set_system_var('dbx_run2', dbx()->get_request_var('dbx_run2', '', 'parameter'));
953 dbx()->set_system_var('root', dbx()->get_request_var('root', '', 'int'));
954 }
955
956 $requestCid = (int) dbx()->get_request_var('cid', 0, 'int');
957 if (!$requestCid) $requestCid = (int) dbx()->get_request_var('dbx_cid', 0, 'int');
958
959 if ($hasExplicitRoute) {
960 dbx()->set_system_var('dbx_cid', $requestCid);
961 dbx()->set_system_var('cid', $requestCid);
962 return;
963 }
964
965 if ($requestCid > 0 && (!$modul || !$action || $modul === 'dbxHome')) {
966 $this->set_content_route($requestCid, 'request-cid');
967 return;
968 }
969
970 if (!$permalink && !$modul) $home=1;
971 if ( $modul=='dbxHome') $home=1;
972 if ($permalink === 'home' && !$modul) $home=1;
973
974
975 if ($home) {
976 $homeCid = $this->get_home_content_cid();
977 if ($homeCid > 0) {
978 $this->set_content_route($homeCid, ($permalink === 'home') ? 'permalink-home' : 'dbxHome-config');
979 return;
980 }
981 dbx()->set_system_var('dbx_modul' ,'dbxHome');
982 dbx()->set_system_var('dbx_run1','run');
983 dbx()->set_system_var('dbx_design','user');
984 return;
985 }
986
987 if ($permalink =='admin') {
988 dbx()->set_system_var('dbx_modul','dbxAdmin');
989 dbx()->set_system_var('dbx_run1','run');
990 dbx()->set_system_var('dbx_design','admin');
991 return;
992 }
993
994 if ($permalink === 'sitemap.xml' || $permalink === 'sitemap') {
995 dbx()->set_system_var('dbx_modul', 'dbxContent');
996 dbx()->set_system_var('dbx_run1', 'sitemap');
997 return;
998 }
999
1000 if ($permalink === 'robots.txt') {
1001 dbx()->set_system_var('dbx_modul', 'dbxContent');
1002 dbx()->set_system_var('dbx_run1', 'robots');
1003 return;
1004 }
1005
1006
1007
1008
1009 $check_perma=dbx()->get_config('dbx','permalink');
1010 if ($permalink > ' ' && $check_perma) {
1011 //$permalink=strtolower($permalink);
1012 dbx()->debug("##Permalink## ($permalink) Lng=($lng) check content#");
1013 $permalink=trim((string)$permalink, '/');
1014
1015 $this->load_content_cache_classes();
1016 $resolved = \dbx\dbxContent\dbxContentPermalinkIndex::resolve($permalink, $lng);
1017 if (is_array($resolved) && (int)($resolved['activ'] ?? 0) === 1) {
1018 $cid = (int)($resolved['cid'] ?? 0);
1019 if ($cid > 0) {
1020 $this->set_content_route($cid, 'permalink-content');
1021 return;
1022 }
1023 }
1024
1025 dbx()->set_system_var('dbx_modul', 'dbxHome');
1026 dbx()->set_system_var('dbx_run1', 'run');
1027 dbx()->set_system_var('dbx_run2', '');
1028 dbx()->set_system_var('dbx_design', 'user');
1029 dbx()->set_system_var('dbx_cid', 0);
1030 dbx()->set_system_var('cid', 0);
1031 dbx()->debug("#PERMALINK not found -> dbxHome permalink=($permalink)");
1032 return;
1033 }
1034 }
1035
1041 public function check_modul() {
1042 $modul=dbx()->get_system_var('dbx_modul');
1043 if (!dbx()->is_modul($modul)) $modul='dbxHome';
1044 dbx()->set_system_var('dbx_modul',$modul);
1045 }
1046
1047
1057 public function check_design() {
1058 $admin =dbx()->can('admin');
1059 $config=dbx()->get_config('dbx');
1060 $user_default = $config['default_design_user'];
1061 $admin_default= $config['default_design_admin'];
1062 $construct = $config['construct'];
1063 $intro = (int) ($config['intro'] ?? 0);
1064 $ok = (int) ($config['ok'] ?? 0);
1065
1066 $design = dbx()->get_remember_var('dbx_design',$user_default,'dbx');
1067 //$page = dbx()->get_remember_var('dbx_page' , 'default' ,'dbx');
1068 $page = dbx()->get_system_var('dbx_page' , 'default');
1069 $modul = dbx()->get_system_var('dbx_modul');
1070 $admin_modul = dbx()->has_text($modul,'_admin');
1071
1072
1073 if (!dbx()->is_design($design)) {
1074 $design='user';
1075 } else {
1076 if (!$admin && $design=='admin') $design='user';
1077 if ( $admin && $admin_modul) $design='admin';
1078 }
1079
1080
1081 $ajax = (int) dbx()->get_system_var('dbx_ajax', 0, 'int');
1082 if ($intro && $ok && !$ajax) {
1083 $introShown = (int) dbx()->get_session_var('intro_shown', 0, 'ui', 'dbx');
1084 $requestModul = trim((string) dbx()->get_request_var('dbx_modul', '', 'parameter'));
1085 if (!$introShown && $requestModul === '') {
1086 $design = $user_default;
1087 $modul = 'dbxHome';
1088 $page = 'intro';
1089 dbx()->set_session_var('intro_shown', 1, 'ui', 'dbx');
1090 }
1091 }
1092
1093 if (!$modul) {
1094 $design=$user_default;
1095 $modul='dbxHome';
1096 $page='home';
1097 $action='run';
1098 }
1099
1100 if (!$ok) {
1101 dbx()->set_system_var('dbx_install', 1);
1102 $modul = 'dbxSetup';
1103 $design = '_install';
1104 $page = 'install';
1105 dbx()->set_system_var('dbx_run1', 'install');
1106 }
1107
1108 if ($design=='admin') $design=$admin_default;
1109 if ($design=='user') $design=$user_default;
1110
1111 dbx()->set_system_var('dbx_modul' ,$modul);
1112 dbx()->set_system_var('dbx_design' ,$design);
1113 dbx()->set_system_var('dbx_page' ,$page);
1114 $ajax=dbx()->get_system_var('dbx_ajax',0);
1115
1116 //dbx_debug("##->check-design##=($design) Modul=($modul)Page=($page) Intro($intro) Ajax=($ajax)");
1117}
1118
1119
1125 public function check_lng() {
1126 $config=dbx()->get_config('dbx');
1127 $lng_default =$config['default_lng'];
1128 $lng_accessible=$config['accessible_lng'];
1129 $lng=dbx()->get_system_var('dbx_lng',dbx()->get_remember_var('dbx_lng',$lng_default,'dbx'));
1130 if ($lng != $lng_default) {
1131 $ok=0;
1132 if (!is_array($lng_accessible)) $lng_accessible = explode(",", $lng_accessible);
1133 foreach ($lng_accessible as $no => $val) {
1134 if ($lng == $val) $ok=1;
1135 }
1136 if (!$ok) $lng=$lng_default;
1137 }
1138 dbx()->set_remember_var('dbx_lng',$lng,'dbx');
1139 dbx()->set_system_var('dbx_lng', $lng);
1140 }
1141
1149 public function translate($content,$lng=''){
1150 if (!$lng) $lng=dbx()->get_system_var('dbx_lng','de');
1151 $dir_file=dbx_get_base_dir().'dbx/translate.php';
1152 if (file_exists($dir_file)) {
1153 include $dir_file;
1154 }
1155 return $content;
1156 }
1157
1158
1159
1160
1167 public function del_add_css($content) {
1168 $css_content='';
1169 if (isset($_SESSION['dbx']['add_css'])) {
1170 $xcss=$_SESSION['dbx']['add_css'];
1171 if (is_array($xcss)) {
1172 foreach ($xcss as $no => $css) { $css_content.=$css."\n"; }
1173 }
1174 }
1175 $content = (str_replace('[dbx:add_css]',$css_content,$content));
1176 return $content;
1177 }
1178
1185 public function del_add_js($content) {
1186 $js_content='';
1187 if (isset($_SESSION['dbx']['add_js'])) {
1188 $xjs=$_SESSION['dbx']['add_js'];
1189 if (is_array($xjs)) {
1190 foreach ($xjs as $no => $js) { $js_content.=$js."\n"; }
1191 }
1192 }
1193 $content = (str_replace('[dbx:add_js]',$js_content,$content));
1194 return $content;
1195 }
1196
1197
1198
1205 public function out_filter($content) {
1206 include dbx_get_base_dir().'dbx/out_filter.php';
1207 return $content;
1208 }
1209
1210
1217 public function add_norep($content) {
1218 $oTPL = dbx()->get_system_obj('dbxTPL');
1219 if (is_object($oTPL) && method_exists($oTPL, 'cleanup_optional_placeholders')) {
1220 $content = $oTPL->cleanup_optional_placeholders((string)$content);
1221 }
1222
1223 if (isset($_SESSION['dbx']['norep'])) {
1224 $xnorep=$_SESSION['dbx']['norep'];
1225 if (is_array($xnorep)) {
1226 for($i=0; $i < 2; $i++) { // noreps can include noraps
1227 foreach ($xnorep as $id => $norep) {
1228 $xid= '['.$id.']';
1229 $content = str_replace($xid,$norep,$content);
1230 }
1231 }
1232 }
1233 }
1234 return $content;
1235 }
1236
1237
1238 function get_session_rec($fld,$default='') {
1239 $value=$default;
1240 if ($fld != '*') {
1241 if (isset($_SESSION['dbx']['record'][$fld])) {
1242 $value=$_SESSION['dbx']['record'][$fld];
1243 }
1244 } else {
1245 $value=$_SESSION['dbx']['record'];
1246 }
1247 return $value;
1248 }
1249
1250 function design_load($modul_content) {
1251 $ajax =dbx()->get_system_var('dbx_ajax');
1252 $window=dbx()->get_system_var('dbx_window');
1253
1254 $design=dbx()->get_system_var('dbx_activ_design',dbx()->get_system_var('dbx_design'));
1255 $page =dbx()->get_system_var('dbx_activ_page' ,dbx()->get_system_var('dbx_page'));
1256 $lng =dbx()->get_system_var('dbx_activ_lng' ,dbx()->get_system_var('dbx_lng'));
1257
1258 //dbx_debug ("##DBX-CAll AJAX=($ajax) Get Ajax=($get_ajax) POST/GET",$_POST,$_GET);
1259
1260 if (!$ajax) {
1261 if ($window) $page='_window';
1262 $oTPL=dbx()->get_system_obj('dbxTPL');
1263 $content=$oTPL->get_design_tpl($design,$page,$lng,'htm',1);
1264
1265 if (defined('dbxRunAsAdmin') && (int) constant('dbxRunAsAdmin') === 1) {
1266 $admin_bypass_alert=$oTPL->get_tpl('dbx|alert-warning', array(
1267 'msg' => 'Admin Bypass ist aktiv'
1268 ));
1269 $modul_content=$admin_bypass_alert.'<br>'.$modul_content;
1270 }
1271
1272 $content = (str_replace("[dbx:content]",$modul_content,$content));
1273 } else {
1274 $content=$modul_content;
1275 }
1276 return $content;
1277 }
1278
1279 function add_editor_files_data($content) {
1280 $edit = (int) dbx()->get_system_var('dbx_edit', 0, 'int');
1281
1282 if (($edit < 4 || $edit > 8) && $edit !== 9) {
1283 return $content;
1284 }
1285
1286 $all_files = dbx()->get_editor_files();
1287 $files = array();
1288
1289 foreach ($all_files as $file) {
1290 if (!isset($file['kind'], $file['file'])) {
1291 continue;
1292 }
1293
1294 if ($edit == 4 && $file['kind'] !== 'fd') {
1295 continue;
1296 }
1297
1298 if ($edit == 5 && $file['kind'] !== 'dd') {
1299 continue;
1300 }
1301
1302 if ($edit == 6 && $file['kind'] !== 'class') {
1303 continue;
1304 }
1305
1306 if ($edit == 7 && $file['kind'] !== 'sysclass') {
1307 continue;
1308 }
1309
1310 if ($edit == 8 && $file['kind'] !== 'config') {
1311 continue;
1312 }
1313
1314 $key = $file['kind'] . '|' . $file['file'];
1315 $files[$key] = $file;
1316 }
1317
1318 $payload = array(
1319 'mode' => $edit,
1320 'files' => array_values($files),
1321 );
1322
1323 $json = json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
1324
1325 if (!$json) {
1326 return $content;
1327 }
1328
1329 $data = '<script type="application/json" class="dbx-editor-files-data">' .
1330 htmlspecialchars($json, ENT_NOQUOTES, 'UTF-8') .
1331 '</script>';
1332
1333 if (strpos($content, '</body>') !== false) {
1334 return str_replace('</body>', $data . "\n</body>", $content);
1335 }
1336
1337 return $data . $content;
1338 }
1339
1340 private function render_editor_files_menu($edit, $files) {
1341 if (!is_array($files) || !count($files)) {
1342 return '';
1343 }
1344
1345 $title = 'Editor Dateien';
1346 if ($edit == 4) $title = 'FD Dateien';
1347 if ($edit == 5) $title = 'DD Dateien';
1348 if ($edit == 6) $title = 'Modul PHP Dateien';
1349 if ($edit == 7) $title = 'myX SysClass Dateien';
1350 if ($edit == 8) $title = 'Config Dateien';
1351 if ($edit == 9) $title = 'Alle Editor Dateien';
1352
1353 $html = '<div id="dbxEditorFilesMenu" class="dbx-editor-files-menu" ';
1354 $html .= 'style="display:none;">';
1355 $html .= '<button type="button" class="dbx-editor-files-count" title="' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '" ';
1356 $html .= 'onclick="this.parentElement.classList.toggle(\'is-open\')" ';
1357 $html .= 'style="display:inline-flex;align-items:center;gap:6px;min-height:30px;padding:4px 8px;border:1px solid rgba(0,0,0,.18);border-radius:4px;background:#212529;color:#fff;box-shadow:0 4px 12px rgba(0,0,0,.18);">';
1358 $html .= '<i class="bi bi-pencil-square"></i><span>' . count($files) . '</span></button>';
1359 $html .= '<div class="dbx-editor-files-list" style="max-height:min(520px,calc(100vh - 96px));overflow:auto;padding:8px;border:1px solid rgba(0,0,0,.16);border-radius:4px;background:#fff;color:#212529;box-shadow:0 10px 28px rgba(0,0,0,.2);">';
1360 $html .= '<div class="dbx-editor-files-title" style="padding:4px 6px;font-weight:600;color:#495057;">' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</div>';
1361
1362 foreach ($files as $file) {
1363 if (!isset($file['file'])) {
1364 continue;
1365 }
1366
1367 $path = $file['file'];
1368 $kind = isset($file['kind']) ? (string)$file['kind'] : '';
1369 $url = $this->editor_file_url($kind, $path);
1370 $label = $this->short_editor_file_label($path);
1371
1372 $html .= '<a href="' . htmlspecialchars($url, ENT_QUOTES, 'UTF-8') . '" ';
1373 $html .= 'data-url="' . htmlspecialchars($url, ENT_QUOTES, 'UTF-8') . '" data-title="' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '" ';
1374 $html .= 'style="display:grid;grid-template-columns:22px minmax(0,1fr);align-items:center;gap:6px;padding:5px 6px;border-radius:4px;color:#212529;text-decoration:none;" class="dbx-win">';
1375 $html .= '<i class="bi bi-filetype-php"></i>';
1376 $html .= '<span style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">' . htmlspecialchars($label, ENT_QUOTES, 'UTF-8') . '</span>';
1377 $html .= '</a>';
1378 }
1379
1380 $html .= '</div>';
1381 $html .= '</div>';
1382
1383 return $html;
1384 }
1385
1386 private function short_editor_file_label($path) {
1387 $path = str_replace('\\', '/', $path);
1388 $prefix = 'dbx/modules/';
1389
1390 if (strpos($path, $prefix) === 0) {
1391 return substr($path, strlen($prefix));
1392 }
1393
1394 return $path;
1395 }
1396
1397 private function editor_file_url($kind, $path) {
1398 $kind = strtolower(trim((string)$kind));
1399 $path = str_replace('\\', '/', (string)$path);
1400
1401 if ($kind === 'dd' && preg_match('#^dbx/modules/([^/]+)/dd/([^/]+)\.dd\.php$#', $path, $m)) {
1402 return '?dbx_modul=dbxAdmin&dbx_run1=edit_dd&modul=' . rawurlencode($m[1]) . '&dd=' . rawurlencode($m[2]);
1403 }
1404
1405 if ($kind === 'fd' && preg_match('#^dbx/modules/([^/]+)/fd/([^/]+)\.fd\.php$#', $path, $m)) {
1406 return '?dbx_modul=dbxAdmin&dbx_run1=edit_fd&modul=' . rawurlencode($m[1]) . '&fd=' . rawurlencode($m[2]);
1407 }
1408
1409 return '?dbx_modul=dbxEditor&dbx_run1=edit&file=' . rawurlencode($path);
1410 }
1411
1412 // - - - - - - - - - - - - - - - - - - - - -
1413
1414 function run() {
1415 $content='';
1416 $uid =dbx()->user();
1417 $self =dbx()->get_self_url();
1418 $design = dbx()->get_system_var('dbx_design');
1419 $page = dbx()->get_system_var('dbx_page');
1420 $lng = dbx()->get_system_var('dbx_lng');
1421 $edit = dbx()->get_system_var('dbx_edit');
1422 $color = dbx()->get_system_var('dbx_color');
1423 $modul = dbx()->get_system_var('dbx_modul');
1424 $action = dbx()->get_system_var('dbx_run1');
1425 $api = dbx()->get_system_var('dbx_api');
1426 $cid = dbx()->get_system_var('dbx_cid',0);
1427 $run2 = dbx()->get_system_var('dbx_run2','');
1428 $root = dbx()->get_system_var('root','');
1429 $install= dbx()->get_system_var('dbx_install',0);
1430
1431 //$oInterpreter = dbx()->get_system_obj('dbxInterpreter');
1432
1433 if ($api && $uid != 2) dbx()->login(2); // auto login for api access
1434
1435 //dbx_debug("#WebApp run-> Design=($design) Page=($page) Modul=($modul) Action=($action) Api=($api) Install=($install) User=($uid) Lng=($lng) Self=($self)");
1436
1437
1438 if ($modul) {
1439 $access=dbx()->can_modul($modul);
1440 if (!$access) {
1441 $perma=dbx()->get_system_var('dbx_permalink');
1442 if ( $perma && !$uid) dbx()->set_remember_var('dbx_redir_after_login',$perma,'dbx');
1443 if (!$perma && !$uid) dbx()->set_remember_var('dbx_redir_after_login',"?dbx_modul=$modul&dbx_run1=$action",'dbx');
1444
1445 $content='[modul=dbxLogin]dbx_run1=login[/modul]';
1446 }
1447 if ($access) {
1448
1449 dbx()->set_system_var('dbx_master_modul' , $modul); // use 4 session
1450 dbx()->set_system_var('dbx_master_action',$action); // use 4 session
1451 dbx()->set_system_var('dbx_activ_modul' , $modul); // use 4 session
1452 dbx()->set_system_var('dbx_activ_action' ,$action); // use 4 session
1453
1454 $dbxModul=dbx()->get_modul_obj($modul);
1455 $mid=dbx()->get_system_var('dbx_activ_modul_id',0,'*');
1456
1457 dbx()->set_system_var('dbx_activ_modul_id',$mid);
1458 dbx()->set_modul_var('dbx_modul_id',$mid);
1459 dbx()->set_modul_var('dbx_modul' ,$modul);
1460 dbx()->set_modul_var('dbx_run1' ,$action);
1461 if ($run2 !== '') dbx()->set_modul_var('dbx_run2', $run2);
1462 dbx()->set_modul_var('dbx_cid' ,$cid); // come from permalink check()
1463 if ($cid) dbx()->set_modul_var('cid', $cid);
1464 if ($root !== '') dbx()->set_modul_var('root', $root);
1465
1466 $content=dbx()->run_owner($dbxModul);
1467
1468
1469 if ($api) dbx()->set_system_var('dbx_page','api');
1470
1471 }
1472
1473 }
1474 $mid=dbx()->get_system_var('dbx_activ_modul_id');
1475 $go =dbx()->get_system_var('dbx_go',0,'parameter');
1476 if ($go) {
1477 $js ='$(document).ready(function() { ';
1478 $js.= "dbxGoTo('$go');";
1479 $js.=' } );';
1480 $js.="\n";
1481 $content.="<br><script>$js</script><div id=dbx_end></div>";
1482 }
1483 //dbx_debug("#WebApp load-> Modul=($modul) Action=($action) Access=($access) Modul-id=($mid) go =($go)");
1484
1485 return $content;
1486 }
1487
1488
1489} // class
Bereitet den aktuellen HTTP-Request fuer dbXapp vor.
get_is_resorce($ext)
Prueft, ob eine Dateiendung als direkt auslieferbare Ressource gilt.
normalize_self_url($url)
Bereinigt eine Self-/Menu-URL von Memory-Schaltern in Pfad und Query.
build_route_url($permalink, $params=array(), $fragment='')
Baut eine kanonische Route-URL aus Permalink, Query-Parametern und Fragment.
check_remember()
Uebernimmt persistente UI-/Systemwerte aus Remember in den Request.
check_lng()
Prueft und speichert die aktive Sprache.
check_modul()
Prueft das aktive Modul und setzt bei fehlendem Modul dbxHome.
translate($content, $lng='')
Wendet die globale dbx/translate.php auf Inhalt an.
memory_switch_params()
Liefert die Remember-/Memory-Schalter, die nicht in Permalinks haengen duerfen.
design_load($modul_content)
check_config()
Stellt die zentrale dbx-Konfiguration sicher.
get_base_uri()
Liefert das Basisverzeichnis des Entry Points als URI.
peel_glued_params_from_path($path, &$params=array())
Entfernt angeklebte Query-Parameter aus einem Permalink-Pfad.
check_missing()
Behandelt fehlende statische Ressourcen.
add_editor_files_data($content)
create_new_cfg($modul='dbx')
Erstellt eine minimale Default-Konfiguration fuer ein Modul.
check_request()
Normalisiert den aktuellen HTTP-Request fuer den Kernel.
get_session_rec($fld, $default='')
normalize_route_params($params)
Normalisiert Query-Parameter auf string-Werte.
append_route_params($url, $params=array())
Haengt Parameter an eine vorhandene Route-URL an.
setRequestUriToGet()
Spiegelt Query-Parameter aus REQUEST_URI nach $_GET.
add_norep($content)
Setzt geschuetzte norep-Platzhalter am Ende wieder ein.
get_base_url(string $uri)
Ermittelt die Basis-URL des Servers und gibt sie zurück.
strip_unwanted_route_params($params, $unwanted='')
Entfernt unerwuenschte Parameter aus einem Param-Array.
check_perma()
Loest Permalink, Home, Admin und explizite Modulrouten auf.
del_add_css($content)
Ersetzt [dbx:add_css] durch im Request gesammelte CSS-Fragmente.
get_permalink($uri)
Ermittelt den Permalink-Anteil hinter der Basis-URI.
parse_route_url($url)
Parst Permalink- und Standard-URLs in Pfad + Query-Parameter.
route_param_prefix($url)
Prefix fuer Template-Links wie {self}dbx_design=desktop.
check_design()
Bestimmt das aktive Design fuer den Request.
check_uri()
Zerlegt REQUEST_URI in Pfad und Query-Parameter.
out_filter($content)
Fuehrt den zentralen Ausgabe-Filter aus.
get_self_url($permalink, $unwanted)
Baut die aktuelle Self-URL ohne unerwuenschte DBX-Steuerparameter.
del_add_js($content)
Ersetzt [dbx:add_js] durch im Request gesammelte JS-Fragmente.
get_request_route_string($baseUri='')
Liefert den Routen-Teil des aktuellen Requests (Permalink + Query).
$config['version']
Definition config.php:2
dbx_os_path_file($path_file)
Definition index.php:164
exit
Definition index.php:532
dbx_get_file_dir()
Definition index.php:265
if( $syncRequest)
Definition index.php:520
dbx_get_base_dir($cut_Data=0)
Definition index.php:157
DBX schema administration.
$_SERVER['REQUEST_URI']