mirror of
https://github.com/phpbb/phpbb.git
synced 2025-08-06 08:47:45 +02:00
Fix bug #46765 - View unread posts
Authorised by: AcydBurn git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9755 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
@@ -3896,6 +3896,7 @@ function page_header($page_title = '', $display_online_list = true)
|
||||
'U_SEARCH_SELF' => append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=egosearch'),
|
||||
'U_SEARCH_NEW' => append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=newposts'),
|
||||
'U_SEARCH_UNANSWERED' => append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=unanswered'),
|
||||
'U_SEARCH_UNREAD' => append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=unreadposts'),
|
||||
'U_SEARCH_ACTIVE_TOPICS'=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=active_topics'),
|
||||
'U_DELETE_COOKIES' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=delete_cookies'),
|
||||
'U_TEAM' => ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile')) ? '' : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=leaders'),
|
||||
@@ -4119,4 +4120,94 @@ function phpbb_user_session_handler()
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get list of unread topics
|
||||
* only for registered users and non-cookie tracking this function is used
|
||||
*/
|
||||
function get_unread_topics_list($user_id = false, $sql_extra = '')
|
||||
{
|
||||
global $config, $db, $user;
|
||||
|
||||
if($user_id === false)
|
||||
{
|
||||
$user_id = $user->data['user_id'];
|
||||
}
|
||||
|
||||
$tracked_topics_list = $unread_topics_list = $read_topics_list = array();
|
||||
$tracked_forums_list = array();
|
||||
|
||||
if ($config['load_db_lastread'] && $user->data['is_registered'])
|
||||
{
|
||||
// List of the tracked forums (not ideal, hope the better way will be found)
|
||||
// This list is to fetch later the forums user never read (fully) before
|
||||
$sql = 'SELECT forum_id FROM ' . FORUMS_TRACK_TABLE . "
|
||||
WHERE user_id = {$user_id}";
|
||||
$result = $db->sql_query($sql);
|
||||
while($row = $db->sql_fetchrow($result))
|
||||
{
|
||||
$tracked_forums_list[] = $row['forum_id'];
|
||||
}
|
||||
$db->sql_freeresult($result);
|
||||
|
||||
// Get list of the unread topics - on topics tracking as the first step
|
||||
$sql = 'SELECT t.topic_id, t.topic_last_post_time, tt.mark_time FROM ' . TOPICS_TABLE . ' t, ' . TOPICS_TRACK_TABLE . " tt
|
||||
WHERE t.topic_id = tt.topic_id
|
||||
AND t.topic_last_post_time >= tt.mark_time
|
||||
AND tt.user_id = {$user_id}
|
||||
$sql_extra";
|
||||
$result = $db->sql_query($sql);
|
||||
while($row = $db->sql_fetchrow($result))
|
||||
{
|
||||
if($row['topic_last_post_time'] == $row['mark_time'])
|
||||
{
|
||||
// Check if there're read topics for the forums having unread ones
|
||||
$read_topics_list[$row['topic_id']] = $row['mark_time'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$unread_topics_list[$row['topic_id']] = $row['mark_time'];
|
||||
}
|
||||
}
|
||||
$db->sql_freeresult($result);
|
||||
|
||||
// Get the full list of the tracked topics
|
||||
$tracked_topics_list = array_merge(array_keys($unread_topics_list), array_keys($read_topics_list));
|
||||
|
||||
// Get list of the unread topics - on forums tracking as the second step
|
||||
// We don't take in account topics tracked before
|
||||
$sql = 'SELECT t.topic_id, ft.mark_time FROM ' . TOPICS_TABLE . ' t, ' . FORUMS_TRACK_TABLE . ' ft
|
||||
WHERE t.forum_id = ft.forum_id
|
||||
AND t.topic_last_post_time > ft.mark_time
|
||||
AND ' . $db->sql_in_set('t.topic_id', $tracked_topics_list, true, true) . "
|
||||
AND ft.user_id = {$user_id}
|
||||
$sql_extra";
|
||||
$result = $db->sql_query($sql);
|
||||
while($row = $db->sql_fetchrow($result))
|
||||
{
|
||||
$unread_topics_list[$row['topic_id']] = $row['mark_time'];
|
||||
}
|
||||
$db->sql_freeresult($result);
|
||||
|
||||
// And the last step - find unread topics were not found before (that can mean a user has never read some forums)
|
||||
$sql = 'SELECT topic_id FROM ' . TOPICS_TABLE . "
|
||||
WHERE topic_last_post_time > {$user->data['user_lastmark']}
|
||||
AND " . $db->sql_in_set('topic_id', array_keys($unread_topics_list), true, true) . '
|
||||
AND ' . $db->sql_in_set('forum_id', $tracked_forums_list, true, true) . "
|
||||
$sql_extra";
|
||||
$result = $db->sql_query_limit($sql, 1000);
|
||||
while($row = $db->sql_fetchrow($result))
|
||||
{
|
||||
$unread_topics_list[$row['topic_id']] = $user->data['user_lastmark'];
|
||||
}
|
||||
$db->sql_freeresult($result);
|
||||
}
|
||||
else if ($config['load_anon_lastread'] || $user->data['is_registered'])
|
||||
{
|
||||
// We do not implement unread topics list for cookie based tracking
|
||||
// because it would require expensive database queries
|
||||
}
|
||||
|
||||
return $unread_topics_list;
|
||||
}
|
||||
|
||||
?>
|
Reference in New Issue
Block a user