[Xfce4-commits] <forum:master> Add 'Mark as solved' link for topic subjects.

Nick Schermer noreply at xfce.org
Sat Nov 13 14:10:02 CET 2010


Updating branch refs/heads/master
         to 70ea361d291ee230cc04b44f40dc658aca016665 (commit)
       from a47fa75336802e076e6b74af60fdff016693d9de (commit)

commit 70ea361d291ee230cc04b44f40dc658aca016665
Author: Nick Schermer <nick at xfce.org>
Date:   Sat Nov 13 13:47:29 2010 +0100

    Add 'Mark as solved' link for topic subjects.
    
    A rewrite of the hooks found online that actually
    works (tm), so the topic starter can mark the topic
    as closed too.

 lang/English/topic.php |    9 +++++-
 viewtopic.php          |   73 ++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 79 insertions(+), 3 deletions(-)

diff --git a/lang/English/topic.php b/lang/English/topic.php
index 1f74dda..93b0505 100644
--- a/lang/English/topic.php
+++ b/lang/English/topic.php
@@ -26,6 +26,13 @@ $lang_topic = array(
 'Quick post'		=>	'Quick post',
 'Mod controls'		=>	'Moderator controls',
 'New icon'			=>	'New post',
-'Re'				=>	'Re:'
+'Re'				=>	'Re:',
 
+// Solved strings
+'Mark solved'		=> 	'Mark as solved',
+'Mark unsolved'		=>	'Mark as unsolved',
+'Solved'		=>	'[Solved]',
+'Solved closed'		=>	'The topic is closed. Cannot change solve state. Redirecting …',
+'Solved not permitted'	=>	'You are not allowed to change the solve state of this topic. Redirecting …',
+'Solved succesfull'	=>	'Topic solve state changed succesfully. Redirecting …',
 );
diff --git a/viewtopic.php b/viewtopic.php
index 8944c6c..c874dcb 100644
--- a/viewtopic.php
+++ b/viewtopic.php
@@ -88,7 +88,7 @@ else if ($action == 'last')
 
 // Fetch some info about the topic
 if (!$pun_user['is_guest'])
-	$result = $db->query('SELECT t.subject, t.closed, t.num_replies, t.sticky, t.first_post_id, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, s.user_id AS is_subscribed FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'subscriptions AS s ON (t.id=s.topic_id AND s.user_id='.$pun_user['id'].') LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$id.' AND t.moved_to IS NULL') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT t.poster, t.subject, t.closed, t.num_replies, t.sticky, t.first_post_id, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, s.user_id AS is_subscribed FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'subscriptions AS s ON (t.id=s.topic_id AND s.user_id='.$pun_user['id'].') LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$id.' AND t.moved_to IS NULL') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
 else
 	$result = $db->query('SELECT t.subject, t.closed, t.num_replies, t.sticky, t.first_post_id, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$id.' AND t.moved_to IS NULL') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
 
@@ -101,11 +101,80 @@ $cur_topic = $db->fetch_assoc($result);
 $mods_array = ($cur_topic['moderators'] != '') ? unserialize($cur_topic['moderators']) : array();
 $is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_moderator'] == '1' && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
 
+// Handle clicking on solve links
+if (isset($_GET['solved']) && !$pun_user['is_guest'])
+{
+	if ($cur_topic['closed'] != '0')
+	{
+		redirect('viewtopic.php?id='.$id, $lang_topic['Solved closed']);
+		exit;
+	}
+
+	if (!$is_admmod)
+	{
+		// Check the user id of the first post on this topic and some
+		// other permissions that need to be valid.
+		$valid_user = false;
+		$result = $db->query('SELECT poster_id FROM '.$db->prefix.'posts WHERE topic_id = '.$id.' ORDER BY id LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+		if ($db->num_rows($result) == 1)
+		{
+			$poster_info = $db->fetch_assoc($result);
+			if ($poster_info['poster_id'] == $pun_user['id']
+			    && (($cur_topic['post_replies'] == '' && $pun_user['g_post_replies'] == '1') 
+			        || $cur_topic['post_replies'] == '1'))
+			{
+				$valid_user = true;
+			}
+		}
+
+		if (!$valid_user)
+		{
+			redirect('viewtopic.php?id='.$id, $lang_topic['Solved not permitted']);
+			exit;
+		}
+	}
+
+	// Check if we need to change anything if so, create the new subject
+	$is_solved = (strpos($cur_topic['subject'], $lang_topic['Solved']) === 0) ? true : false;
+	if ($is_solved && $_GET['solved'] == 'false')
+		$subject = preg_replace('/^'.preg_quote($lang_topic['Solved'].'/'), '', $cur_topic['subject']);
+	else if (!$is_solved && $_GET['solved'] == 'true')
+		$subject = $lang_topic['Solved'] .' '.$cur_topic['subject'];
+	else
+		$subject = null;
+
+	// Update the database
+	if (!empty($subject))
+	{
+		if ($pun_config['o_censoring'] == '1')
+			$subject = censor_words($subject);
+		$subject = trim($subject);
+
+		$db->query('UPDATE '.$db->prefix.'topics SET subject=\''.$db->escape($subject).'\' WHERE id='.$id) or error('Unable to change solve state', __FILE__, __LINE__, $db->error());
+
+		redirect('viewtopic.php?id='.$id, $lang_topic['Solved succesfull']);
+		exit;
+	}
+}
+
+
 // Can we or can we not post replies?
 if ($cur_topic['closed'] == '0')
 {
 	if (($cur_topic['post_replies'] == '' && $pun_user['g_post_replies'] == '1') || $cur_topic['post_replies'] == '1' || $is_admmod)
-		$post_link = "\t\t\t".'<p class="postlink conr"><a href="post.php?tid='.$id.'">'.$lang_topic['Post reply'].'</a></p>'."\n";
+	{
+		$post_link = "\t\t\t".'<p class="postlink conr"><a href="post.php?tid='.$id.'">'.$lang_topic['Post reply'].'</a>'."\n";
+
+		// Show the 'Marked as (un)solved link for admins, moderators and a match in the username.
+		// The username is not safe, but we do a better check once the link is clicked.
+		if ($cur_topic['poster'] == $pun_user['username'] || $is_admmod)
+		{
+			$is_solved = strpos($cur_topic['subject'], $lang_topic['Solved']) === 0 ? false : true;
+			$post_link .= ' | <a href="viewtopic.php?id='.$id.'&solved='.($is_solved ? 'true' : 'false').'">'.$lang_topic['Mark '.($is_solved ? 'solved' : 'unsolved')].'</a>';
+		}
+
+		$post_link .= '</p>';
+	}
 	else
 		$post_link = '';
 }



More information about the Xfce4-commits mailing list