diff --git a/phpBB/includes/content_visibility.php b/phpBB/includes/content_visibility.php index 112780224f..fbcdf27f08 100644 --- a/phpBB/includes/content_visibility.php +++ b/phpBB/includes/content_visibility.php @@ -212,7 +212,7 @@ class phpbb_content_visibility update_post_information('forum', $forum_id, false); } } - else if (($is_starter || $is_latest) && $topic_id) + else if ($is_starter && $topic_id) { // ... so we need to use sync, if the first post is changed. // The forum is resynced recursive by sync() itself. diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php index bb8b02bbea..04c99b5e62 100644 --- a/phpBB/includes/functions_admin.php +++ b/phpBB/includes/functions_admin.php @@ -1889,6 +1889,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, GROUP BY t.topic_id, t.post_visibility"; $result = $db->sql_query($sql); + $topic_firstlast_data = array(); while ($row = $db->sql_fetchrow($result)) { $topic_id = (int) $row['topic_id']; @@ -1911,10 +1912,19 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, if ($row['post_visibility'] == ITEM_APPROVED) { + $topic_firstlast_data[$topic_id]['visibility'] = ITEM_APPROVED; $topic_data[$topic_id]['first_post_id'] = $row['first_post_id']; $topic_data[$topic_id]['last_post_id'] = $row['last_post_id']; $topic_data[$topic_id]['replies'] = $row['total_posts'] - 1; } + else if (!isset($topic_firstlast_data[$topic_id]['visibility']) || $topic_firstlast_data[$topic_id]['visibility'] != ITEM_APPROVED) + { + // If there is no approved post, we take the min/max of the other visibilities + // for the last and first post info, because it is only visible to moderators anyway + $topic_data[$topic_id]['first_post_id'] = (!empty($topic_data[$topic_id]['first_post_id'])) ? min($topic_data[$topic_id]['first_post_id'], $row['first_post_id']) : $row['first_post_id']; + $topic_data[$topic_id]['last_post_id'] = max($topic_data[$topic_id]['last_post_id'], $row['last_post_id']); + $topic_firstlast_data[$topic_id]['visibility'] = $row['post_visibility']; + } } } $db->sql_freeresult($result); diff --git a/tests/content_visibility/fixtures/set_post_visibility.xml b/tests/content_visibility/fixtures/set_post_visibility.xml index 3859d17955..6fec5c5ad1 100644 --- a/tests/content_visibility/fixtures/set_post_visibility.xml +++ b/tests/content_visibility/fixtures/set_post_visibility.xml @@ -24,6 +24,15 @@ 5 6 + + + 3 + 1 + 1 + Only 1 Approved posts + 8 + 8 + post_id @@ -89,6 +98,14 @@ 2Softdeleted + + 8 + 1 + 3 + 1 + 1 + Approved +
user_id diff --git a/tests/content_visibility/set_post_visibility_test.php b/tests/content_visibility/set_post_visibility_test.php index c488c648bc..0fc2f349c0 100644 --- a/tests/content_visibility/set_post_visibility_test.php +++ b/tests/content_visibility/set_post_visibility_test.php @@ -34,7 +34,7 @@ class phpbb_content_visibility_set_post_visibility_test extends phpbb_database_t array('post_id' => 3, 'post_visibility' => 2, 'post_delete_reason' => ''), ), array( - array('topic_visibility' => 1, 'topic_first_post_id' => '1', 'topic_last_post_id' => '2'), + array('topic_visibility' => 1, 'topic_first_post_id' => 1, 'topic_last_post_id' => 2), ), ), array( @@ -48,7 +48,21 @@ class phpbb_content_visibility_set_post_visibility_test extends phpbb_database_t array('post_id' => 3, 'post_visibility' => 1, 'post_delete_reason' => 'approve'), ), array( - array('topic_visibility' => 1, 'topic_first_post_id' => '2', 'topic_last_post_id' => '3'), + array('topic_visibility' => 1, 'topic_first_post_id' => 2, 'topic_last_post_id' => 3), + ), + ), + array( + ITEM_DELETED, + 2, 1, 1, + 2, time(), 'deleted', + true, true, + array( + array('post_id' => 1, 'post_visibility' => 0, 'post_delete_reason' => ''), + array('post_id' => 2, 'post_visibility' => 2, 'post_delete_reason' => 'deleted'), + array('post_id' => 3, 'post_visibility' => 2, 'post_delete_reason' => ''), + ), + array( + array('topic_visibility' => 0, 'topic_first_post_id' => 1, 'topic_last_post_id' => 3), ), ), array( @@ -63,7 +77,7 @@ class phpbb_content_visibility_set_post_visibility_test extends phpbb_database_t array('post_id' => 7, 'post_visibility' => 2, 'post_delete_reason' => ''), ), array( - array('topic_visibility' => 1, 'topic_first_post_id' => '6', 'topic_last_post_id' => '6'), + array('topic_visibility' => 1, 'topic_first_post_id' => 6, 'topic_last_post_id' => 6), ), ), array( @@ -73,12 +87,36 @@ class phpbb_content_visibility_set_post_visibility_test extends phpbb_database_t false, true, array( array('post_id' => 4, 'post_visibility' => 0, 'post_delete_reason' => ''), - array('post_id' => 5, 'post_visibility' => 1, 'post_delete_reason' => 'deleted'), + array('post_id' => 5, 'post_visibility' => 1, 'post_delete_reason' => ''), array('post_id' => 6, 'post_visibility' => 2, 'post_delete_reason' => 'deleted'), array('post_id' => 7, 'post_visibility' => 2, 'post_delete_reason' => ''), ), array( - array('topic_visibility' => 1, 'topic_first_post_id' => '5', 'topic_last_post_id' => '5'), + array('topic_visibility' => 1, 'topic_first_post_id' => 5, 'topic_last_post_id' => 5), + ), + ), + array( + ITEM_DELETED, + 8, 3, 1, + 2, time(), 'deleted', + true, true, + array( + array('post_id' => 8, 'post_visibility' => 2, 'post_delete_reason' => 'deleted'), + ), + array( + array('topic_visibility' => 2, 'topic_first_post_id' => 8, 'topic_last_post_id' => 8), + ), + ), + array( + ITEM_UNAPPROVED, + 8, 3, 1, + 2, time(), 'unapproved', + true, true, + array( + array('post_id' => 8, 'post_visibility' => 0, 'post_delete_reason' => 'unapproved'), + ), + array( + array('topic_visibility' => 0, 'topic_first_post_id' => 8, 'topic_last_post_id' => 8), ), ), );