You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

510 lines
18 KiB

<?php
/**
* @package tikiwiki
*/
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
$section = 'forums';
require_once('tiki-setup.php');
if ($prefs['feature_categories'] == 'y') {
$categlib = TikiLib::lib('categ');
}
if ($prefs['feature_freetags'] == 'y') {
$freetaglib = TikiLib::lib('freetag');
}
$access->check_feature('feature_forums');
$auto_query_args = [
'forumId',
'comment_threadId',
'comment_offset',
'comment_threshold',
'thread_sort_mode',
'time_control',
'show_archived',
'poster',
'filter_type',
'reply_state'
];
$commentslib = TikiLib::lib('comments');
if (! isset($_REQUEST['forumId']) || ! ($forum_info = $commentslib->get_forum($_REQUEST['forumId']))) {
$smarty->assign('errortype', 'no_redirect_login');
$smarty->assign('msg', tra('No forum indicated'));
$smarty->display('error.tpl');
die;
}
if (isset($_REQUEST['comments_postCancel'])) {
unset($_REQUEST['comments_threadId']);
unset($_REQUEST['comments_title']);
unset($_REQUEST['openpost']);
}
if (isset($_REQUEST['openpost'])) {
$smarty->assign('openpost', 'y');
} else {
$smarty->assign('openpost', 'n');
}
$smarty->assign('forumId', $_REQUEST['forumId']);
$tikilib->get_perm_object($_REQUEST['forumId'], 'forum', $forum_info, true);
if (! isset($_REQUEST["sort_mode"])) {
$sort_mode = $prefs['forums_ordering'];
} else {
$sort_mode = $_REQUEST["sort_mode"];
}
//get sub forums list
$channels = $commentslib->list_forums(0, -1, $sort_mode, '', $_REQUEST['forumId']);
//get parent forums
$parents = $commentslib->get_forum_parents($forum_info);
$smarty->assign('parents', $parents);
$smarty->assign_by_ref('channels', $channels["data"]);
// Now if the user is the moderator then give him forum admin privs -. SHOULD BE IN get_perm_object
if ($tiki_p_admin_forum != 'y' && $user) {
if ($commentslib->admin_forum($_REQUEST['forumId'])) {
$tiki_p_admin_forum = 'y';
}
if ($tiki_p_admin_forum == 'y') {
$smarty->assign('tiki_p_admin_forum', 'y');
$tiki_p_forum_post = 'y';
$smarty->assign('tiki_p_forum_post', 'y');
$tiki_p_forum_read = 'y';
$smarty->assign('tiki_p_forum_read', 'y');
$tiki_p_forum_vote = 'y';
$smarty->assign('tiki_p_forum_vote', 'y');
$tiki_p_forum_post_topic = 'y';
$smarty->assign('tiki_p_forum_post_topic', 'y');
}
}
$access->check_permission(['tiki_p_forum_read'], '', 'forum', $_REQUEST['forumId']);
//add tablesorter sorting and filtering
$ts = Table_Check::setVars('viewforum' . $_REQUEST['forumId'] . '-', true);
if (! $ts['enabled'] || ($ts['enabled'] && $ts['ajax'])) {
$commentslib->forum_add_hit($_REQUEST["forumId"]);
}
if (isset($_REQUEST['report']) && $tiki_p_forums_report == 'y') {
check_ticket('view-forum');
$commentslib->report_post($_REQUEST['forumId'], 0, $_REQUEST['report'], $user, '');
}
if ($tiki_p_admin_forum == 'y') {
//don't see where this is used on tiki-view_forum.tpl - it is used on tiki-view_forum_thread.tpl
if (isset($_REQUEST['remove_attachment'])) {
$access->checkCsrf(tra('Are you sure you want to remove that attachment?'));
$commentslib->remove_thread_attachment($_REQUEST['remove_attachment']);
}
//locking the entire forum is not fully implemented - only threads can be locked currently
if (isset($_REQUEST['lock']) && isset($_REQUEST['forumId'])) {
check_ticket('view-forum');
if ($_REQUEST['lock'] == 'y') {
$commentslib->lock_object_thread('forum:' . ((int)$_REQUEST['forumId']));
$forum_info['is_locked'] = 'y';
} elseif ($_REQUEST['lock'] == 'n') {
$commentslib->unlock_object_thread('forum:' . ((int)$_REQUEST['forumId']));
$forum_info['is_locked'] = 'n';
}
}
}
$smarty->assign_by_ref('forum_info', $forum_info);
$comments_per_page = $forum_info['topicsPerPage'];
$thread_sort_mode = $forum_info['topicOrdering'];
$comments_vars = ['forumId'];
$comments_prefix_var = 'forum:';
$comments_object_var = 'forumId';
if (isset($forum_info['inbound_pop_server']) && ! empty($forum_info['inbound_pop_server'])) {
$commentslib->process_inbound_mail($_REQUEST['forumId']);
}
if (! isset($_REQUEST['comments_threshold'])) {
$_REQUEST['comments_threshold'] = 0;
}
$smarty->assign('comments_threshold', $_REQUEST['comments_threshold']);
if (! isset($_REQUEST['comments_threadId'])) {
$_REQUEST['comments_threadId'] = 0;
}
$smarty->assign('comments_threadId', $_REQUEST['comments_threadId']);
if (! isset($comments_prefix_var)) {
$comments_prefix_var = '';
}
if (! isset($comments_object_var) || (! $comments_object_var) || ! isset($_REQUEST[$comments_object_var])) {
die('the comments_object_var variable is not set or cannot be found as a REQUEST variable');
}
$comments_objectId = $comments_prefix_var . $_REQUEST["$comments_object_var"];
// Process a post form here
$smarty->assign('warning', 'n');
if (
$tiki_p_forum_post_topic == 'n'
&& isset($_REQUEST['comments_postComment'])
&& isset($_REQUEST['comments_title'])
&& $_REQUEST['forumId'] == $prefs['wiki_forum_id']
&& $tikilib->page_exists($_REQUEST['comments_title'])
) {
$tiki_p_forum_post_topic = 'y';
}
//Here we either post to a forum or create a new thread
if (isset($_REQUEST['comments_postComment'])) {
check_ticket('view-forum');
$errors = [];
$feedbacks = [];
$threadId = $commentslib->post_in_forum($forum_info, $_REQUEST, $feedbacks, $errors);
if ($threadId && $prefs['feature_freetags'] == 'y') {
$cat_type = 'forum post';
$cat_objid = $threadId;
include_once('freetag_apply.php');
}
if (! empty($errors)) {
Feedback::error(['mes' => $errors]);
}
if (! empty($feedbacks)) {
Feedback::success(['mes' => $feedbacks]);
}
}
// Here we send the user to the right thread/topic if it already exists; this
// is used for the 'discuss' tab. This is done down here because the thread
// might have to be created, which happens above.
if (isset($_REQUEST['comments_postComment'])) {
// Check if the thread/topic already exists
$threadId = $commentslib->check_for_topic($_REQUEST['comments_title'], $_REQUEST['forumId']);
// If it does, send the user there with no delay.
if ($threadId && count($errors) === 0) {
// If the samely titled comment already
// exists, go straight to it.
$smarty->loadPlugin('smarty_modifier_sefurl');
$url = smarty_modifier_sefurl($threadId, 'forumthread');
header('location: ' . $url);
exit;
}
}
if ($tiki_p_admin_forum == 'y' || $tiki_p_forum_vote == 'y') {
// Process a vote here
if (isset($_REQUEST['comments_vote']) && isset($_REQUEST['comments_threadId'])) {
check_ticket('view-forum');
$comments_show = 'y';
if ($tikilib->register_user_vote($user, 'comment' . $_REQUEST['comments_threadId'], $_REQUEST['comments_vote'], range(1, 5))) {
$commentslib->vote_comment($_REQUEST['comments_threadId'], $user, $_REQUEST['comments_vote']);
}
$_REQUEST['comments_threadId'] = 0;
$smarty->assign('comments_threadId', 0);
}
}
if ($user) {
$userinfo = $userlib->get_user_info($user);
$smarty->assign_by_ref('userinfo', $userinfo);
}
if (isset($_REQUEST['comments_remove']) && isset($_REQUEST['comments_threadId'])) {
if (
$tiki_p_admin_forum == 'y'
|| ($commentslib->user_can_edit_post($user, $_REQUEST['comments_threadId']) && $tiki_p_forum_post_topic == 'y')
) {
$access->check_authenticity(tra('Are you sure you want to remove that topic?'));
$comments_show = 'y';
$commentslib->remove_comment($_REQUEST['comments_threadId']);
$commentslib->register_remove_post($_REQUEST['forumId'], 0);
} else { // user can't edit this post
$smarty->assign('msg', tra('You do not have permission to remove someone else\'s post!'));
$smarty->assign('errortype', 'no_redirect_login');
$smarty->display('error.tpl');
die;
}
unset($_REQUEST['comments_threadId']);
$smarty->assign('comments_threadId', 0);
}
if ($_REQUEST['comments_threadId'] > 0) {
$comment_info = $commentslib->get_comment($_REQUEST['comments_threadId']);
$smarty->assign('comment_title', isset($_REQUEST['comments_title']) ? $_REQUEST['comments_title'] : $comment_info['title']);
$smarty->assign('comment_data', isset($_REQUEST['comments_data']) ? $_REQUEST['comments_data'] : $comment_info['data']);
$smarty->assign(
'comment_topictype',
isset($_REQUEST['comment_topictype']) ? $_REQUEST['comment_topictype'] : $comment_info['type']
);
$smarty->assign(
'comment_topicsummary',
isset($_REQUEST['comment_topicsummary']) ? $_REQUEST['comment_topicsummary'] : $comment_info['summary']
);
$smarty->assign('comment_topicsmiley', $comment_info['smiley']);
} else {
$smarty->assign('comment_title', isset($_REQUEST['comments_title']) ? $_REQUEST['comments_title'] : '');
$smarty->assign('comment_data', isset($_REQUEST['comments_data']) ? $_REQUEST['comments_data'] : '');
$smarty->assign('comment_topictype', isset($_REQUEST['comment_topictype']) ? $_REQUEST['comment_topictype'] : '');
$smarty->assign('comment_topictype', 'n');
$smarty->assign('comment_topicsummary', '');
$smarty->assign('comment_topicsmiley', '');
}
$smarty->assign('comment_preview', 'n');
if (isset($_REQUEST['comments_previewComment'])) {
check_ticket('view-forum');
$smarty->assign('comments_preview_title', $_REQUEST['comments_title']);
$smarty->assign('comments_preview_data', ($commentslib->parse_comment_data($_REQUEST['comments_data'])));
$smarty->assign('comment_title', $_REQUEST['comments_title']);
$smarty->assign('comment_data', $_REQUEST['comments_data']);
$smarty->assign('comment_topictype', $_REQUEST['comment_topictype']);
if ($forum_info['topic_summary'] == 'y') {
$smarty->assign('comment_topicsummary', $_REQUEST['comment_topicsummary']);
}
if ($forum_info['topic_smileys'] == 'y') {
$smarty->assign('comment_topicsmiley', $_REQUEST['comment_topicsmiley']);
}
$smarty->assign('openpost', 'y');
$smarty->assign('comment_preview', 'y');
}
// Check for settings
if (! isset($_REQUEST['comments_per_page'])) {
$_REQUEST['comments_per_page'] = $comments_per_page;
}
if (! isset($_REQUEST['thread_sort_mode'])) {
$_REQUEST['thread_sort_mode'] = $thread_sort_mode;
} else {
$comments_show = 'y';
}
if (! isset($_REQUEST['comments_commentFind'])) {
$_REQUEST['comments_commentFind'] = '';
} else {
$comments_show = 'y';
}
$smarty->assign('comments_per_page', $_REQUEST['comments_per_page']);
$smarty->assign('thread_sort_mode', $_REQUEST['thread_sort_mode']);
$smarty->assign('comments_commentFind', $_REQUEST['comments_commentFind']);
// Offset setting for the list of comments
if (! isset($_REQUEST['comments_offset'])) {
$comments_offset = 0;
} else {
$comments_offset = $_REQUEST['comments_offset'];
}
$smarty->assign('comments_offset', $comments_offset);
// Now check if we are displaying top-level comments or a specific comment
if (! isset($_REQUEST['comments_parentId'])) {
$_REQUEST['comments_parentId'] = 0;
}
$smarty->assign('comments_parentId', $_REQUEST['comments_parentId']);
if (! isset($_REQUEST['time_control'])) {
$_REQUEST['time_control'] = 0;
}
$commentslib->set_time_control($_REQUEST['time_control']);
$show_archived = isset($_REQUEST['show_archived']);
$smarty->assign('show_archived', $show_archived);
$view_archived_topics = ($show_archived == 'y' && ($tiki_p_admin_forum == 'y' || $prefs['feature_forum_topics_archiving'] == 'n'));
if (! isset($_REQUEST['poster']) || $_REQUEST['poster'] == '') {
$user_param = '';
} elseif ($_REQUEST['poster'] == '_me') {
$user_param = $user;
} else {
$user_param = $_REQUEST['poster'];
}
if (! isset($_REQUEST['filter_type'])) {
$type_param = '';
} else {
$type_param = $_REQUEST['filter_type'];
}
if (! isset($_REQUEST['reply_state'])) {
$reply_state = '';
} else {
$reply_state = $_REQUEST['reply_state'];
}
$comments_coms = $commentslib->get_forum_topics(
$_REQUEST['forumId'],
$comments_offset,
$_REQUEST['comments_per_page'],
$_REQUEST['thread_sort_mode'],
$view_archived_topics,
$user_param,
$type_param,
$reply_state,
$forum_info
);
$comments_cant = $commentslib->count_forum_topics(
$_REQUEST['forumId'],
$comments_offset,
$_REQUEST['comments_per_page'],
$_REQUEST['thread_sort_mode'],
$view_archived_topics,
$user_param,
$type_param,
$reply_state
);
$last_comments = $commentslib->get_last_forum_posts($_REQUEST['forumId'], $forum_info['forum_last_n']);
$smarty->assign_by_ref('last_comments', $last_comments);
$smarty->assign('comments_cant', $comments_cant);
$comments_maxRecords = $_REQUEST["comments_per_page"];
$smarty->assign_by_ref('comments_coms', $comments_coms);
$cat_type = 'forum';
$cat_objid = $_REQUEST["forumId"];
include_once('tiki-section_options.php');
if ($prefs['feature_user_watches'] == 'y') {
if ($user && isset($_REQUEST['watch_event'])) {
check_ticket('view-forum');
if ($_REQUEST['watch_action'] == 'add') {
$tikilib->add_user_watch(
$user,
$_REQUEST['watch_event'],
$_REQUEST['watch_object'],
'forum',
$forum_info['name'],
'tiki-view_forum.php?forumId=' . $_REQUEST['forumId']
);
} else {
$tikilib->remove_user_watch($user, $_REQUEST['watch_event'], $_REQUEST['watch_object'], 'forum');
}
}
if ($user && $watch = $tikilib->get_user_event_watches($user, 'forum_post_topic', $_REQUEST['forumId'])) {
$smarty->assign('user_watching_forum', 'y');
} else {
$smarty->assign('user_watching_forum', 'n');
}
if ($user && $watch = $tikilib->get_user_event_watches($user, 'forum_post_topic_and_thread', $_REQUEST['forumId'])) {
$smarty->assign('user_watching_forum_topic_and_thread', 'y');
} else {
$smarty->assign('user_watching_forum_topic_and_thread', 'n');
}
// Check, if the user is watching this forum by a category.
if ($prefs['feature_categories'] == 'y') {
$watching_categories_temp = $categlib->get_watching_categories($_REQUEST['forumId'], 'forum', $user);
$smarty->assign('category_watched', 'n');
if (count($watching_categories_temp) > 0) {
$smarty->assign('category_watched', 'y');
$watching_categories = [];
foreach ($watching_categories_temp as $wct) {
$watching_categories[] = [
"categId" => $wct,
"name" => $categlib->get_category_name($wct)
];
}
$smarty->assign('watching_categories', $watching_categories);
}
}
}
if ($tiki_p_admin_forum == 'y' || $prefs['feature_forum_quickjump'] == 'y') {
$all_forums = $commentslib->list_forums(0, -1, $sort_mode, '');
$temp_max = count($all_forums['data']);
for ($i = 0; $i < $temp_max; $i++) {
if ($userlib->object_has_one_permission($all_forums['data'][$i]['forumId'], 'forum')) {
if (
$tiki_p_admin == 'y'
|| $userlib->object_has_permission($user, $all_forums['data'][$i]['forumId'], 'forum', 'tiki_p_admin_forum')
|| $userlib->object_has_permission($user, $all_forums['data'][$i]['forumId'], 'forum', 'tiki_p_forum_read')
) {
$all_forums['data'][$i]['can_read'] = 'y';
} else {
$all_forums['data'][$i]['can_read'] = 'n';
}
} else {
$all_forums['data'][$i]['can_read'] = 'y';
}
}
$smarty->assign('all_forums', $all_forums['data']);
}
$smarty->assign('unread', 0);
if ($user && $prefs['feature_messages'] == 'y' && $tiki_p_messages == 'y') {
$unread = $tikilib->user_unread_messages($user);
$smarty->assign('unread', $unread);
}
if ($tiki_p_admin_forum == 'y') {
$smarty->assign('queued', $commentslib->get_num_queued($comments_objectId));
$smarty->assign('reported', $commentslib->get_num_reported($_REQUEST['forumId']));
}
if ($prefs['feature_freetags'] == 'y') {
$cat_type = 'forum post';
$cat_objid = $_REQUEST['comments_threadId'];
$cat_lang = $forum_info['forumLanguage'];
include_once("freetag_list.php");
//If in preview mode get the tags from the form and not from database
if (isset($_REQUEST['comments_previewComment'])) {
$smarty->assign('taglist', $_REQUEST["freetag_string"]);
}
}
$defaultRows = $prefs['default_rows_textarea_forum'];
if ($prefs['feature_contribution'] == 'y') {
$contributionItemId = $_REQUEST['comments_threadId'];
include_once('contribution.php');
}
if ($prefs['feature_forum_parse'] == 'y') {
$wikilib = TikiLib::lib('wiki');
$plugins = $wikilib->list_plugins(true, 'editpost');
$smarty->assign_by_ref('plugins', $plugins);
}
//initialize tablesorter
if ($ts['enabled'] && ! $ts['ajax']) {
//set tablesorter code
Table_Factory::build(
'TikiViewforum',
[
'id' => $ts['tableid'],
'total' => $comments_cant,
'pager' => [
'max' => $_REQUEST['comments_per_page'],
],
'ajax' => [
'requiredparams' => [
'forumId' => $_REQUEST['forumId'],
],
],
]
);
}
ask_ticket('view-forum');
if ($ts['ajax']) {
$smarty->display('tiki-view_forum.tpl');
} else {
$smarty->assign('mid', 'tiki-view_forum.tpl');
$smarty->display('tiki.tpl');
}