From 955b4a1fc8f03eb6e98a920bdab0df8de3bbff24 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 7 Jul 2023 19:37:32 +0100 Subject: [PATCH] Fix forum index showing topics without view other topics permission --- modules/Forum/classes/Forum.php | 98 ++++++++++++++++-------- modules/Forum/pages/forum/view_forum.php | 2 +- 2 files changed, 66 insertions(+), 34 deletions(-) diff --git a/modules/Forum/classes/Forum.php b/modules/Forum/classes/Forum.php index 1c8b862457..7cdf4a57ef 100644 --- a/modules/Forum/classes/Forum.php +++ b/modules/Forum/classes/Forum.php @@ -62,7 +62,15 @@ public function listAllForums(array $groups = [0], int $user_id = 0): array { // Get discussion forums $forums = $this->_db->query( <<getAnySubforums($item->id, $groups, 0, true, $user_id); - $latest_post = [$item->last_post_date, $item->last_user_posted, $item->last_topic_posted]; + if ($item->view_other_topics) { + $latest_post = [$item->last_post_date, $item->last_user_posted, $item->last_topic_posted]; + } else { + $latest_post = $this->getLatestPostInOwnTopicForum($item->id, $user_id); + } if (count($subforums)) { $return[$forum->id]['subforums'][$item->id]->subforums = []; @@ -733,41 +745,18 @@ public function getAnySubforums( foreach ($subforums_query->results() as $result) { $to_add = new stdClass(); - $to_add->id = Output::getClean($result->id); + $to_add->id = $result->id; $to_add->forum_title = Output::getClean($result->forum_title); $to_add->icon = Output::getPurified($result->icon); $to_add->category = false; // Latest post - if ($onlyOwnTopics && $result->view_other_topics != '1') { - // Get the latest topic that the user can view - $latest_post = $this->_db->query( - <<id, $user_id] - ); - - if ($latest_post->count() && $latest_post = $latest_post->first()) { - $to_add->last_post_date = $latest_post->created ?? strtotime($latest_post->post_date); - $to_add->last_user_posted = $latest_post->post_creator; - $to_add->last_topic_posted = $latest_post->topic_id; - } + if ($onlyOwnTopics && $result->view_other_topics !== 1) { + [ + $to_add->last_post_date, + $to_add->last_user_posted, + $to_add->last_topic_posted, + ] = $this->getLatestPostInOwnTopicForum($result->id, $user_id); } else { $to_add->last_post_date = $result->last_post_date; $to_add->last_user_posted = $result->last_user_posted; @@ -776,7 +765,7 @@ public function getAnySubforums( $ret[] = $to_add; - $subforums = $this->getAnySubforums($result->id, $groups, ++$depth); + $subforums = $this->getAnySubforums($result->id, $groups, ++$depth, $onlyOwnTopics, $user_id); if (count($subforums)) { foreach ($subforums as $subforum) { @@ -808,4 +797,47 @@ public static function getAccessibleLabels(array $labels, array $user_groups): a return $prev; }, []); } + + /** + * Get the latest post in a "View own topic" forum + * This could be a topic created by the user, or a sticky topic + * + * @param int $forumId + * @param int $userId + * @return array|null Time of latest post, post creator ID, topic ID + */ + private function getLatestPostInOwnTopicForum(int $forumId, int $userId): ?array { + $latest_post = $this->_db->query( + <<count() && $latest_post = $latest_post->first()) { + return [ + $latest_post->created ?? strtotime($latest_post->post_date), + $latest_post->post_creator, + $latest_post->topic_id, + ]; + } + + return null; + } } diff --git a/modules/Forum/pages/forum/view_forum.php b/modules/Forum/pages/forum/view_forum.php index e8040fca3f..742a7abbf4 100644 --- a/modules/Forum/pages/forum/view_forum.php +++ b/modules/Forum/pages/forum/view_forum.php @@ -192,7 +192,7 @@ if ($forum->canViewOtherTopics($subforum->id, $user_groups)) { $latest_post = DB::getInstance()->query('SELECT * FROM nl2_topics WHERE forum_id = ? AND deleted = 0 ORDER BY topic_reply_date DESC', [$subforum->id])->results(); } else { - $latest_post = DB::getInstance()->query('SELECT * FROM nl2_topics WHERE forum_id = ? AND deleted = 0 AND topic_creator = ? ORDER BY topic_reply_date DESC', [$subforum->id, $user_id])->results(); + $latest_post = DB::getInstance()->query('SELECT * FROM nl2_topics WHERE forum_id = ? AND deleted = 0 AND (topic_creator = ? OR sticky = 1) ORDER BY topic_reply_date DESC', [$subforum->id, $user_id])->results(); } $subforum_topics = count($latest_post);