14 $this->oTPL=
dbx()->get_system_obj(
'dbxTPL');
18 private function user_has_access(
$groups) {
24 private function resolve_folder_rights(
$db, $folder_id, array $visited = array()) {
25 $folder_id = (int)$folder_id;
26 if ($folder_id <= 0)
return '*';
27 if (isset($visited[$folder_id]))
return '*';
28 $visited[$folder_id] = 1;
30 $row =
$db->select1(dbxContentLng::ddFolder(), $folder_id,
'*', 0);
31 if (!is_array($row))
return '*';
33 $raw = trim((
string)($row[
'group_read'] ??
''));
34 if ($raw ===
'')
return '*';
36 $parent_id = (int)($row[
'parent_id'] ?? 0);
37 $parts = preg_split(
'/\s*,\s*/', $raw, -1, PREG_SPLIT_NO_EMPTY);
41 foreach ($parts as $part) {
42 $part = trim((
string)$part);
43 if ($part ===
'')
continue;
44 if (strtolower($part) ===
'parent') {
52 $parent_rights = $this->resolve_folder_rights(
$db, $parent_id, $visited);
53 foreach (preg_split(
'/\s*,\s*/', $parent_rights, -1, PREG_SPLIT_NO_EMPTY) as $part) {
54 $part = trim((
string)$part);
55 if ($part !==
'' && strtolower($part) !==
'parent')
$out[$part] = 1;
59 return count(
$out) ? implode(
',', array_keys(
$out)) :
'*';
62 private function folder_allowed(
$db, $folder_id) {
63 return $this->user_has_access($this->resolve_folder_rights(
$db, $folder_id));
66 private function content_href(array
$page) {
67 $permalink = trim((
string)(
$page[
'permalink'] ??
''));
68 if ($permalink !==
'') {
69 if (preg_match(
'/^(https?:\/\/|\/|\?)/i', $permalink))
return $permalink;
70 return dbx()->get_base_url() . ltrim($permalink,
'/');
72 return '?dbx_modul=dbxContent&dbx_run1=show&dbx_cid=' . (int)(
$page[
'id'] ?? 0);
75 private function cms_pages(
$db, $folder_id) {
76 $rows =
$db->select(dbxContentLng::ddContent(),
'folder = ' . (
int)$folder_id .
' AND activ = 1',
'id,title,menu_title,permalink,sorter,folder',
'sorter,title,id',
'ASC',
'', 0, 0, 0);
80 private function cms_folders(
$db, $parent_id) {
81 $rows =
$db->select(dbxContentLng::ddFolder(),
'parent_id = ' . (
int)$parent_id,
'id,name,parent_id,group_read,sorter',
'sorter,name,id',
'ASC',
'', 0, 0, 0);
85 private function render_page_li(array
$page) {
86 $title = trim((
string)(
$page[
'menu_title'] ??
''));
87 if ($title ===
'') $title = trim((
string)(
$page[
'title'] ??
''));
88 if ($title ===
'') $title =
'Seite ' . (int)(
$page[
'id'] ?? 0);
89 return '<li class="dbx-cms-menu-page"><a href="' .
dbx()->esc($this->content_href(
$page)) .
'"><span>' .
dbx()->esc($title) .
'</span></a></li>';
92 private function resolve_folder_reference(
$db,
$root) {
97 $path = trim(rawurldecode((
string)
$root),
" \t\n\r\0\x0B/");
98 if ($path ===
'')
return 0;
101 foreach (preg_split(
'#\s*/\s*#', $path, -1, PREG_SPLIT_NO_EMPTY) as $name) {
102 $folder =
$db->select1(
103 dbxContentLng::ddFolder(),
104 array(
'parent_id' => $parentId,
'name' => trim((
string)$name)),
108 $parentId = (int)($folder[
'id'] ?? 0);
109 if ($parentId <= 0)
return 0;
115 private function render_pages(
$db, $folder_id) {
117 foreach ($this->cms_pages(
$db, $folder_id) as
$page) {
123 private function render_folder_li(
$db, array $folder) {
124 $id = (int)($folder[
'id'] ?? 0);
125 if ($id <= 0 || !$this->folder_allowed(
$db, $id))
return '';
127 $inner = $this->render_children(
$db, $id);
128 if (trim($inner) ===
'')
return '';
130 $name = trim((
string)($folder[
'name'] ??
''));
131 if ($name ===
'') $name =
'Ordner ' . $id;
133 return '<li class="dbx-cms-menu-folder">'
134 .
'<a role="button" tabindex="0" aria-haspopup="true">'
135 .
'<i class="bi bi-folder2-open" aria-hidden="true"></i>'
136 .
'<span>' .
dbx()->esc($name) .
'</span>'
137 .
'</a><ul>' . $inner .
'</ul></li>';
140 private function render_children(
$db, $folder_id, $include_pages =
true) {
141 $folder_id = (int)$folder_id;
142 if (!$this->folder_allowed(
$db, $folder_id))
return '';
145 foreach ($this->cms_folders(
$db, $folder_id) as $folder) {
146 $html .= $this->render_folder_li(
$db, $folder);
148 if ($include_pages) {
149 $html .= $this->render_pages(
$db, $folder_id);
157 if ($flat !== 1)
return '';
159 $db =
dbx()->get_system_obj(
'dbxDB');
161 if (!$this->folder_allowed(
$db,
$root))
return '';
163 return $this->render_pages(
$db,
$root);
168 $split_flat = $split_flat && $flat === 1;
169 $db =
dbx()->get_system_obj(
'dbxDB');
171 $lng = dbxContentPageCache::currentLng();
172 $variant = dbxContentPageCache::menuVariantFlat($flat);
174 $variant .=
'-split';
177 if (dbxContentPageCache::isReadEnabled()) {
187 $inner = $this->render_children(
$db, 0, !$split_flat);
190 } elseif (trim($inner) !==
'') {
191 $html =
'<li class="dbx-cms-menu-root"><a>Content</a><ul>' . $inner .
'</ul></li>';
194 if ($this->folder_allowed(
$db,
$root)) {
198 $folder =
$db->select1(dbxContentLng::ddFolder(),
$root,
'*', 0);
199 if (is_array($folder)) {
200 $html = $this->render_folder_li(
$db, $folder);
206 if (dbxContentPageCache::isWriteEnabled()) {
214 private function has_entrys(
$root,$tab_folder,$tab_content,
$count,$deepr=0) {
216 $deep=
dbx()->get_modul_var(
'deep',9,
'int');
221 if ($deepr <= $deep) {
223 $where =
"parent_id = $root";
224 $db =
dbx()->get_system_obj(
'dbxDB');
225 $folder=
$db->select($tab_folder,$where,
'id,name,group_read,sorter',
'sorter,name,id');
227 if (is_array($folder)) {
228 foreach ($folder as $no => $record) {
229 $access=$this->folder_allowed(
$db, (
int)$record[
'id']);
231 $root = $record[
'id'];
232 $name = $record[
'name'];
243 private function has_files(
$root,$tab_content) {
246 $where =
"folder = $root";
248 $db =
dbx()->get_system_obj(
'dbxDB');
249 if (!$this->folder_allowed(
$db, (
int)
$root))
return 0;
250 $files =
$db->select($tab_content,$where,
'id,title');
259 private function content_files(
$root,$tab_content,
$content) {
261 $where =
"folder = $root";
262 $db =
dbx()->get_system_obj(
'dbxDB');
263 if (!$this->folder_allowed(
$db, (
int)
$root)) {
264 return str_replace(
'{obj:files}',
'',
$content);
266 $files =
$db->select($tab_content,$where,
'id,title,permalink,sorter',
'sorter,title,id');
268 foreach (
$files as $no => $record) {
270 $title=$record[
'title'];
271 $tpl=$this->oTPL->get_tpl(
'modul',
'menu-content-file');
272 if ($record[
'permalink']) {
273 $href=$record[
'permalink'];
275 $href=
'?dbx_Modul=dbxContent&dbx_run1=show&cid='.$id;
277 $tpl = (str_replace(
'{href}' ,$href ,
$tpl));
278 $tpl = (str_replace(
'{title}',$title,
$tpl));
287 private function content_folder(
$root,$tab_folder,$tab_content,
$content,$deepr=0) {
289 $where =
"parent_id = $root";
290 $db =
dbx()->get_system_obj(
'dbxDB');
291 $folder=
$db->select($tab_folder,$where,
'id,name,group_read,sorter',
'sorter,name,id');
292 if (is_array($folder)) {
293 $deep =
dbx()->get_modul_var(
'deep',9,
'int');
294 $deepr = ($deepr + 1);
296 if ($deepr <= $deep) {
297 foreach ($folder as $no => $record) {
298 $access=$this->folder_allowed(
$db, (
int)$record[
'id']);
300 $root = $record[
'id'];
301 $name = $record[
'name'];
302 $count = $this->has_entrys(
$root,$tab_folder,$tab_content,0,$deepr);
304 $tpl = $this->oTPL->get_tpl(
'modul',
'menu-content-sub');
305 $tpl = (str_replace(
'{folder}',$name ,
$tpl));
307 $tpl = (str_replace(
'{deep}' ,$deepr,
$tpl));
310 if ($deepr < $deep) {
311 $tpl=$this->content_folder(
$root,$tab_folder,$tab_content,
$tpl,$deepr);
327 private function content_menu_load() {
329 $root =
dbx()->get_modul_var(
'root',0,
'int');
330 $deep =
dbx()->get_modul_var(
'deep',9,
'int');
331 $label =
dbx()->get_modul_var(
'label');
332 $mode =
dbx()->get_modul_var(
'mode');
333 $lng =
dbx()->get_modul_var(
'lng');
334 $tpl =
'menu-content';
337 $tab_content = dbxContentLng::ddContent(
$lng);
338 $tab_folder = dbxContentLng::ddFolder(
$lng);
339 dbx()->set_modul_var(
'deep_run',0);
340 $entrys= $this->has_entrys(
$root,$tab_folder,$tab_content,0);
359 $root =
dbx()->get_modul_var(
'root', 0);
361 #todo $root = folder name select get root
364 $lng = trim((
string)
dbx()->get_modul_var(
'lng',
''));
366 $lng =
dbx()->get_system_var(
'dbx_lng',
'de');
368 dbx()->set_modul_var(
'lng',
$lng);
370 $deep = (int)
dbx()->get_modul_var(
'deep', 9,
'int');
371 $mode = trim((
string)
dbx()->get_modul_var(
'mode',
''));
372 $label = trim((
string)
dbx()->get_modul_var(
'label',
''));
373 $variant = dbxContentPageCache::menuVariantLoad($deep,
$mode, $label);
375 if (dbxContentPageCache::isReadEnabled()) {
382 $content = $this->content_menu_load();
384 if (dbxContentPageCache::isWriteEnabled()) {