feat(wiki): Beitragsliste für Betriebsrat-Nutzer auf zugängliche Kategorien filtern

BR-Nutzer (r-wiki-br ohne r-wiki) sehen in der Beitragsliste und im
Kategorie-Dropdown nur Beiträge und Kategorien, die ihren freigegebenen
Kategorien (betriebsrat_editable=1 + alle Nachfahren per BFS) zugeordnet sind.

Der Filter wird server-seitig in post_listform.php berechnet und als Parameter
an den Ajax-Endpunkt übergeben, da get_permission_state() im Ajax-Kontext
nicht verfügbar ist.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-29 10:07:48 +02:00
parent 5da7916651
commit 60eea92f11
4 changed files with 152 additions and 27 deletions

View File

@@ -867,6 +867,39 @@ function require_wiki_edit_permission(): void
}
}
// Gibt alle Kategorie-IDs zurück, auf die Betriebsrat Zugriff hat:
// direkt betriebsrat_editable=1 sowie alle ihre Nachfahren im Baum (BFS nach unten).
function get_all_betriebsrat_accessible_category_ids(): array
{
$seeds = [];
$res = mysqli_query($GLOBALS['mysql_con'],
"SELECT id FROM knowledgecenter_categories_update WHERE betriebsrat_editable = 1");
while ($row = mysqli_fetch_assoc($res)) {
$seeds[] = (int)$row['id'];
}
if (empty($seeds)) {
return [];
}
$visited = [];
$queue = $seeds;
while (!empty($queue)) {
$current = array_shift($queue);
if (isset($visited[$current])) {
continue;
}
$visited[$current] = true;
$cRes = mysqli_query($GLOBALS['mysql_con'],
"SELECT child_category_id FROM knowledgecenter_category_links WHERE parent_category_id = $current");
while ($cRow = mysqli_fetch_assoc($cRes)) {
$cid = (int)$cRow['child_category_id'];
if (!isset($visited[$cid])) {
$queue[] = $cid;
}
}
}
return array_keys($visited);
}
// Prüft ob eine Kategorie (oder irgendein Vorfahre über knowledgecenter_category_links)
// betriebsrat_editable=1 hat. Läuft den Baum nach oben durch.
function is_category_betriebsrat_editable(int $categoryId): bool