'; /** * Prüft, ob der aktuelle User auf den Beitrag zugreifen darf * – basierend auf den Berechtigungstabellen für Mandanten, Abteilungen und Rollen. * Der LEFT JOIN-Ansatz überprüft, ob in jedem Bereich (department, mandant, role) * entweder keine Verknüpfung existiert oder, falls Verknüpfungen vorhanden sind, * mindestens eine Übereinstimmung mit den erlaubten Werten vorliegt. * * @param int $postId Die ID des Beitrags, für den die Berechtigungsprüfung erfolgen soll. * @return bool True, wenn der User in allen relevanten Bereichen mindestens einen Match hat oder die Einschränkung fehlt; ansonsten false. */ function userHasAccessForPost($postId) { // Superuser-Bypass: Hat der Nutzer die Berechtigung "super user", darf er den Artikel immer sehen $mandantId = isset($GLOBALS['main_contact']['master_mandant_id']) ? (int) $GLOBALS['main_contact']['master_mandant_id'] : 0; $userId = isset($GLOBALS['main_contact']['id']) ? (int) $GLOBALS['main_contact']['id'] : 0; if (function_exists('get_permission_state')) { $isSuperUser = get_permission_state('r-wiki', $mandantId, $userId); if ($isSuperUser == 1) { return true; } } global $allowedMandants, $allowedDepartments, $allowedRoles, $allowedEinrichts, $allowedFachbereiche; $sql = " SELECT COUNT(DISTINCT pd.department_id) AS cntDept, SUM(IF(pd.department_id IN (" . ($allowedDepartments ? $allowedDepartments : 'NULL') . "), 1, 0)) AS matchDept, COUNT(DISTINCT pm.mandant_id) AS cntMand, SUM(IF(pm.mandant_id IN (" . ($allowedMandants ? $allowedMandants : 'NULL') . "), 1, 0)) AS matchMand, COUNT(DISTINCT pr.role_id) AS cntRole, SUM(IF(pr.role_id IN (" . ($allowedRoles ? $allowedRoles : 'NULL') . "), 1, 0)) AS matchRole, COUNT(DISTINCT pe.einricht_id) AS cntEinricht, SUM(IF(pe.einricht_id IN (" . ($allowedEinrichts ? $allowedEinrichts : 'NULL') . "), 1, 0)) AS matchEinricht, COUNT(DISTINCT pfb.fachbereich_id) AS cntFachbereich, SUM(IF(pfb.fachbereich_id IN (" . ($allowedFachbereiche ? $allowedFachbereiche : 'NULL') . "), 1, 0)) AS matchFachbereich FROM knowledgecenter_posts AS p LEFT JOIN knowledgecenter_post_department AS pd ON p.id = pd.post_id LEFT JOIN knowledgecenter_post_mandant AS pm ON p.id = pm.post_id LEFT JOIN knowledgecenter_post_role AS pr ON p.id = pr.post_id LEFT JOIN knowledgecenter_post_einricht AS pe ON p.id = pe.post_id LEFT JOIN knowledgecenter_post_fachbereich AS pfb ON p.id = pfb.post_id WHERE p.id = $postId GROUP BY p.id "; $res = mysqli_query($GLOBALS['mysql_con'], $sql); if (!$res || mysqli_num_rows($res) === 0) { return true; } $row = mysqli_fetch_assoc($res); $access = true; if ($row['cntDept'] > 0 && $row['matchDept'] == 0) { $access = false; } if ($row['cntMand'] > 0 && $row['matchMand'] == 0) { $access = false; } if ($row['cntRole'] > 0 && $row['matchRole'] == 0) { $access = false; } if ($row['cntEinricht'] > 0 && $row['matchEinricht'] == 0) { $access = false; } if ($row['cntFachbereich'] > 0 && $row['matchFachbereich'] == 0) { $access = false; } return $access; } // Hole alle Sprachen aus der Datenbank: $allLanguages = []; $sqlLang = "SELECT id, code, name FROM main_language"; $resLang = mysqli_query($GLOBALS['mysql_con'], $sqlLang); while ($lang = mysqli_fetch_assoc($resLang)) { $allLanguages[] = $lang; } $initialRedirectCategoryId = 0; // akzeptiere beide Namen, falls du sie mal unterschiedlich geschickt hast if (isset($_GET['initial_category_id'])) { $initialRedirectCategoryId = (int)$_GET['initial_category_id']; } elseif (isset($_GET['initial_category'])) { $initialRedirectCategoryId = (int)$_GET['initial_category']; } if ($initialRedirectCategoryId > 0) { // Ziel: /intranet/de/wiki/?detail=CATEGORYID&route=CATEGORYID $redirectURL = '/intranet/de/wiki/?detail=' . $initialRedirectCategoryId . '&route=' . $initialRedirectCategoryId; } elseif (!empty($_GET['redirectURL'])) { // optional: hier könntest du noch erlaubte Domains/Prefixes whitelisten $redirectURL = (string)$_GET['redirectURL']; } else { $redirectURL = '/'; } // Prüfe, ob ein neuer Beitrag erstellt werden soll (Parameter new=1) $isNew = isset($_GET['new']) && $_GET['new'] == 1; // Initiale Kategorie aus der URL übernehmen (bei Neuerstellung) $initialCategoryId = isset($_GET['InitialCategory']) ? (int) $_GET['InitialCategory'] : 0; $InitialProduct = isset($_GET['InitialProduct']) ? (int) $_GET['InitialProduct'] : 0; if ($isNew) { require_permission('r-wiki'); // Neuer Beitrag: Lege leere bzw. Standardwerte an $postId = 0; $post = [ 'id' => 0, // Weitere Felder kannst du hier ggf. ergänzen ]; $commentCount = 0; $versionCount = 0; $currentVersion = [ 'id' => 0, 'title' => '', 'image' => '', 'teaser' => '', 'content' => '', 'version_number' => 0, 'created_at' => date("Y-m-d H:i:s") ]; } else { // Ermitteln der Post-ID aus dem Query-String if (!isset($_GET['id'])) { echo "

