diff options
Diffstat (limited to 'phpBB/viewtopic.php')
| -rw-r--r-- | phpBB/viewtopic.php | 285 | 
1 files changed, 163 insertions, 122 deletions
| diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index 74420a25c7..59ef7bbc80 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -2,9 +2,8 @@  /**  *  * @package phpBB3 -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -152,26 +151,12 @@ if ($view && !$post_id)  			else  			{  				$topic_id = $row['topic_id']; - -				// Check for global announcement correctness? -				if (!$row['forum_id'] && !$forum_id) -				{ -					trigger_error('NO_TOPIC'); -				} -				else if ($row['forum_id']) -				{ -					$forum_id = $row['forum_id']; -				} +				$forum_id = $row['forum_id'];  			}  		}  	} -	// Check for global announcement correctness? -	if ((!isset($row) || !$row['forum_id']) && !$forum_id) -	{ -		trigger_error('NO_TOPIC'); -	} -	else if (isset($row) && $row['forum_id']) +	if (isset($row) && $row['forum_id'])  	{  		$forum_id = $row['forum_id'];  	} @@ -186,13 +171,6 @@ $sql_array = array(  	'FROM'		=> array(FORUMS_TABLE => 'f'),  ); -// Firebird handles two columns of the same name a little differently, this -// addresses that by forcing the forum_id to come from the forums table. -if ($db->sql_layer === 'firebird') -{ -	$sql_array['SELECT'] = 'f.forum_id AS forum_id, ' . $sql_array['SELECT']; -} -  // The FROM-Order is quite important here, else t.* columns can not be correctly bound.  if ($post_id)  { @@ -247,26 +225,8 @@ else  	$sql_array['WHERE'] = "p.post_id = $post_id AND t.topic_id = p.topic_id";  } -$sql_array['WHERE'] .= ' AND (f.forum_id = t.forum_id'; - -if (!$forum_id) -{ -	// If it is a global announcement make sure to set the forum id to a postable forum -	$sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . ' -		AND f.forum_type = ' . FORUM_POST . ')'; -} -else -{ -	$sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . " -		AND f.forum_id = $forum_id)"; -} - -$sql_array['WHERE'] .= ')'; +$sql_array['WHERE'] .= ' AND f.forum_id = t.forum_id'; -// Join to forum table on topic forum_id unless topic forum_id is zero -// whereupon we join on the forum_id passed as a parameter ... this -// is done so navigation, forum name, etc. remain consistent with where -// user clicked to view a global topic  $sql = $db->sql_build_query('SELECT', $sql_array);  $result = $db->sql_query($sql);  $topic_data = $db->sql_fetchrow($result); @@ -489,7 +449,9 @@ $viewtopic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&a  // Are we watching this topic?  $s_watching_topic = array(  	'link'			=> '', +	'link_toggle'	=> '',  	'title'			=> '', +	'title_toggle'	=> '',  	'is_watching'	=> false,  ); @@ -557,22 +519,31 @@ gen_forum_auth_level('topic', $forum_id, $topic_data['forum_status']);  // Quick mod tools  $allow_change_type = ($auth->acl_get('m_', $forum_id) || ($user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'])) ? true : false; -$topic_mod = ''; -$topic_mod .= ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'] && $topic_data['topic_status'] == ITEM_UNLOCKED)) ? (($topic_data['topic_status'] == ITEM_UNLOCKED) ? '<option value="lock">' . $user->lang['LOCK_TOPIC'] . '</option>' : '<option value="unlock">' . $user->lang['UNLOCK_TOPIC'] . '</option>') : ''; -$topic_mod .= ($auth->acl_get('m_delete', $forum_id)) ? '<option value="delete_topic">' . $user->lang['DELETE_TOPIC'] . '</option>' : ''; -$topic_mod .= ($auth->acl_get('m_move', $forum_id) && $topic_data['topic_status'] != ITEM_MOVED) ? '<option value="move">' . $user->lang['MOVE_TOPIC'] . '</option>' : ''; -$topic_mod .= ($auth->acl_get('m_split', $forum_id)) ? '<option value="split">' . $user->lang['SPLIT_TOPIC'] . '</option>' : ''; -$topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge">' . $user->lang['MERGE_POSTS'] . '</option>' : ''; -$topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge_topic">' . $user->lang['MERGE_TOPIC'] . '</option>' : ''; -$topic_mod .= ($auth->acl_get('m_move', $forum_id)) ? '<option value="fork">' . $user->lang['FORK_TOPIC'] . '</option>' : ''; -$topic_mod .= ($allow_change_type && $auth->acl_gets('f_sticky', 'f_announce', $forum_id) && $topic_data['topic_type'] != POST_NORMAL) ? '<option value="make_normal">' . $user->lang['MAKE_NORMAL'] . '</option>' : ''; -$topic_mod .= ($allow_change_type && $auth->acl_get('f_sticky', $forum_id) && $topic_data['topic_type'] != POST_STICKY) ? '<option value="make_sticky">' . $user->lang['MAKE_STICKY'] . '</option>' : ''; -$topic_mod .= ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_ANNOUNCE) ? '<option value="make_announce">' . $user->lang['MAKE_ANNOUNCE'] . '</option>' : ''; -$topic_mod .= ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_GLOBAL) ? '<option value="make_global">' . $user->lang['MAKE_GLOBAL'] . '</option>' : ''; -$topic_mod .= ($auth->acl_get('m_', $forum_id)) ? '<option value="topic_logs">' . $user->lang['VIEW_TOPIC_LOGS'] . '</option>' : ''; +$quickmod_array = array( +//	'key'			=> array('LANG_KEY', $userHasPermissions), + +	'lock'					=> array('LOCK_TOPIC', ($topic_data['topic_status'] == ITEM_UNLOCKED) && ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'] && $topic_data['topic_status'] == ITEM_UNLOCKED))), +	'unlock'				=> array('UNLOCK_TOPIC', ($topic_data['topic_status'] != ITEM_UNLOCKED) && ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'] && $topic_data['topic_status'] == ITEM_UNLOCKED))), +	'delete_topic'		=> array('DELETE_TOPIC', $auth->acl_get('m_delete', $forum_id)), +	'move'					=> array('MOVE_TOPIC', $auth->acl_get('m_move', $forum_id) && $topic_data['topic_status'] != ITEM_MOVED), +	'split'					=> array('SPLIT_TOPIC', $auth->acl_get('m_split', $forum_id)), +	'merge'					=> array('MERGE_POSTS', $auth->acl_get('m_merge', $forum_id)), +	'merge_topic'		=> array('MERGE_TOPIC', $auth->acl_get('m_merge', $forum_id)), +	'fork'					=> array('FORK_TOPIC', $auth->acl_get('m_move', $forum_id)), +	'make_normal'		=> array('MAKE_NORMAL', ($allow_change_type && $auth->acl_gets('f_sticky', 'f_announce', $forum_id) && $topic_data['topic_type'] != POST_NORMAL)), +	'make_sticky'		=> array('MAKE_STICKY', ($allow_change_type && $auth->acl_get('f_sticky', $forum_id) && $topic_data['topic_type'] != POST_STICKY)), +	'make_announce'	=> array('MAKE_ANNOUNCE', ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_ANNOUNCE)), +	'make_global'		=> array('MAKE_GLOBAL', ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_GLOBAL)), +	'topic_logs'			=> array('VIEW_TOPIC_LOGS', $auth->acl_get('m_', $forum_id)), +); -// If we've got a hightlight set pass it on to pagination. -$pagination = generate_pagination(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . ((strlen($u_sort_param)) ? "&$u_sort_param" : '') . (($highlight_match) ? "&hilit=$highlight" : '')), $total_posts, $config['posts_per_page'], $start); +foreach($quickmod_array as $option => $qm_ary) +{ +	if (!empty($qm_ary[1])) +	{ +		phpbb_add_quickmod_option($option, $qm_ary[0]); +	} +}  // Navigation links  generate_forum_nav($topic_data); @@ -611,6 +582,10 @@ if (!empty($_EXTRA_URL))  	}  } +// If we've got a hightlight set pass it on to pagination. +$base_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . ((strlen($u_sort_param)) ? "&$u_sort_param" : '') . (($highlight_match) ? "&hilit=$highlight" : '')); +phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $total_posts, $config['posts_per_page'], $start); +  // Send vars to template  $template->assign_vars(array(  	'FORUM_ID' 		=> $forum_id, @@ -624,11 +599,10 @@ $template->assign_vars(array(  	'TOPIC_AUTHOR_COLOUR'	=> get_username_string('colour', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']),  	'TOPIC_AUTHOR'			=> get_username_string('username', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']), -	'PAGINATION' 	=> $pagination, -	'PAGE_NUMBER' 	=> on_page($total_posts, $config['posts_per_page'], $start), -	'TOTAL_POSTS'	=> ($total_posts == 1) ? $user->lang['VIEW_TOPIC_POST'] : sprintf($user->lang['VIEW_TOPIC_POSTS'], $total_posts), +	'PAGE_NUMBER' 	=> phpbb_on_page($template, $user, $base_url, $total_posts, $config['posts_per_page'], $start), +	'TOTAL_POSTS'	=> $user->lang('VIEW_TOPIC_POSTS', (int) $total_posts),  	'U_MCP' 		=> ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&mode=topic_view&f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start") . ((strlen($u_sort_param)) ? "&$u_sort_param" : ''), true, $user->session_id) : '', -	'MODERATORS'	=> (isset($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id])) ? implode(', ', $forum_moderators[$forum_id]) : '', +	'MODERATORS'	=> (isset($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id])) ? implode($user->lang['COMMA_SEPARATOR'], $forum_moderators[$forum_id]) : '',  	'POST_IMG' 			=> ($topic_data['forum_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'FORUM_LOCKED') : $user->img('button_topic_new', 'POST_NEW_TOPIC'),  	'QUOTE_IMG' 		=> $user->img('icon_post_quote', 'REPLY_WITH_QUOTE'), @@ -657,7 +631,6 @@ $template->assign_vars(array(  	'S_SELECT_SORT_DAYS' 	=> $s_limit_days,  	'S_SINGLE_MODERATOR'	=> (!empty($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id]) > 1) ? false : true,  	'S_TOPIC_ACTION' 		=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start")), -	'S_TOPIC_MOD' 			=> ($topic_mod != '') ? '<select name="action" id="quick-mod-select">' . $topic_mod . '</select>' : '',  	'S_MOD_ACTION' 			=> append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start") . "&quickmod=1&redirect=" . urlencode(str_replace('&', '&', $viewtopic_url)), true, $user->session_id),  	'S_VIEWTOPIC'			=> true, @@ -678,12 +651,16 @@ $template->assign_vars(array(  	'U_PRINT_TOPIC'			=> ($auth->acl_get('f_print', $forum_id)) ? $viewtopic_url . '&view=print' : '',  	'U_EMAIL_TOPIC'			=> ($auth->acl_get('f_email', $forum_id) && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&t=$topic_id") : '', -	'U_WATCH_TOPIC' 		=> $s_watching_topic['link'], -	'L_WATCH_TOPIC' 		=> $s_watching_topic['title'], +	'U_WATCH_TOPIC'			=> $s_watching_topic['link'], +	'U_WATCH_TOPIC_TOGGLE'	=> $s_watching_topic['link_toggle'], +	'S_WATCH_TOPIC_TITLE'	=> $s_watching_topic['title'], +	'S_WATCH_TOPIC_TOGGLE'	=> $s_watching_topic['title_toggle'],  	'S_WATCHING_TOPIC'		=> $s_watching_topic['is_watching'],  	'U_BOOKMARK_TOPIC'		=> ($user->data['is_registered'] && $config['allow_bookmarks']) ? $viewtopic_url . '&bookmark=1&hash=' . generate_link_hash("topic_$topic_id") : '', -	'L_BOOKMARK_TOPIC'		=> ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? $user->lang['BOOKMARK_TOPIC_REMOVE'] : $user->lang['BOOKMARK_TOPIC'], +	'S_BOOKMARK_TOPIC'		=> ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? $user->lang['BOOKMARK_TOPIC_REMOVE'] : $user->lang['BOOKMARK_TOPIC'], +	'S_BOOKMARK_TOGGLE'		=> (!$user->data['is_registered'] || !$config['allow_bookmarks'] || !$topic_data['bookmarked']) ? $user->lang['BOOKMARK_TOPIC_REMOVE'] : $user->lang['BOOKMARK_TOPIC'], +	'S_BOOKMARKED_TOPIC'	=> ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? true : false,  	'U_POST_NEW_TOPIC' 		=> ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=post&f=$forum_id") : '',  	'U_POST_REPLY_TOPIC' 	=> ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&f=$forum_id&t=$topic_id") : '', @@ -728,9 +705,9 @@ if (!empty($topic_data['poll_start']))  		// Cookie based guest tracking ... I don't like this but hum ho  		// it's oft requested. This relies on "nice" users who don't feel  		// the need to delete cookies to mess with results. -		if (isset($_COOKIE[$config['cookie_name'] . '_poll_' . $topic_id])) +		if ($request->is_set($config['cookie_name'] . '_poll_' . $topic_id, phpbb_request_interface::COOKIE))  		{ -			$cur_voted_id = explode(',', $_COOKIE[$config['cookie_name'] . '_poll_' . $topic_id]); +			$cur_voted_id = explode(',', $request->variable($config['cookie_name'] . '_poll_' . $topic_id, '', true, phpbb_request_interface::COOKIE));  			$cur_voted_id = array_map('intval', $cur_voted_id);  		}  	} @@ -889,7 +866,7 @@ if (!empty($topic_data['poll_start']))  			'POLL_OPTION_RESULT' 	=> $poll_option['poll_option_total'],  			'POLL_OPTION_PERCENT' 	=> $option_pct_txt,  			'POLL_OPTION_PCT'		=> round($option_pct * 100), -			'POLL_OPTION_IMG' 		=> $user->img('poll_center', $option_pct_txt, round($option_pct * 250)), +			'POLL_OPTION_WIDTH'     => round($option_pct * 250),  			'POLL_OPTION_VOTED'		=> (in_array($poll_option['poll_option_id'], $cur_voted_id)) ? true : false)  		);  	} @@ -902,7 +879,7 @@ if (!empty($topic_data['poll_start']))  		'POLL_LEFT_CAP_IMG'	=> $user->img('poll_left'),  		'POLL_RIGHT_CAP_IMG'=> $user->img('poll_right'), -		'L_MAX_VOTES'		=> ($topic_data['poll_max_options'] == 1) ? $user->lang['MAX_OPTION_SELECT'] : sprintf($user->lang['MAX_OPTIONS_SELECT'], $topic_data['poll_max_options']), +		'L_MAX_VOTES'		=> $user->lang('MAX_OPTIONS_SELECT', (int) $topic_data['poll_max_options']),  		'L_POLL_LENGTH'		=> ($topic_data['poll_length']) ? sprintf($user->lang[($poll_end > time()) ? 'POLL_RUN_TILL' : 'POLL_ENDED_AT'], $user->format_date($poll_end)) : '',  		'S_HAS_POLL'		=> true, @@ -991,7 +968,7 @@ if (!sizeof($post_list))  // We need to grab it because we do reverse ordering sometimes  $max_post_time = 0; -$sql = $db->sql_build_query('SELECT', array( +$sql_ary = array(  	'SELECT'	=> 'u.*, z.friend, z.foe, p.*',  	'FROM'		=> array( @@ -1002,17 +979,29 @@ $sql = $db->sql_build_query('SELECT', array(  	'LEFT_JOIN'	=> array(  		array(  			'FROM'	=> array(ZEBRA_TABLE => 'z'), -			'ON'	=> 'z.user_id = ' . $user->data['user_id'] . ' AND z.zebra_id = p.poster_id' -		) +			'ON'	=> 'z.user_id = ' . $user->data['user_id'] . ' AND z.zebra_id = p.poster_id', +		),  	),  	'WHERE'		=> $db->sql_in_set('p.post_id', $post_list) . ' -		AND u.user_id = p.poster_id' -)); +		AND u.user_id = p.poster_id', +); + +/** +* Event to modify the SQL query before the post and poster data is retrieved +* +* @event core.viewtopic_get_post_data +* @var	array	sql_ary		The SQL array to get the data of posts and posters +* @since 3.1-A1 +*/ +$vars = array('sql_ary'); +extract($phpbb_dispatcher->trigger_event('core.viewtopic_get_post_data', compact($vars))); +$sql = $db->sql_build_query('SELECT', $sql_ary);  $result = $db->sql_query($sql); -$now = phpbb_gmgetdate(time() + $user->timezone + $user->dst); +$now = $user->create_datetime(); +$now = phpbb_gmgetdate($now->getTimestamp() + $now->getOffset());  // Posts are stored in the $rowset array while $attach_list, $user_cache  // and the global bbcode_bitfield are built @@ -1084,7 +1073,7 @@ while ($row = $db->sql_fetchrow($result))  	{  		if ($poster_id == ANONYMOUS)  		{ -			$user_cache[$poster_id] = array( +			$user_cache_data = array(  				'joined'		=> '',  				'posts'			=> '',  				'from'			=> '', @@ -1094,7 +1083,7 @@ while ($row = $db->sql_fetchrow($result))  				'sig_bbcode_bitfield'	=> '',  				'online'			=> false, -				'avatar'			=> ($user->optionget('viewavatars')) ? get_user_avatar($row['user_avatar'], $row['user_avatar_type'], $row['user_avatar_width'], $row['user_avatar_height']) : '', +				'avatar'			=> ($user->optionget('viewavatars')) ? phpbb_get_user_avatar($row) : '',  				'rank_title'		=> '',  				'rank_image'		=> '',  				'rank_image_src'	=> '', @@ -1119,13 +1108,27 @@ while ($row = $db->sql_fetchrow($result))  				'allow_pm'			=> 0,  			); +			/** +			* Modify the guest user's data displayed with the posts +			* +			* @event core.viewtopic_cache_guest_data +			* @var	array	user_cache_data	Array with the user's data +			* @var	int		poster_id	Poster's user id +			* @var	array	row			Array with original user and post data +			* @since 3.1-A1 +			*/ +			$vars = array('user_cache_data', 'poster_id', 'row'); +			extract($phpbb_dispatcher->trigger_event('core.viewtopic_cache_guest_data', compact($vars))); + +			$user_cache[$poster_id] = $user_cache_data; +  			get_user_rank($row['user_rank'], false, $user_cache[$poster_id]['rank_title'], $user_cache[$poster_id]['rank_image'], $user_cache[$poster_id]['rank_image_src']);  		}  		else  		{  			$user_sig = ''; -			// We add the signature to every posters entry because enable_sig is post dependant +			// We add the signature to every posters entry because enable_sig is post dependent  			if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs'))  			{  				$user_sig = $row['user_sig']; @@ -1133,7 +1136,7 @@ while ($row = $db->sql_fetchrow($result))  			$id_cache[] = $poster_id; -			$user_cache[$poster_id] = array( +			$user_cache_data = array(  				'joined'		=> $user->format_date($row['user_regdate']),  				'posts'			=> $row['user_posts'],  				'warnings'		=> (isset($row['user_warnings'])) ? $row['user_warnings'] : 0, @@ -1146,7 +1149,7 @@ while ($row = $db->sql_fetchrow($result))  				'viewonline'	=> $row['user_allow_viewonline'],  				'allow_pm'		=> $row['user_allow_pm'], -				'avatar'		=> ($user->optionget('viewavatars')) ? get_user_avatar($row['user_avatar'], $row['user_avatar_type'], $row['user_avatar_width'], $row['user_avatar_height']) : '', +				'avatar'		=> ($user->optionget('viewavatars')) ? phpbb_get_user_avatar($row) : '',  				'age'			=> '',  				'rank_title'		=> '', @@ -1171,6 +1174,20 @@ while ($row = $db->sql_fetchrow($result))  				'author_profile'	=> get_username_string('profile', $poster_id, $row['username'], $row['user_colour']),  			); +			/** +			* Modify the users' data displayed with their posts +			* +			* @event core.viewtopic_cache_user_data +			* @var	array	user_cache_data	Array with the user's data +			* @var	int		poster_id	Poster's user id +			* @var	array	row			Array with original user and post data +			* @since 3.1-A1 +			*/ +			$vars = array('user_cache_data', 'poster_id', 'row'); +			extract($phpbb_dispatcher->trigger_event('core.viewtopic_cache_user_data', compact($vars))); + +			$user_cache[$poster_id] = $user_cache_data; +  			get_user_rank($row['user_rank'], $row['user_posts'], $user_cache[$poster_id]['rank_title'], $user_cache[$poster_id]['rank_image'], $user_cache[$poster_id]['rank_image_src']);  			if ((!empty($row['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $auth->acl_get('a_email')) @@ -1335,6 +1352,16 @@ if (sizeof($attach_list))  	}  } +$template->assign_vars(array( +	'S_HAS_ATTACHMENTS' => $topic_data['topic_attachment'], +)); + +$methods = phpbb_gen_download_links('topic_id', $topic_id, $phpbb_root_path, $phpEx); +foreach ($methods as $method) +{ +	$template->assign_block_vars('dl_method', $method); +} +  // Instantiate BBCode if need be  if ($bbcode_bitfield !== '')  { @@ -1359,7 +1386,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)  		continue;  	} -	$row =& $rowset[$post_list[$i]]; +	$row = $rowset[$post_list[$i]];  	$poster_id = $row['user_id'];  	// End signature parsing, only if needed @@ -1429,8 +1456,6 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)  			unset($post_storage_list);  		} -		$l_edit_time_total = ($row['post_edit_count'] == 1) ? $user->lang['EDITED_TIME_TOTAL'] : $user->lang['EDITED_TIMES_TOTAL']; -  		if ($row['post_edit_reason'])  		{  			// User having edited the post also being the post author? @@ -1443,7 +1468,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)  				$display_username = get_username_string('full', $row['post_edit_user'], $post_edit_list[$row['post_edit_user']]['username'], $post_edit_list[$row['post_edit_user']]['user_colour']);  			} -			$l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']); +			$l_edited_by = $user->lang('EDITED_TIMES_TOTAL', (int) $row['post_edit_count'], $display_username, $user->format_date($row['post_edit_time'], false, true));  		}  		else  		{ @@ -1462,7 +1487,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)  				$display_username = get_username_string('full', $row['post_edit_user'], $user_cache[$row['post_edit_user']]['username'], $user_cache[$row['post_edit_user']]['user_colour']);  			} -			$l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']); +			$l_edited_by = $user->lang('EDITED_TIMES_TOTAL', (int) $row['post_edit_count'], $display_username, $user->format_date($row['post_edit_time'], false, true));  		}  	}  	else @@ -1516,7 +1541,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)  	)));  	// -	$postrow = array( +	$post_row = array(  		'POST_AUTHOR_FULL'		=> ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_full'] : get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),  		'POST_AUTHOR_COLOUR'	=> ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_colour'] : get_username_string('colour', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),  		'POST_AUTHOR'			=> ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_username'] : get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), @@ -1564,10 +1589,11 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)  		'U_YIM'			=> $user_cache[$poster_id]['yim'],  		'U_JABBER'		=> $user_cache[$poster_id]['jabber'], +		'U_APPROVE_ACTION'		=> append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&p={$row['post_id']}&f=$forum_id"),  		'U_REPORT'			=> ($auth->acl_get('f_report', $forum_id)) ? append_sid("{$phpbb_root_path}report.$phpEx", 'f=' . $forum_id . '&p=' . $row['post_id']) : '',  		'U_MCP_REPORT'		=> ($auth->acl_get('m_report', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&mode=report_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '',  		'U_MCP_APPROVE'		=> ($auth->acl_get('m_approve', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&mode=approve_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '', -		'U_MINI_POST'		=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . (($topic_data['topic_type'] == POST_GLOBAL) ? '&f=' . $forum_id : '') . '#p' . $row['post_id'], +		'U_MINI_POST'		=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . '#p' . $row['post_id'],  		'U_NEXT_POST_ID'	=> ($i < $i_total && isset($rowset[$post_list[$i + 1]])) ? $rowset[$post_list[$i + 1]]['post_id'] : '',  		'U_PREV_POST_ID'	=> $prev_post_id,  		'U_NOTES'			=> ($auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&mode=user_notes&u=' . $poster_id, true, $user->session_id) : '', @@ -1578,6 +1604,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)  		'POSTER_ID'			=> $poster_id,  		'S_HAS_ATTACHMENTS'	=> (!empty($attachments[$row['post_id']])) ? true : false, +		'S_MULTIPLE_ATTACHMENTS'	=> !empty($attachments[$row['post_id']]) && sizeof($attachments[$row['post_id']]) > 1,  		'S_POST_UNAPPROVED'	=> ($row['post_approved']) ? false : true,  		'S_POST_REPORTED'	=> ($row['post_reported'] && $auth->acl_get('m_report', $forum_id)) ? true : false,  		'S_DISPLAY_NOTICE'	=> $display_notice && $row['post_attachment'], @@ -1591,13 +1618,28 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)  		'L_IGNORE_POST'		=> ($row['hide_post']) ? sprintf($user->lang['POST_BY_FOE'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), '<a href="' . $viewtopic_url . "&p={$row['post_id']}&view=show#p{$row['post_id']}" . '">', '</a>') : '',  	); +	$user_poster_data = $user_cache[$poster_id]; + +	/** +	* Modify the posts template block +	* +	* @event core.viewtopic_modify_post_row +	* @var	array	row				Array with original post and user data +	* @var	array	cp_row			Custom profile field data of the poster +	* @var	array	user_poster_data	Poster's data from user cache +	* @var	array	post_row		Template block array of the post +	* @since 3.1-A1 +	*/ +	$vars = array('row', 'cp_row', 'user_poster_data', 'post_row'); +	extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_post_row', compact($vars))); +  	if (isset($cp_row['row']) && sizeof($cp_row['row']))  	{ -		$postrow = array_merge($postrow, $cp_row['row']); +		$post_row = array_merge($post_row, $cp_row['row']);  	}  	// Dump vars into template -	$template->assign_block_vars('postrow', $postrow); +	$template->assign_block_vars('postrow', $post_row);  	if (!empty($cp_row['blockrow']))  	{ @@ -1616,6 +1658,12 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)  				'DISPLAY_ATTACHMENT'	=> $attachment)  			);  		} + +		$methods = phpbb_gen_download_links('post_msg_id', $row['post_id'], $phpbb_root_path, $phpEx); +		foreach ($methods as $method) +		{ +			$template->assign_block_vars('postrow.dl_method', $method); +		}  	}  	$prev_post_id = $row['post_id']; @@ -1643,41 +1691,21 @@ if (isset($user->data['session_page']) && !$user->data['is_bot'] && (strpos($use  	}  } -// Get last post time for all global announcements -// to keep proper forums tracking -if ($topic_data['topic_type'] == POST_GLOBAL) -{ -	$sql = 'SELECT topic_last_post_time as forum_last_post_time -		FROM ' . TOPICS_TABLE . ' -		WHERE forum_id = 0 -		ORDER BY topic_last_post_time DESC'; -	$result = $db->sql_query_limit($sql, 1); -	$topic_data['forum_last_post_time'] = (int) $db->sql_fetchfield('forum_last_post_time'); -	$db->sql_freeresult($result); - -	$sql = 'SELECT mark_time as forum_mark_time -		FROM ' . FORUMS_TRACK_TABLE . ' -		WHERE forum_id = 0 -			AND user_id = ' . $user->data['user_id']; -	$result = $db->sql_query($sql); -	$topic_data['forum_mark_time'] = (int) $db->sql_fetchfield('forum_mark_time'); -	$db->sql_freeresult($result); -} -  // Only mark topic if it's currently unread. Also make sure we do not set topic tracking back if earlier pages are viewed.  if (isset($topic_tracking_info[$topic_id]) && $topic_data['topic_last_post_time'] > $topic_tracking_info[$topic_id] && $max_post_time > $topic_tracking_info[$topic_id])  { -	markread('topic', (($topic_data['topic_type'] == POST_GLOBAL) ? 0 : $forum_id), $topic_id, $max_post_time); +	markread('topic', $forum_id, $topic_id, $max_post_time);  	// Update forum info -	$all_marked_read = update_forum_tracking_info((($topic_data['topic_type'] == POST_GLOBAL) ? 0 : $forum_id), $topic_data['forum_last_post_time'], (isset($topic_data['forum_mark_time'])) ? $topic_data['forum_mark_time'] : false, false); +	$all_marked_read = update_forum_tracking_info($forum_id, $topic_data['forum_last_post_time'], (isset($topic_data['forum_mark_time'])) ? $topic_data['forum_mark_time'] : false, false);  }  else  {  	$all_marked_read = true;  } -// If there are absolutely no more unread posts in this forum and unread posts shown, we can savely show the #unread link +// If there are absolutely no more unread posts in this forum +// and unread posts shown, we can safely show the #unread link  if ($all_marked_read)  {  	if ($post_unread) @@ -1760,19 +1788,34 @@ if ($s_can_vote || $s_quick_reply)  // We overwrite $_REQUEST['f'] if there is no forum specified  // to be able to display the correct online list.  // One downside is that the user currently viewing this topic/post is not taken into account. -if (empty($_REQUEST['f'])) +if (!request_var('f', 0))  { -	$_REQUEST['f'] = $forum_id; +	$request->overwrite('f', $forum_id);  }  // We need to do the same with the topic_id. See #53025. -if (empty($_REQUEST['t']) && !empty($topic_id)) +if (!request_var('t', 0) && !empty($topic_id))  { -	$_REQUEST['t'] = $topic_id; +	$request->overwrite('t', $topic_id);  } +$page_title = $topic_data['topic_title'] . ($start ? ' - ' . sprintf($user->lang['PAGE_TITLE_NUMBER'], floor($start / $config['posts_per_page']) + 1) : ''); + +/** +* You can use this event to modify the page title of the viewtopic page +* +* @event core.viewtopic_modify_page_title +* @var	string	page_title		Title of the index page +* @var	array	topic_data		Array with topic data +* @var	int		forum_id		Forum ID of the topic +* @var	int		start			Start offset used to calculate the page +* @since 3.1-A1 +*/ +$vars = array('page_title', 'topic_data', 'forum_id', 'start'); +extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_page_title', compact($vars))); +  // Output the page -page_header($user->lang['VIEW_TOPIC'] . ' - ' . $topic_data['topic_title'], true, $forum_id); +page_header($page_title, true, $forum_id);  $template->set_filenames(array(  	'body' => ($view == 'print') ? 'viewtopic_print.html' : 'viewtopic_body.html') @@ -1780,5 +1823,3 @@ $template->set_filenames(array(  make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"), $forum_id);  page_footer(); - -?>
\ No newline at end of file | 
