<?php
/**
* [PHPFOX_HEADER]
*/
defined('PHPFOX') or exit('NO DICE!');
/**
*
*
* @copyright [PHPFOX_COPYRIGHT]
* @author Raymond Benc
* @package Module_Forum
* @version $Id: controller.class.php 103 2009-01-27 11:32:36Z Raymond_Benc $
*/
class Forum_Component_Controller_Thread extends Phpfox_Component
{
/**
* Controller
*/
public function process()
{
Phpfox::getUserParam('forum.can_view_forum', true);
$iPage = $this->request()->getInt('page');
$iPageSize = Phpfox::getParam('forum.total_posts_per_thread');
$aThreadCondition = array();
$aCallback = $this->getParam('aCallback', null);
if (($iPostRedirect = $this->request()->getInt('permalink')) && ($sUrl = Forum_Service_Callback::instance()->getFeedRedirectPost($iPostRedirect)))
{
$this->url()->forward(preg_replace('/\/post_(.*)\//i', '/view_\\1/', $sUrl));
}
if (Phpfox::isUser() && ($iView = $this->request()->getInt('view')) && Phpfox::isModule('notification'))
{
Notification_Service_Process::instance()->delete('forum_subscribed_post', $iView, Phpfox::getUserId());
Notification_Service_Process::instance()->delete('forum_post_like', $iView, Phpfox::getUserId());
}
if (($iRedirect = $this->request()->getInt('redirect')) && ($aThread = Forum_Service_Thread_Thread::instance()->getForRedirect($iRedirect)))
{
if ($aThread['group_id'] > 0)
{
$aCallback = Phpfox::callback('group.addForum', $aThread['group_id']);
if (isset($aCallback['module']))
{
$this->url()->send($aCallback['url_home'], array('forum', $aThread['title_url']));
}
}
$this->url()->send('forum', array($aThread['forum_url'] . '-' . $aThread['forum_id'], $aThread['title_url']));
}
$threadId = $this->request()->getInt('req3');
if ($this->request()->segment(3) == 'replies' && $this->request()->getInt('id')) {
$threadId = $this->request()->getInt('id');
$iPage = 1;
$iPageSize = 200;
$this->template()->setBreadCrumb(_p('latest_replies'), $this->url()->current(), true);
$this->template()->assign([
'isReplies' => true
]);
}
$aThreadCondition[] = 'ft.thread_id = ' . $threadId . '';
$sPermaView = $this->request()->get('view', null);
if ((int) $sPermaView <= 0)
{
$sPermaView = null;
}
list($iCnt, $aThread) = Forum_Service_Thread_Thread::instance()->getThread($aThreadCondition, array(), 'fp.time_stamp ASC', $iPage, $iPageSize, $sPermaView);
if (!isset($aThread['thread_id']))
{
return Phpfox_Error::display(_p('not_a_valid_thread'));
}
if ($aThread['group_id'] > 0 && ($sParentId = Phpfox::getLib('pages.facade')->getPageItemType($aThread['group_id'])) && Phpfox::isModule($sParentId))
{
$aCallback = Phpfox::callback($sParentId . '.addForum', $aThread['group_id']);
if (!Phpfox::getService($sParentId)->hasPerm($aThread['group_id'], 'forum.view_browse_forum'))
{
return Phpfox_Error::display(_p('unable_to_view_this_item_due_to_privacy_settings'));
}
}
if ($aThread['view_id'] != '0' && $aThread['user_id'] != Phpfox::getUserId())
{
if (!Phpfox::getUserParam('forum.can_approve_forum_thread') && !Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'approve_thread'))
{
return Phpfox_Error::display(_p('not_a_valid_thread'));
}
}
if ($aCallback === null && !Forum_Service_Forum::instance()->hasAccess($aThread['forum_id'], 'can_view_forum'))
{
if (Phpfox::isUser())
{
return Phpfox_Error::display(_p('you_do_not_have_the_proper_permission_to_view_this_thread'));
}
else
{
return Phpfox_Error::display(_p('log_in_to_view_thread'));
}
}
if ($aCallback === null && !Forum_Service_Forum::instance()->hasAccess($aThread['forum_id'], 'can_view_thread_content'))
{
$this->url()->send('forum', null, _p('you_do_not_have_the_proper_permission_to_view_this_thread'));
}
Phpfox_Pager::instance()->set(array('page' => $iPage, 'size' => $iPageSize, 'count' => $iCnt));
$aForum = Forum_Service_Forum::instance()
->id($aThread['forum_id'])
->getForum();
if ($this->request()->get('approve') && (Phpfox::getUserParam('forum.can_approve_forum_thread') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'approve_thread')) && $aThread['view_id'])
{
$sCurrentUrl = $this->url()->permalink('forum.thread', $aThread['thread_id'], $aThread['title']);
if (Forum_Service_Thread_Process::instance()->approve($aThread['thread_id'], $sCurrentUrl))
{
$this->url()->forward($sCurrentUrl);
}
}
if ($iPostId = $this->request()->getInt('post'))
{
$iCurrentPage = Forum_Service_Post_Post::instance()->getPostPage($aThread['thread_id'], $iPostId, $iPageSize);
$sFinalLink = $this->url()->permalink('forum.thread', $aThread['thread_id'], $aThread['title'], false, null, array('page' => $iCurrentPage));
$this->url()->forward($sFinalLink . '#post' . $iPostId);
}
Forum_Service_Thread_Process::instance()->updateTrack($aThread['thread_id']);
if (Phpfox::isModule('tag') && $aCallback === null)
{
$aTags = Tag_Service_Tag::instance()->getTagsById(($aCallback === null ? 'forum' : 'forum_group'), $aThread['thread_id']);
if (isset($aTags[$aThread['thread_id']]))
{
$aThread['tag_list'] = $aTags[$aThread['thread_id']];
}
}
// Add tags to meta keywords
if (!empty($aThread['tag_list']) && $aThread['tag_list'] && Phpfox::isModule('tag'))
{
$this->template()->setMeta('keywords', Tag_Service_Tag::instance()->getKeywords($aThread['tag_list']));
}
$this->setParam('iActiveForumId', $aForum['forum_id']);
if (Phpfox::getParam('forum.rss_feed_on_each_forum'))
{
if ($aCallback === null)
{
$this->template()->setHeader('<link rel="alternate" type="application/rss+xml" title="' . _p('forum') . ': ' . $aForum['name'] . '" href="' . $this->url()->makeUrl('forum', array('rss', 'forum' => $aForum['forum_id'])) . '" />');
}
else
{
$this->template()->setHeader('<link rel="alternate" type="application/rss+xml" title="' . _p('group_forum') . ': ' . $aCallback['title'] . '" href="' . $this->url()->makeUrl('forum', array('rss', 'group' => $aCallback['group_id'])) . '" />');
}
}
if (Phpfox::getParam('forum.enable_rss_on_threads'))
{
$this->template()->setHeader('<link rel="alternate" type="application/rss+xml" title="' . _p('thread') . ': ' . $aThread['title'] . '" href="' . $this->url()->makeUrl('forum', array('rss', 'thread' => $aThread['thread_id'])) . '" />');
}
if ($aCallback === null)
{
$this->template()->setBreadCrumb(_p('forum'), $this->url()->makeUrl('forum'))
->setBreadCrumb($aForum['breadcrumb'])->setBreadCrumb(Phpfox_Locale::instance()->convert(Phpfox::getSoftPhrase($aForum['name'])), $this->url()->permalink('forum', $aForum['forum_id'], $aForum['name']));
}
else
{
$this->template()->setBreadCrumb((isset($aCallback['module_title']) ? $aCallback['module_title'] : _p('pages')), $this->url()->makeUrl($aCallback['module']));
$this->template()->setBreadCrumb($aCallback['title'], $aCallback['url_home']);
$this->template()->setBreadCrumb(_p('discussions'), $aCallback['url_home'] . 'forum/');
}
$bCanManageThread = false;
$bCanEditThread = false;
$bCanDeleteThread = false;
$bCanStickThread = false;
$bCanCloseThread = false;
$bCanMergeThread = false;
if ($aCallback === null)
{
if (((Phpfox::getUserParam('forum.can_edit_own_post') && $aThread['user_id'] == Phpfox::getUserId()) || Phpfox::getUserParam('forum.can_edit_other_posts') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'edit_post')))
{
$bCanEditThread = true;
}
if ((Phpfox::getUserParam('forum.can_delete_own_post') && $aThread['user_id'] == Phpfox::getUserId()) || Phpfox::getUserParam('forum.can_delete_other_posts') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'delete_post'))
{
$bCanDeleteThread = true;
}
if ((Phpfox::getUserParam('forum.can_stick_thread') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'post_sticky')))
{
$bCanStickThread = true;
}
if ((Phpfox::getUserParam('forum.can_close_a_thread') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'close_thread')))
{
$bCanCloseThread = true;
}
if ((Phpfox::getUserParam('forum.can_merge_forum_threads') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'merge_thread')))
{
$bCanMergeThread = true;
}
if (
((Phpfox::getUserParam('forum.can_edit_own_post') && $aThread['user_id'] == Phpfox::getUserId()) || Phpfox::getUserParam('forum.can_edit_other_posts') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'edit_post'))
|| (Phpfox::getUserParam('forum.can_move_forum_thread') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'move_thread'))
|| (Phpfox::getUserParam('forum.can_copy_forum_thread') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'copy_thread'))
|| (Phpfox::getUserParam('forum.can_delete_own_post') && $aThread['user_id'] == Phpfox::getUserId()) || Phpfox::getUserParam('forum.can_delete_other_posts') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'delete_post')
|| (Phpfox::getUserParam('forum.can_stick_thread') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'post_sticky'))
|| (Phpfox::getUserParam('forum.can_close_a_thread') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'close_thread'))
|| (Phpfox::getUserParam('forum.can_merge_forum_threads') || Forum_Service_Moderate_Moderate::instance()->hasAccess($aThread['forum_id'], 'merge_thread'))
)
{
$bCanManageThread = true;
}
}
else
{
if (Phpfox::isAdmin() || Phpfox::getService($aCallback['module'])->isAdmin($aCallback['item']))
{
$bCanEditThread = true;
$bCanDeleteThread = true;
$bCanStickThread = true;
$bCanCloseThread = true;
$bCanMergeThread = true;
$bCanManageThread = true;
}
}
$bCanPurchaseSponsor = false;
if (
((Phpfox::getUserParam('forum.can_purchase_sponsor') && $aThread['user_id'] == Phpfox::getUserId())
|| ($bCanCloseThread || $bCanStickThread)
|| Phpfox::getUserParam('forum.can_sponsor_thread')
) && !defined('PHPFOX_IS_GROUP_VIEW') && Phpfox::isModule('ad')) // sponsor is disabled in groups
{
$bCanPurchaseSponsor = true;
}
$sCurrentThreadLink = ($aCallback === null ? $this->url()->makeUrl('forum', array($aForum['name_url'] . '-' . $aForum['forum_id'], $aThread['title_url'])) : $this->url()->makeUrl($aCallback['url_home'], $aThread['title_url']));
if ($this->request()->get('view')) {
Phpfox_Module::instance()->appendPageClass('single_mode');
}
if (Phpfox::isUser() && Forum_Service_Thread_Thread::instance()->canReplyOnThread($aThread['thread_id'])) {
$this->template()->menu(_p('reply'), '#', 'onclick="$Core.box(\'forum.reply\', 800, \'id=' . $aThread['thread_id'] . '\'); return false;"');
}
$aJsLoad = array(
'jquery/plugin/jquery.scrollTo.js' => 'static_script',
'forum.js' => 'module_forum',
'jquery/plugin/jquery.highlightFade.js' => 'static_script',
'switch_legend.js' => 'static_script',
'switch_menu.js' => 'static_script',
);
if (!empty($aThread['poll'])) {
$aJsLoad = array_merge($aJsLoad, ['poll.js' => 'module_poll', 'poll.css' => 'module_poll',]);
}
$this->template()->setTitle($aThread['title'])
->setBreadCrumb($aThread['title'], $this->url()->permalink('forum.thread', $aThread['thread_id'], $aThread['title']), true)
->setMeta('description', $aThread['title'] . ' - ' . $aForum['name'])
->setMeta('keywords', $this->template()->getKeywords($aThread['title']))
->setPhrase(array(
'provide_a_reply',
'adding_your_reply',
'are_you_sure',
'post_successfully_deleted'
)
)
->setEditor()
->setHeader('cache', $aJsLoad
)
->assign(array(
'aThread' => $aThread,
'aPost' => (isset($aThread['post_starter']) ? $aThread['post_starter'] : ''),
'iTotalPosts' => $iCnt,
'sCurrentThreadLink' => $sCurrentThreadLink,
'aCallback' => $aCallback,
'bCanManageThread' => $bCanManageThread,
'bCanEditThread' => $bCanEditThread,
'bCanDeleteThread' => $bCanDeleteThread,
'bCanStickThread' => $bCanStickThread,
'bCanCloseThread' => $bCanCloseThread,
'bCanMergeThread' => $bCanMergeThread,
'bCanPurchaseSponsor' => $bCanPurchaseSponsor,
'sPermaView' => $sPermaView,
'aPoll' => (empty($aThread['poll']) ? false : $aThread['poll']),
'bIsViewingPoll' => true,
'bIsCustomPoll' => true,
'sMicroPropType' => 'CreativeWork'
)
);
if (!empty($aThread['post_starter'])) {
$this->template()->setMeta('description', ' - ' . $aThread['post_starter']['text']);
}
$this->setParam('global_moderation', array(
'name' => 'forumpost',
'ajax' => 'forum.postModeration',
'menu' => array(
array(
'phrase' => _p('delete'),
'action' => 'delete'
)
)
)
);
Phpfox::getLib('parse.output')->setEmbedParser(array(
'width' => 640,
'height' => 360
)
);
if ($this->request()->get('is_ajax_get')) {
$this->template()->assign('isReplies', true);
Phpfox_Module::instance()->getControllerTemplate();
$content = ob_get_contents();
ob_clean();
return [
'run' => "$('.thread_replies .tr_view_all').remove();",
'html' => [
'to' => '.tr_content',
'with' => $content
]
];
}
return null;
}
/**
* Garbage collector. Is executed after this class has completed
* its job and the template has also been displayed.
*/
public function clean()
{
(($sPlugin = Phpfox_Plugin::get('forum.component_controller_thread_clean')) ? eval($sPlugin) : false);
}
}