authInfo->userInfo; $currentUserId = $currentUser === null ? '0' : $currentUser->id; if($mode === 'mark') { if(!$msz->authInfo->isLoggedIn) Template::throwError(403); $categoryId = filter_input(INPUT_GET, 'f', FILTER_SANITIZE_NUMBER_INT); if($_SERVER['REQUEST_METHOD'] === 'POST' && CSRF::validateRequest()) { $categoryInfos = $categoryId === null ? $msz->forumCtx->categories->getCategories() : $msz->forumCtx->categories->getCategoryChildren(parentInfo: $categoryId, includeSelf: true); foreach($categoryInfos as $categoryInfo) { $perms = $msz->authInfo->getPerms('forum', $categoryInfo); if($perms->check(Perm::F_CATEGORY_LIST)) $msz->forumCtx->categories->updateUserReadCategory($userInfo, $categoryInfo); } Tools::redirect($msz->urls->format($categoryId ? 'forum-category' : 'forum-index', ['forum' => $categoryId])); return; } Template::render('confirm', [ 'title' => 'Mark forum as read', 'message' => 'Are you sure you want to mark ' . ($categoryId < 1 ? 'the entire' : 'this') . ' forum as read?', 'return' => $msz->urls->format($categoryId ? 'forum-category' : 'forum-index', ['forum' => $categoryId]), 'params' => [ 'forum' => $categoryId, ] ]); return; } if($mode !== '') Template::throwError(404); $categories = $msz->forumCtx->categories->getCategories(hidden: false, asTree: true); foreach($categories as $categoryId => $category) { $perms = $msz->authInfo->getPerms('forum', $category->info); if(!$perms->check(Perm::F_CATEGORY_LIST)) { unset($categories[$categoryId]); continue; } $unread = false; if($category->info->mayHaveChildren) foreach($category->children as $childId => $child) { $childPerms = $msz->authInfo->getPerms('forum', $child->info); if(!$childPerms->check(Perm::F_CATEGORY_LIST)) { unset($category->children[$childId]); continue; } $childUnread = false; if($category->info->isListing) { if($child->info->mayHaveChildren) { foreach($child->children as $grandChildId => $grandChild) { $grandChildPerms = $msz->authInfo->getPerms('forum', $grandChild->info); if(!$grandChildPerms->check(Perm::F_CATEGORY_LIST)) { unset($child->children[$grandChildId]); continue; } $grandChildUnread = false; if($grandChild->info->mayHaveTopics) { $catIds = [$grandChild->info->id]; foreach($grandChild->childIds as $greatGrandChildId) { $greatGrandChildPerms = $msz->authInfo->getPerms('forum', $greatGrandChildId); if($greatGrandChildPerms->check(Perm::F_CATEGORY_LIST)) $catIds[] = $greatGrandChildId; } $grandChildUnread = $msz->forumCtx->categories->checkCategoryUnread($catIds, $currentUser); if($grandChildUnread) $childUnread = true; } $grandChild->perms = $grandChildPerms; $grandChild->unread = $grandChildUnread; } } if($child->info->mayHaveChildren || $child->info->mayHaveTopics) { $catIds = [$child->info->id]; foreach($child->childIds as $grandChildId) { $grandChildPerms = $msz->authInfo->getPerms('forum', $grandChildId); if($grandChildPerms->check(Perm::F_CATEGORY_LIST)) $catIds[] = $grandChildId; } try { $lastPostInfo = $msz->forumCtx->posts->getPost(categoryInfos: $catIds, getLast: true, deleted: false); } catch(RuntimeException $ex) { $lastPostInfo = null; } if($lastPostInfo !== null) { $child->lastPost = new stdClass; $child->lastPost->info = $lastPostInfo; $child->lastPost->topicInfo = $msz->forumCtx->topics->getTopic(postInfo: $lastPostInfo); if($lastPostInfo->userId !== null) { $child->lastPost->user = $msz->usersCtx->getUserInfo($lastPostInfo->userId); $child->lastPost->colour = $msz->usersCtx->getUserColour($child->lastPost->user); } } } } if($child->info->mayHaveTopics && !$childUnread) { $childUnread = $msz->forumCtx->categories->checkCategoryUnread($child->info, $currentUser); if($childUnread) $unread = true; } $child->perms = $childPerms; $child->unread = $childUnread; } if($category->info->mayHaveTopics && !$unread) $unread = $msz->forumCtx->categories->checkCategoryUnread($category->info, $currentUser); if(!$category->info->isListing) { if(!array_key_exists('0', $categories)) { $categories['0'] = $root = new stdClass; $root->info = null; $root->perms = 0; $root->unread = false; $root->colour = null; $root->children = []; } $categories['0']->children[$categoryId] = $category; unset($categories[$categoryId]); if($category->info->mayHaveChildren || $category->info->mayHaveTopics) { $catIds = [$category->info->id]; foreach($category->childIds as $childId) { $childPerms = $msz->authInfo->getPerms('forum', $childId); if($childPerms->check(Perm::F_CATEGORY_LIST)) $catIds[] = $childId; } try { $lastPostInfo = $msz->forumCtx->posts->getPost(categoryInfos: $catIds, getLast: true, deleted: false); } catch(RuntimeException $ex) { $lastPostInfo = null; } if($lastPostInfo !== null) { $category->lastPost = new stdClass; $category->lastPost->info = $lastPostInfo; $category->lastPost->topicInfo = $msz->forumCtx->topics->getTopic(postInfo: $lastPostInfo); if($lastPostInfo->userId !== null) { $category->lastPost->user = $msz->usersCtx->getUserInfo($lastPostInfo->userId); $category->lastPost->colour = $msz->usersCtx->getUserColour($category->lastPost->user); } } } } $category->perms = $perms; $category->unread = $unread; } Template::render('forum.index', [ 'forum_categories' => $categories, 'forum_empty' => empty($categories), 'forum_show_mark_as_read' => $currentUser !== null, ]);