From 63d11c976b0bcef68ce4809c8c76124451df88ea Mon Sep 17 00:00:00 2001
From: Joas Schilling <nickvergessen@gmx.de>
Date: Fri, 5 Oct 2012 12:37:01 +0200
Subject: [feature/soft-delete] Fix sync('topic') to match the new logic

This also fixes set_post_visibility()

PHPBB3-9567
---
 phpBB/includes/content_visibility.php |  2 +-
 phpBB/includes/functions_admin.php    | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

(limited to 'phpBB/includes')

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);
-- 
cgit v1.2.1