functions.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. // sqlite datehbank ahfigge
  3. $db = new SQLite3($websiteConfig['database']);
  4. // so luegele ob mer navbar sache mache oder ob d'websihte wahrschiinlich so sidebar style wird
  5. $navbarTableExists = $db->querySingle("SELECT name FROM sqlite_master WHERE type='table' AND name='navbar'");
  6. $navbarHasEntries = $db->querySingle("SELECT COUNT(*) FROM navbar") > 0;
  7. // mis wunderschöne url handling ✨
  8. $page = isset($_GET['page']) ? htmlspecialchars($_GET['page']) : 'index';
  9. $sub = isset($_GET['sub']) ? htmlspecialchars($_GET['sub']) : null;
  10. $offset = isset($_GET['offset']) ? (int)$_GET['offset'] : 0;
  11. $limit = 10; // Number of posts per load
  12. $menuExpanded = isset($_GET['menu']) ? (bool)$_GET['menu'] : false;
  13. // overflow protection oder so cha kei cybersecurity
  14. if ($offset < 0) {
  15. $offset = 0;
  16. }
  17. // schlimmste funktion eveer für breadcrumbs aber es funktioniert leider
  18. function get_full_path($db, $page, $sub = null) {
  19. $path = [];
  20. $current_page = $sub ?: $page; // If sub is set of posts benutzen sub suscht halt page
  21. while ($current_page) {
  22. $query = $db->prepare('SELECT parent, title, page FROM pages WHERE page = :page');
  23. $query->bindValue(':page', $current_page, SQLITE3_TEXT);
  24. $result = $query->execute()->fetchArray(SQLITE3_ASSOC);
  25. if ($result) {
  26. array_unshift($path, [
  27. 'title' => $result['title'],
  28. 'page' => $result['page']
  29. ]);
  30. $current_page = $result['parent']; // eltere vor d'füess schiebe
  31. } else {
  32. break;
  33. }
  34. }
  35. return $path;
  36. }
  37. $breadcrumbs = get_full_path($db, $page, $sub);
  38. // siihte metadata mache und so
  39. $metaQuery = $db->prepare('SELECT meta_description, parent FROM pages WHERE page = :page AND (parent IS NULL OR parent = :parent)');
  40. $metaQuery->bindValue(':page', $page, SQLITE3_TEXT);
  41. $metaQuery->bindValue(':parent', $sub, SQLITE3_TEXT);
  42. $metaResult = $metaQuery->execute()->fetchArray(SQLITE3_ASSOC);
  43. $metaDescription = $metaResult ? htmlspecialchars($metaResult['meta_description'] ?? '', ENT_QUOTES, 'UTF-8') : 'Default description of the website.';
  44. // mal gügsle wiviel posts es git hmmm 🤔 lol
  45. $countQuery = $db->prepare('SELECT COUNT(*) as total FROM content WHERE page = :page AND (parent IS NULL OR parent = :sub)');
  46. $countQuery->bindValue(':page', $page, SQLITE3_TEXT);
  47. $countQuery->bindValue(':sub', $sub, SQLITE3_TEXT);
  48. $totalPosts = $countQuery->execute()->fetchArray(SQLITE3_ASSOC)['total'];
  49. // offset dörf nid grösser sii als total posts will susch depressione
  50. if ($offset > $totalPosts) {
  51. $offset = $totalPosts - ($totalPosts % $limit);
  52. }
  53. // ALLI POSTS ABRÜefe bitte ned ahlange susch hühl ich
  54. $query = $db->prepare('SELECT title, content, date FROM content WHERE page = :page ORDER BY date DESC LIMIT :limit OFFSET :offset');
  55. $query->bindValue(':page', $sub ? $sub : $page, SQLITE3_TEXT);
  56. $query->bindValue(':limit', $offset + $limit, SQLITE3_INTEGER);
  57. $query->bindValue(':offset', 0, SQLITE3_INTEGER); // immer alli posts holeh will was isch normali site pagination
  58. $result = $query->execute();
  59. // het page überhaupt was drufeh oder so ?
  60. $hasContent = $result->fetchArray() !== false;
  61. if ($hasContent) {
  62. // Reset the result pointer
  63. $result->reset();
  64. }
  65. // haben das linke sidebar sache?
  66. $leftSidebarHasItems = $db->querySingle("SELECT COUNT(*) FROM sidebar WHERE position='left'") > 0;
  67. // haben das rechte sidebar sache?
  68. $rightSidebarHasItems = $db->querySingle("SELECT COUNT(*) FROM sidebar WHERE position='right'") > 0;
  69. // das isch fett schaisse und ich ha kein plan ki het gseit das fixts und so ich ha kei lust meh gha ha nach 2 stund 😭
  70. function sameQueryParams(string $url1, string $url2): bool {
  71. $parsed1 = parse_url($url1);
  72. $parsed2 = parse_url($url2);
  73. $params1 = [];
  74. $params2 = [];
  75. if (!empty($parsed1['query'])) {
  76. parse_str($parsed1['query'], $params1);
  77. }
  78. if (!empty($parsed2['query'])) {
  79. parse_str($parsed2['query'], $params2);
  80. }
  81. return $params1 == $params2;
  82. }
  83. // isch das total behindert und komplett losti ahgangs wiihs ? ja ... aber es funktioniert leider echt kei bock meh fr fr die grüene sind schuld
  84. function get_sidebar($db, $position, $page, $sub) {
  85. $query = $db->prepare('
  86. SELECT title, link, link_text
  87. FROM sidebar
  88. WHERE position = :position
  89. ORDER BY id
  90. ');
  91. $query->bindValue(':position', $position, SQLITE3_TEXT);
  92. $result = $query->execute();
  93. if (!$result || !$result->fetchArray(SQLITE3_ASSOC)) {
  94. return; // effizienz versuech will die ganz funktion müll isch ach mannn 😭
  95. }
  96. $result->reset();
  97. $lastTitle = "";
  98. // Bob der baumeister spileh und $activeLink zemme bastle
  99. $queryString = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY) ?? ''; // luege das ned null isch will susch motzts
  100. parse_str($queryString, $queryParams);
  101. $activeParts = ["?page=" . ($queryParams['page'] ?? '')];
  102. if (!empty($queryParams['sub'])) {
  103. if (is_array($queryParams['sub'])) {
  104. foreach ($queryParams['sub'] as $subParam) {
  105. $activeParts[] = "sub=" . $subParam;
  106. }
  107. } else {
  108. $activeParts[] = "sub=" . $queryParams['sub'];
  109. }
  110. }
  111. $activeLink = implode("&", $activeParts);
  112. $foundActive = false;
  113. while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
  114. // new post oh mein gott so spannend mached mer grad neue title
  115. if ($row['title'] !== $lastTitle) {
  116. if ($lastTitle !== "") {
  117. echo '</div>';
  118. }
  119. echo '<div class="box"><h3>' . htmlspecialchars($row['title']) . '</h3>';
  120. $lastTitle = $row['title'];
  121. }
  122. // externi links z'erchäne wär inteligent schickiert
  123. if (filter_var($row['link'], FILTER_VALIDATE_URL)) {
  124. echo '<p><a href="'
  125. . htmlspecialchars($row['link'])
  126. . '" target="_blank">'
  127. . htmlspecialchars($row['link_text'])
  128. . '</a></p>';
  129. } else {
  130. // robuster mache und so lönd mich ihn rueh
  131. $activeClass = '';
  132. if (!$foundActive && sameQueryParams($row['link'], $activeLink)) {
  133. $activeClass = 'active';
  134. $foundActive = true;
  135. }
  136. echo '<p><a href="'
  137. . htmlspecialchars($row['link'], ENT_QUOTES, 'UTF-8')
  138. . '" class="' . $activeClass . '">'
  139. . htmlspecialchars($row['link_text'])
  140. . '</a></p>';
  141. }
  142. }
  143. if ($lastTitle !== "") {
  144. echo '</div>';
  145. }
  146. }
  147. ?>