The code to mark a forum read VS the code to mark all forums read. Not sure where the problem lies in the first one that the second ensures that works.
* Mark a particular forum as read.
*
* @param int The forum ID
*/
function mark_forum_read($fid)
{
global $mybb, $db;
// Can only do "true" tracking for registered users
if($mybb->settings['threadreadcut'] > 0 && $mybb->user['uid'])
{
// Experimental setting to mark parent forums as read
$forums_to_read = array();
if($mybb->settings['readparentforums'])
{
$ignored_forums = array();
$forums = array_reverse(explode(",", get_parent_list($fid)));
unset($forums[0]);
if(!empty($forums))
{
$ignored_forums[] = $fid;
foreach($forums as $forum)
{
$fids = array($forum);
$ignored_forums[] = $forum;
$children = explode(",", get_parent_list($forum));
foreach($children as $child)
{
if(in_array($child, $ignored_forums))
{
continue;
}
$fids[] = $child;
$ignored_forums[] = $child;
}
if(fetch_unread_count(implode(",", $fids)) == 0)
{
$forums_to_read[] = $forum;
}
}
}
}
switch($db->type)
{
case "pgsql":
case "sqlite":
add_shutdown(array($db, "replace_query"), array("forumsread", array('fid' => $fid, 'uid' => $mybb->user['uid'], 'dateline' => TIME_NOW), array("fid", "uid")));
if(!empty($forums_to_read))
{
foreach($forums_to_read as $forum)
{
add_shutdown(array($db, "replace_query"), array("forumsread", array('fid' => $forum, 'uid' => $mybb->user['uid'], 'dateline' => TIME_NOW), array('fid', 'uid')));
}
}
break;
default:
$child_sql = '';
if(!empty($forums_to_read))
{
foreach($forums_to_read as $forum)
{
$child_sql .= ", ('{$forum}', '{$mybb->user['uid']}', '".TIME_NOW."')";
}
}
$db->shutdown_query("
REPLACE INTO ".TABLE_PREFIX."forumsread (fid, uid, dateline)
VALUES('{$fid}', '{$mybb->user['uid']}', '".TIME_NOW."'){$child_sql}
");
}
// START - Unread posts MOD
$forums_to_read[] = $fid;
$fids = implode(',', $forums_to_read);
$db->query("DELETE TTR.*
FROM " . TABLE_PREFIX . "threadsread AS TTR
INNER JOIN " . TABLE_PREFIX . "threads AS TT ON TT.tid = TTR.tid
WHERE TTR.uid = '" . $mybb->user['uid'] . "' AND TT.fid IN (" . $fids . ")");
// END - Unread posts MOD
}
// Mark in a cookie
else
{
my_set_array_cookie("forumread", $fid, TIME_NOW, -1);
}
}
/**
* Marks all forums as read.
*
*/
function mark_all_forums_read()
{
global $mybb, $db, $cache;
// Can only do "true" tracking for registered users
if($mybb->user['uid'] > 0)
{
$db->update_query("users", array('lastvisit' => TIME_NOW), "uid='".$mybb->user['uid']."'");
require_once MYBB_ROOT."inc/functions_user.php";
update_pm_count('', 2);
if($mybb->settings['threadreadcut'] > 0)
{
// Need to loop through all forums and mark them as read
$forums = $cache->read('forums');
$update_count = ceil(count($forums)/20);
if($update_count < 15)
{
$update_count = 15;
}
$mark_query = '';
$done = 0;
foreach(array_keys($forums) as $fid)
{
switch($db->type)
{
case "pgsql":
case "sqlite":
$mark_query[] = array('fid' => $fid, 'uid' => $mybb->user['uid'], 'dateline' => TIME_NOW);
break;
default:
if($mark_query != '')
{
$mark_query .= ',';
}
$mark_query .= "('{$fid}', '{$mybb->user['uid']}', '".TIME_NOW."')";
}
++$done;
// Only do this in loops of $update_count, save query time
if($done % $update_count)
{
switch($db->type)
{
case "pgsql":
case "sqlite":
foreach($mark_query as $replace_query)
{
add_shutdown(array($db, "replace_query"), array("forumsread", $replace_query, array("fid", "uid")));
}
$mark_query = array();
break;
default:
$db->shutdown_query("
REPLACE INTO ".TABLE_PREFIX."forumsread (fid, uid, dateline)
VALUES {$mark_query}
");
$mark_query = '';
}
}
}
if($mark_query != '')
{
switch($db->type)
{
case "pgsql":
case "sqlite":
foreach($mark_query as $replace_query)
{
add_shutdown(array($db, "replace_query"), array("forumsread", $replace_query, array("fid", "uid")));
}
break;
default:
$db->shutdown_query("
REPLACE INTO ".TABLE_PREFIX."forumsread (fid, uid, dateline)
VALUES {$mark_query}
");
}
}
}
}
else
{
my_setcookie("mybb[readallforums]", 1);
my_setcookie("mybb[lastvisit]", TIME_NOW);
my_unsetcookie("mybb[threadread]");
my_unsetcookie("mybb[forumread]");
}
}