Kein Beitrag ausgewählt.

"; exit; } $postId = (int) $_GET['id']; // Sicherheitscheck: Prüfe, ob der Nutzer auf diesen Beitrag zugreifen darf if (!userHasAccessForPost($postId)) { echo "

Sie haben nicht die notwendigen Berechtigungen.

"; exit; } // Beitrag aus der Haupttabelle abrufen $sqlPost = "SELECT * FROM knowledgecenter_posts WHERE id = $postId LIMIT 1"; $resPost = mysqli_query($GLOBALS['mysql_con'], $sqlPost); if (!$resPost || mysqli_num_rows($resPost) == 0) { echo "

Beitrag nicht gefunden.

"; exit; } $post = mysqli_fetch_assoc($resPost); // Anzahl Dateien ermitteln $sqlCountFiles = "SELECT COUNT(*) AS fileCount FROM knowledgecenter_post_files WHERE post_id = $postId"; $resCountFiles = mysqli_query($GLOBALS['mysql_con'], $sqlCountFiles); if ($resCountFiles && mysqli_num_rows($resCountFiles) > 0) { $row = mysqli_fetch_assoc($resCountFiles); $fileCount = (int) $row['fileCount']; } else { $fileCount = 0; } // Anzahl Kommentare ermitteln $sqlCountComments = "SELECT COUNT(*) AS commentCount FROM topic WHERE knowledgecenter_post_id = $postId"; $resCountComments = mysqli_query($GLOBALS['mysql_con'], $sqlCountComments); if ($resCountComments && mysqli_num_rows($resCountComments) > 0) { $rowCount = mysqli_fetch_assoc($resCountComments); $commentCount = (int) $rowCount['commentCount']; } else { $commentCount = 0; } // Anzahl Versionen für die aktuell ausgewählte Sprache ermitteln $sqlCountVersions = "SELECT COUNT(*) AS versionCount FROM knowledgecenter_post_versions WHERE post_id = $postId AND language_id = $languageId"; $resCountVersions = mysqli_query($GLOBALS['mysql_con'], $sqlCountVersions); if ($resCountVersions && mysqli_num_rows($resCountVersions) > 0) { $rowCountVersions = mysqli_fetch_assoc($resCountVersions); $versionCount = (int) $rowCountVersions['versionCount']; } else { $versionCount = 0; } // Anzahl Ansprechpartner ermitteln $sqlCountContacts = "SELECT COUNT(*) AS contactCount FROM knowledgecenter_post_contacts WHERE post_id = $postId"; $resCountContacts = mysqli_query($GLOBALS['mysql_con'], $sqlCountContacts); if ($resCountContacts && mysqli_num_rows($resCountContacts) > 0) { $row = mysqli_fetch_assoc($resCountContacts); $contactCount = (int) $row['contactCount']; } else { $contactCount = 0; } // Prüfe, ob ein spezieller Versionsparameter übergeben wurde if (isset($_GET['version']) && !empty($_GET['version'])) { $versionId = (int) $_GET['version']; // Versuche, die angeforderte Version zu laden – aber nur, wenn sie aktuell gültig ist: $sqlVersion = "SELECT kpv.*, mc.name AS author FROM knowledgecenter_post_versions AS kpv LEFT JOIN main_contact AS mc ON kpv.author_id = mc.id WHERE kpv.post_id = $postId AND kpv.language_id = $languageId AND kpv.id = $versionId LIMIT 1"; // var_dump($sqlVersion); $resVersion = mysqli_query($GLOBALS['mysql_con'], $sqlVersion); if ($resVersion && mysqli_num_rows($resVersion) > 0) { // Die angeforderte Version existiert und ist aktuell gültig $currentVersion = mysqli_fetch_assoc($resVersion); } else { // Die angeforderte Version ist entweder ungültig (z. B. noch in der Zukunft) oder existiert nicht // => Ladevorgang: Suche nach der neuesten gültigen Version $sqlVersion = "SELECT kpv.*, mc.name AS author FROM knowledgecenter_post_versions AS kpv LEFT JOIN main_contact AS mc ON kpv.author_id = mc.id WHERE kpv.post_id = $postId AND kpv.language_id = $languageId AND kpv.state = 1 AND (kpv.valid_from IS NULL OR kpv.valid_from <= NOW()) AND (kpv.valid_until IS NULL OR kpv.valid_until >= NOW()) ORDER BY kpv.version_number DESC LIMIT 1"; // var_dump($sqlVersion); $resVersion = mysqli_query($GLOBALS['mysql_con'], $sqlVersion); if ($resVersion && mysqli_num_rows($resVersion) > 0) { $currentVersion = mysqli_fetch_assoc($resVersion); } else { // Es gibt überhaupt keine aktuell gültige Version, also setze einen Standard-Platzhalter $currentVersion = [ 'id' => 0, 'title' => 'Keine gültige Version vorhanden', 'image' => '', 'teaser' => '', 'content' => '', 'version_number' => 0, 'created_at' => date("Y-m-d H:i:s"), 'author' => '' ]; } } } else { // Kein spezieller Versionsparameter übergeben – lade die neueste gültige Version $sqlVersion = "SELECT kpv.*, mc.name AS author FROM knowledgecenter_post_versions AS kpv LEFT JOIN main_contact AS mc ON kpv.author_id = mc.id WHERE kpv.post_id = $postId AND kpv.language_id = $languageId AND kpv.state = 1 AND (kpv.valid_from IS NULL OR kpv.valid_from <= NOW()) AND (kpv.valid_until IS NULL OR kpv.valid_until >= NOW()) ORDER BY kpv.version_number DESC LIMIT 1"; // var_dump($sqlVersion); $resVersion = mysqli_query($GLOBALS['mysql_con'], $sqlVersion); if ($resVersion && mysqli_num_rows($resVersion) > 0) { $currentVersion = mysqli_fetch_assoc($resVersion); } else { // Fallback: Falls keine aktuell gültige Version existiert, wird kein Draft geladen // (Alternativ kannst du hier einen Hinweis ausgeben) $currentVersion = [ 'id' => 0, 'title' => 'Keine gültige Version vorhanden', 'image' => '', 'teaser' => '', 'content' => '', 'version_number' => 0, 'created_at' => date("Y-m-d H:i:s"), 'author' => '' ]; } } } // Expose current post title to JS for setting the page H1 echo ""; // Alle Versionen für diesen Beitrag (absteigend sortiert) für die aktuell gewählte Sprache abrufen $sqlAllVersions = "SELECT kpv.*, mc.name AS author FROM knowledgecenter_post_versions AS kpv LEFT JOIN main_contact AS mc ON kpv.author_id = mc.id WHERE kpv.post_id = $postId AND kpv.language_id = $languageId ORDER BY kpv.version_number DESC"; $resAllVersions = mysqli_query($GLOBALS['mysql_con'], $sqlAllVersions); $versions = []; while ($v = mysqli_fetch_assoc($resAllVersions)) { $versions[] = $v; } // Lade translations für alle Sprachen: Für jede Sprache wird die neueste Version für diesen Beitrag geladen $translations = []; foreach ($allLanguages as $lang) { $langId = (int) $lang['id']; $sqlTrans = "SELECT * FROM knowledgecenter_post_versions WHERE post_id = $postId AND language_id = $langId ORDER BY version_number DESC LIMIT 1"; $resTrans = mysqli_query($GLOBALS['mysql_con'], $sqlTrans); if ($resTrans && mysqli_num_rows($resTrans) > 0) { $translations[$langId] = mysqli_fetch_assoc($resTrans); } else { $translations[$langId] = [ 'id' => 0, 'title' => '', 'image' => '', 'teaser' => '', 'content' => '', 'version_number' => 0, 'created_at' => '' ]; } } $linkedFormId = null; $sqlLinkedForm = "SELECT form_id FROM knowledgecenter_post_form WHERE post_id = $postId LIMIT 1"; $resLinkedForm = mysqli_query($GLOBALS['mysql_con'], $sqlLinkedForm); if ($resLinkedForm && mysqli_num_rows($resLinkedForm) > 0) { $rowLinkedForm = mysqli_fetch_assoc($resLinkedForm); $linkedFormId = (int) $rowLinkedForm['form_id']; } ?>
'; echo '
'; // Provide form id to the contactform module $sitepart_id = $linkedFormId; // Render the linked contact form require MODULE_PATH . 'contactform/show_contactform.inc.php'; echo '
'; } ?>
0 && file_exists($forumView)) { $knowledgecenter_post_id = $postId; require_once $forumView; } else { echo '

Diskussionsfunktion noch nicht verfügbar.

'; } ?>