aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes/functions.php
diff options
context:
space:
mode:
Diffstat (limited to 'phpBB/includes/functions.php')
-rw-r--r--phpBB/includes/functions.php569
1 files changed, 404 insertions, 165 deletions
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index 4daab71c90..477a7f7ac3 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -473,196 +473,419 @@ function watch_topic_forum($mode, &$s_watching, &$s_watching_img, $user_id, $mat
}
/**
-* Marks a topic or form as read
+* Marks a topic/forum as read
+* Marks a topic as posted to
*/
-function markread($mode, $forum_id = 0, $topic_id = 0, $marktime = false)
+function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0)
{
- global $config, $db, $user;
-
- if (!$user->data['is_registered'])
+ global $db, $user, $config;
+
+ if ($mode == 'all')
{
+ if ($forum_id === false || !sizeof($forum_id))
+ {
+ if ($config['load_db_lastread'] && $user->data['is_registered'])
+ {
+ // Mark all forums read (index page)
+ $db->sql_query('DELETE FROM ' . TOPICS_TRACK_TABLE . " WHERE user_id = {$user->data['user_id']}");
+ $db->sql_query('DELETE FROM ' . FORUMS_TRACK_TABLE . " WHERE user_id = {$user->data['user_id']}");
+ $db->sql_query('UPDATE ' . USERS_TABLE . ' SET user_lastmark = ' . time() . " WHERE user_id = {$user->data['user_id']}");
+ }
+ else
+ {
+ $tracking = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? unserialize(stripslashes($_COOKIE[$config['cookie_name'] . '_track'])) : array();
+
+ unset($tracking['tf']);
+ unset($tracking['t']);
+ unset($tracking['f']);
+ $tracking['l'] = base_convert(time() - $config['board_startdate'], 10, 36);
+
+ $user->set_cookie('track', serialize($tracking), time() + 31536000);
+ unset($tracking);
+ }
+ }
+
return;
}
-
- if (!is_array($forum_id))
+ else if ($mode == 'topics')
{
- $forum_id = array($forum_id);
- }
+ // Mark all topics in forums read
+ if (!is_array($forum_id))
+ {
+ $forum_id = array($forum_id);
+ }
- // Default tracking type
- $type = TRACK_NORMAL;
- $current_time = ($marktime) ? $marktime : time();
- $topic_id = (int) $topic_id;
+ // Add 0 to forums array to mark global announcements correctly
+ $forum_id[] = 0;
- switch ($mode)
- {
- case 'mark':
- if ($config['load_db_lastread'])
+ if ($config['load_db_lastread'] && $user->data['is_registered'])
+ {
+ $db->sql_query('DELETE FROM ' . TOPICS_TRACK_TABLE . "
+ WHERE user_id = {$user->data['user_id']}
+ AND forum_id IN (" . implode(', ', $forum_id) . ")");
+
+ $sql = 'SELECT forum_id
+ FROM ' . FORUMS_TRACK_TABLE . "
+ WHERE user_id = {$user->data['user_id']}
+ AND forum_id IN (" . implode(', ', $forum_id) . ')';
+ $result = $db->sql_query($sql);
+
+ $sql_update = array();
+ while ($row = $db->sql_fetchrow($result))
{
- $sql = 'SELECT forum_id
- FROM ' . FORUMS_TRACK_TABLE . '
- WHERE user_id = ' . $user->data['user_id'] . '
- AND forum_id IN (' . implode(', ', array_map('intval', $forum_id)) . ')';
- $result = $db->sql_query($sql);
+ $sql_update[] = $row['forum_id'];
+ }
+ $db->sql_freeresult($result);
+
+ if (sizeof($sql_update))
+ {
+ $sql = 'UPDATE ' . FORUMS_TRACK_TABLE . '
+ SET mark_time = ' . time() . "
+ WHERE user_id = {$user->data['user_id']}
+ AND forum_id IN (" . implode(', ', $sql_update) . ')';
+ $db->sql_query($sql);
+ }
- $sql_update = array();
- while ($row = $db->sql_fetchrow($result))
+ if ($sql_insert = array_diff($forum_id, $sql_update))
+ {
+ $sql_ary = array();
+ foreach ($sql_insert as $f_id)
{
- $sql_update[] = $row['forum_id'];
+ $sql_ary[] = array(
+ 'user_id' => $user->data['user_id'],
+ 'forum_id' => $f_id,
+ 'mark_time' => time()
+ );
}
- $db->sql_freeresult($result);
- if (sizeof($sql_update))
+ if (sizeof($sql_ary))
{
- $sql = 'UPDATE ' . FORUMS_TRACK_TABLE . "
- SET mark_time = $current_time
- WHERE user_id = " . $user->data['user_id'] . '
- AND forum_id IN (' . implode(', ', $sql_update) . ')';
- $db->sql_query($sql);
+ $db->sql_query('INSERT INTO ' . FORUMS_TRACK_TABLE . ' ' . $db->sql_build_array('MULTI_INSERT', $sql_ary));
+ }
+ }
+ }
+ else
+ {
+ $tracking = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? unserialize(stripslashes($_COOKIE[$config['cookie_name'] . '_track'])) : array();
- $sql = 'DELETE FROM ' . TOPICS_TRACK_TABLE . '
- WHERE user_id = ' . $user->data['user_id'] . '
- AND forum_id IN (' . implode(', ', $sql_update) . ')
- AND mark_type = ' . TRACK_NORMAL;
- $db->sql_query($sql);
+ foreach ($forum_id as $f_id)
+ {
+ $topic_ids36 = (isset($tracking['tf'][$f_id])) ? $tracking['tf'][$f_id] : array();
+
+ unset($tracking['tf'][$f_id]);
+ foreach ($topic_ids36 as $topic_id36)
+ {
+ unset($tracking['t'][$topic_id36]);
}
+ unset($tracking['f'][$f_id]);
+ $tracking['f'][$f_id] = base_convert(time() - $config['board_startdate'], 10, 36);
+ }
- if ($sql_insert = array_diff($forum_id, $sql_update))
+ $user->set_cookie('track', serialize($tracking), time() + 31536000);
+ unset($tracking);
+ }
+
+ return;
+ }
+ else if ($mode == 'topic')
+ {
+ if ($topic_id === false || $forum_id === false)
+ {
+ return;
+ }
+
+ if ($config['load_db_lastread'] && $user->data['is_registered'])
+ {
+ $sql = 'UPDATE ' . TOPICS_TRACK_TABLE . '
+ SET mark_time = ' . (($post_time) ? $post_time : time()) . "
+ WHERE user_id = {$user->data['user_id']}
+ AND topic_id = $topic_id";
+ $db->sql_query($sql);
+
+ // insert row
+ if (!$db->sql_affectedrows())
+ {
+ $db->sql_return_on_error(true);
+
+ $sql_ary = array(
+ 'user_id' => $user->data['user_id'],
+ 'topic_id' => $topic_id,
+ 'forum_id' => (int) $forum_id,
+ 'mark_time' => ($post_time) ? $post_time : time(),
+ );
+
+ $db->sql_query('INSERT INTO ' . TOPICS_TRACK_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
+
+ $db->sql_return_on_error(false);
+ }
+ }
+ else
+ {
+ $tracking = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? unserialize(stripslashes($_COOKIE[$config['cookie_name'] . '_track'])) : array();
+
+ $topic_id36 = base_convert($topic_id, 10, 36);
+
+ if (!isset($tracking['t'][$topic_id36]))
+ {
+ $tracking['tf'][$forum_id][$topic_id36] = true;
+ }
+
+ $post_time = ($post_time) ? $post_time : time();
+ $tracking['t'][$topic_id36] = base_convert($post_time - $config['board_startdate'], 10, 36);
+
+ // If the cookie grows larger than 5000 characters we will remove the smallest value
+ if (isset($_COOKIE[$config['cookie_name'] . '_track']) && strlen($_COOKIE[$config['cookie_name'] . '_track']) > 5000)
+ {
+// echo 'Cookie grown too large' . print_r($tracking, true);
+
+ $min_value = min($tracking['t']);
+ $m_tkey = array_search($min_value, $t_ary);
+ unset($tracking['t'][$m_tkey]);
+
+ foreach ($tracking['tf'] as $f_id => $topic_id_ary)
{
- foreach ($sql_insert as $forum_id)
+ if (in_array($m_tkey, array_keys($topic_id_ary)))
{
- $sql = '';
- switch (SQL_LAYER)
- {
- case 'mysql':
- $sql .= (($sql != '') ? ', ' : '') . '(' . $user->data['user_id'] . ", $forum_id, $current_time)";
- $sql = 'VALUES ' . $sql;
- break;
-
- case 'mysql4':
- case 'mysqli':
- case 'mssql':
- case 'mssql_odbc':
- case 'sqlite':
- $sql .= (($sql != '') ? ' UNION ALL ' : '') . ' SELECT ' . $user->data['user_id'] . ", $forum_id, $current_time";
- break;
-
- default:
- $sql = 'INSERT INTO ' . FORUMS_TRACK_TABLE . ' (user_id, forum_id, mark_time)
- VALUES (' . $user->data['user_id'] . ", $forum_id, $current_time)";
- $db->sql_query($sql);
- $sql = '';
- }
-
- if ($sql)
- {
- $sql = 'INSERT INTO ' . FORUMS_TRACK_TABLE . " (user_id, forum_id, mark_time) $sql";
- $db->sql_query($sql);
- }
-
- $sql = 'DELETE FROM ' . TOPICS_TRACK_TABLE . '
- WHERE user_id = ' . $user->data['user_id'] . '
- AND forum_id = ' . $forum_id . '
- AND mark_type = ' . TRACK_NORMAL;
- $db->sql_query($sql);
+ unset($tracking['tf'][$f_id][$m_tkey]);
+ break;
}
}
- unset($sql_update);
- unset($sql_insert);
}
- else
+
+ $user->set_cookie('track', serialize($tracking), time() + 31536000);
+ }
+
+ return;
+ }
+ else if ($mode == 'post')
+ {
+ if ($topic_id === false)
+ {
+ return;
+ }
+
+ $db->sql_return_on_error(true);
+
+ $sql_ary = array(
+ 'user_id' => $user->data['user_id'],
+ 'topic_id' => $topic_id,
+ 'topic_posted' => 1
+ );
+
+ $db->sql_query('INSERT INTO ' . TOPICS_POSTED_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
+
+ $db->sql_return_on_error(false);
+
+ return;
+ }
+}
+
+/**
+* Get topic tracking info by using already fetched info
+*/
+function get_topic_tracking($forum_id, $topic_ids, &$rowset, $forum_mark_time, $global_announce_list = false)
+{
+ global $config, $user;
+
+ $last_read = array();
+
+ if (!is_array($topic_ids))
+ {
+ $topic_ids = array($topic_ids);
+ }
+
+ foreach ($topic_ids as $topic_id)
+ {
+ if (!empty($rowset[$topic_id]['mark_time']))
+ {
+ $last_read[$topic_id] = $rowset[$topic_id]['mark_time'];
+ }
+ }
+
+ $topic_ids = array_diff($topic_ids, array_keys($last_read));
+
+ if (sizeof($topic_ids))
+ {
+ $mark_time = array();
+
+ // Get global announcement info
+ if ($global_announce_list && sizeof($global_announce_list))
+ {
+ if (!isset($forum_mark_time[0]))
{
- $tracking = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? unserialize(stripslashes($_COOKIE[$config['cookie_name'] . '_track'])) : array();
+ global $db;
- foreach ($forum_id as $f_id)
+ $sql = 'SELECT mark_time
+ FROM ' . FORUMS_TRACK_TABLE . "
+ WHERE user_id = {$user->data['user_id']}
+ AND forum_id = 0";
+ $result = $db->sql_query($sql);
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+
+ if ($row)
{
- unset($tracking[$f_id]);
- $tracking[$f_id][0] = base_convert($current_time - $config['board_startdate'], 10, 36);
+ $mark_time[0] = $row['mark_time'];
}
-
- $user->set_cookie('track', serialize($tracking), time() + 31536000);
- unset($tracking);
}
- break;
+ else
+ {
+ if ($forum_mark_time[0] !== false)
+ {
+ $mark_time[0] = $forum_mark_time[0];
+ }
+ }
+ }
- case 'post':
- // Mark a topic as read and mark it as a topic where the user has made a post.
- $type = TRACK_POSTED;
+ if (!empty($forum_mark_time[$forum_id]) && $forum_mark_time[$forum_id] !== false)
+ {
+ $mark_time[$forum_id] = $forum_mark_time[$forum_id];
+ }
+
+ $user_lastmark = (isset($mark_time[$forum_id])) ? $mark_time[$forum_id] : $user->data['user_lastmark'];
- case 'topic':
- if (!isset($type))
+ foreach ($topic_ids as $topic_id)
+ {
+ if ($global_announce_list && isset($global_announce_list[$topic_id]))
+ {
+ $last_read[$topic_id] = (isset($mark_time[0])) ? $mark_time[0] : $user_lastmark;
+ }
+ else
{
- $type = TRACK_NORMAL;
+ $last_read[$topic_id] = $user_lastmark;
}
+ }
+ }
+
+ return $last_read;
+}
+
+/**
+* Get topic tracking info from db (for cookie based tracking only this function is used)
+*/
+function get_complete_topic_tracking($forum_id, $topic_ids, $global_announce_list = false)
+{
+ global $config, $user;
+
+ $last_read = array();
+
+ if (!is_array($topic_ids))
+ {
+ $topic_ids = array($topic_ids);
+ }
+
+ if ($config['load_db_lastread'] && $user->data['is_registered'])
+ {
+ global $db;
+
+ $sql = 'SELECT topic_id, mark_time
+ FROM ' . TOPICS_TRACK_TABLE . "
+ WHERE user_id = {$user->data['user_id']}
+ AND topic_id IN (" . implode(', ', $topic_ids) . ")";
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $last_read[$row['topic_id']] = $row['mark_time'];
+ }
+ $db->sql_freeresult($result);
+
+ $topic_ids = array_diff($topic_ids, array_keys($last_read));
+
+ if (sizeof($topic_ids))
+ {
+ $sql = 'SELECT forum_id, mark_time
+ FROM ' . FORUMS_TRACK_TABLE . "
+ WHERE user_id = {$user->data['user_id']}
+ AND forum_id " .
+ (($global_announce_list && sizeof($global_announce_list)) ? "IN (0, $forum_id)" : "= $forum_id");
+ $result = $db->sql_query($sql);
- $forum_id = (int) $forum_id[0];
+ $mark_time = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $mark_time[$row['forum_id']] = $row['mark_time'];
+ }
+ $db->sql_freeresult($result);
+
+ $user_lastmark = (isset($mark_time[$forum_id])) ? $mark_time[$forum_id] : $user->data['user_lastmark'];
- /// Mark a topic as read
- if ($config['load_db_lastread'] || ($config['load_db_track'] && $type == TRACK_POSTED))
+ foreach ($topic_ids as $topic_id)
{
- $track_type = ($type == TRACK_POSTED) ? ', mark_type = ' . $type : '';
- $sql = 'UPDATE ' . TOPICS_TRACK_TABLE . "
- SET forum_id = $forum_id, mark_time = $current_time $track_type
- WHERE topic_id = $topic_id
- AND user_id = {$user->data['user_id']}
- AND mark_time < $current_time";
- if (!$db->sql_query($sql) || !$db->sql_affectedrows())
+ if ($global_announce_list && isset($global_announce_list[$topic_id]))
{
- $db->sql_return_on_error(true);
-
- $sql_ary = array(
- 'user_id' => $user->data['user_id'],
- 'topic_id' => $topic_id,
- 'forum_id' => $forum_id,
- 'mark_type' => $type,
- 'mark_time' => $current_time
- );
-
- $db->sql_query('INSERT INTO ' . TOPICS_TRACK_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
-
- $db->sql_return_on_error(false);
+ $last_read[$topic_id] = (isset($mark_time[0])) ? $mark_time[0] : $user_lastmark;
+ }
+ else
+ {
+ $last_read[$topic_id] = $user_lastmark;
}
}
-
- if (!$config['load_db_lastread'])
+ }
+ }
+ else
+ {
+ global $tracking_topics;
+
+ if (!isset($tracking_topics) || !sizeof($tracking_topics))
+ {
+ $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? unserialize(stripslashes($_COOKIE[$config['cookie_name'] . '_track'])) : array();
+ }
+
+ if (!$user->data['is_registered'])
+ {
+ $user_lastmark = (isset($tracking_topics['l'])) ? base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate'] : 0;
+ }
+ else
+ {
+ $user_lastmark = $user->data['user_lastmark'];
+ }
+
+ foreach ($topic_ids as $topic_id)
+ {
+ $topic_id36 = base_convert($topic_id, 10, 36);
+
+ if (isset($tracking_topics['t'][$topic_id36]))
{
- $tracking = array();
- if (isset($_COOKIE[$config['cookie_name'] . '_track']))
- {
- $tracking = unserialize(stripslashes($_COOKIE[$config['cookie_name'] . '_track']));
+ $last_read[$topic_id] = base_convert($tracking_topics['t'][$topic_id36], 36, 10) + $config['board_startdate'];
+ }
+ }
- // If the cookie grows larger than 2000 characters we will remove
- // the smallest value
- if (strlen($_COOKIE[$config['cookie_name'] . '_track']) > 2000)
- {
- foreach ($tracking as $f => $t_ary)
- {
- if (!isset($m_value) || min($t_ary) < $m_value)
- {
- $m_value = min($t_ary);
- $m_tkey = array_search($m_value, $t_ary);
- $m_fkey = $f;
- }
- }
- unset($tracking[$m_fkey][$m_tkey]);
- }
- }
+ $topic_ids = array_diff($topic_ids, array_keys($last_read));
- if (isset($tracking[$forum_id]) && base_convert($tracking[$forum_id][0], 36, 10) < $current_time)
+ if (sizeof($topic_ids))
+ {
+ $mark_time = array();
+ if ($global_announce_list && sizeof($global_announce_list))
+ {
+ if (isset($tracking_topics['f'][0]))
{
- $tracking[$forum_id][base_convert($topic_id, 10, 36)] = base_convert($current_time - $config['board_startdate'], 10, 36);
+ $mark_time[0] = base_convert($tracking_topics['f'][0], 36, 10) + $config['board_startdate'];
+ }
+ }
+
+ if (isset($tracking_topics['f'][$forum_id]))
+ {
+ $mark_time[$forum_id] = base_convert($tracking_topics['f'][$forum_id], 36, 10) + $config['board_startdate'];
+ }
+
+ $user_lastmark = (isset($mark_time[$forum_id])) ? $mark_time[$forum_id] : $user_lastmark;
- $user->set_cookie('track', serialize($tracking), time() + 31536000);
+ foreach ($topic_ids as $topic_id)
+ {
+ if ($global_announce_list && isset($global_announce_list[$topic_id]))
+ {
+ $last_read[$topic_id] = (isset($mark_time[0])) ? $mark_time[0] : $user_lastmark;
}
- else if (!isset($tracking[$forum_id]))
+ else
{
- $tracking[$forum_id][0] = base_convert($current_time - $config['board_startdate'], 10, 36);
- $user->set_cookie('track', serialize($tracking), time() + 31536000);
+ $last_read[$topic_id] = $user_lastmark;
}
- unset($tracking);
}
- break;
+ }
}
+
+ return $last_read;
}
/**
@@ -877,7 +1100,14 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
// generate activation key
$confirm_key = gen_rand_string(10);
- page_header((!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang[$title]);
+ if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin'])
+ {
+ adm_page_header((!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang[$title]);
+ }
+ else
+ {
+ page_header((!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang[$title]);
+ }
$template->set_filenames(array(
'body' => $html_body)
@@ -908,7 +1138,14 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
WHERE user_id = " . $user->data['user_id'];
$db->sql_query($sql);
- page_footer();
+ if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin'])
+ {
+ adm_page_footer();
+ }
+ else
+ {
+ page_footer();
+ }
}
/**
@@ -1292,11 +1529,12 @@ function msg_handler($errno, $msg_text, $errfile, $errline)
{
if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin'])
{
- adm_page_header('', '', false);
+ // adm_page_header('', '', false);
+ adm_page_header('');
}
else
{
- page_header();
+ page_header('');
}
}
@@ -1304,26 +1542,19 @@ function msg_handler($errno, $msg_text, $errfile, $errline)
$msg_title = (!isset($msg_title)) ? $user->lang['INFORMATION'] : ((!empty($user->lang[$msg_title])) ? $user->lang[$msg_title] : $msg_title);
$display_header = (!isset($display_header)) ? false : (bool) $display_header;
- if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin'])
- {
- adm_page_message($msg_title, $msg_text, $display_header);
- adm_page_footer();
- }
- else
- {
- $template->set_filenames(array(
- 'body' => 'message_body.html')
- );
+ $template->set_filenames(array(
+ 'body' => 'message_body.html')
+ );
- $template->assign_vars(array(
- 'MESSAGE_TITLE' => $msg_title,
- 'MESSAGE_TEXT' => $msg_text)
- );
+ $template->assign_vars(array(
+ 'MESSAGE_TITLE' => $msg_title,
+ 'MESSAGE_TEXT' => $msg_text)
+ );
+
+ // We do not want the cron script to be called on error messages
+ define('IN_CRON', true);
+ page_footer();
- // We do not want the cron script to be called on error messages
- define('IN_CRON', true);
- page_footer();
- }
exit;
break;
}
@@ -1700,6 +1931,14 @@ function page_footer()
// Tidy some table rows every week
$cron_type = 'tidy_database';
}
+/**
+* @todo add session garbage collection
+
+ else if (time() - $config['session_gc'] > $config['session_last_gc'])
+ {
+ $cron_type = 'tidy_sessions';
+ }
+*/
if ($cron_type)
{