Вход Регистрация
Файл: library/XenForo/ControllerPublic/Forum.php
Строк: 1110
<?php

/**
 * Controller for handling actions on forums.
 *
 * @package XenForo_Forum
 */
class XenForo_ControllerPublic_Forum extends XenForo_ControllerPublic_Abstract
{
    
/**
     * Adds 'forum' to the list of $containerParams if it exists in $params
     */
    
protected function _postDispatch($controllerResponse$controllerName$action)
    {
        if (isset(
$controllerResponse->params['forum']))
        {
            
$controllerResponse->containerParams['forum'] = $controllerResponse->params['forum'];
        }
    }

    public function 
actionIndex()
    {
        
$forumId $this->_input->filterSingle('node_id'XenForo_Input::UINT);
        
$forumName $this->_input->filterSingle('node_name'XenForo_Input::STRING);
        if (
$forumId || $forumName)
        {
            return 
$this->responseReroute(__CLASS__'forum');
        }

        if (
$this->_routeMatch->getResponseType() == 'rss')
        {
            return 
$this->getGlobalForumRss();
        }

        
$this->canonicalizeRequestUrl(
            
XenForo_Link::buildPublicLink('forums')
        );

        
$viewParams = array(
            
'nodeList' => $this->_getNodeModel()->getNodeDataForListDisplay(false0),
            
'onlineUsers' => $this->_getSessionActivityList(),
            
'boardTotals' => $this->_getBoardTotals()
        );

        return 
$this->responseView('XenForo_ViewPublic_Forum_List''forum_list'$viewParams);
    }

    protected function 
_getSessionActivityList()
    {
        
$visitor XenForo_Visitor::getInstance();

        
/** @var $sessionModel XenForo_Model_Session */
        
$sessionModel $this->getModelFromCache('XenForo_Model_Session');

        return 
$sessionModel->getSessionActivityQuickList(
            
$visitor->toArray(),
            array(
'cutOff' => array('>'$sessionModel->getOnlineStatusTimeout())),
            (
$visitor['user_id'] ? $visitor->toArray() : null)
        );

    }

    protected function 
_getBoardTotals()
    {
        
$boardTotals $this->getModelFromCache('XenForo_Model_DataRegistry')->get('boardTotals');
        if (!
$boardTotals)
        {
            
$boardTotals $this->getModelFromCache('XenForo_Model_Counters')->rebuildBoardTotalsCounter();
        }

        return 
$boardTotals;
    }

    
/**
     * Displays the contents of a forum.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionForum()
    {
        
$forumId $this->_input->filterSingle('node_id'XenForo_Input::UINT);
        
$forumName $this->_input->filterSingle('node_name'XenForo_Input::STRING);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        
$forum $this->getHelper('ForumThreadPost')->assertForumValidAndViewable(
            
$forumId $forumId $forumName,
            
$this->_getForumFetchOptions()
        );
        
$forumId $forum['node_id'];

        
$visitor XenForo_Visitor::getInstance();
        
$threadModel $this->_getThreadModel();
        
$forumModel $this->_getForumModel();

        
$page max(1$this->_input->filterSingle('page'XenForo_Input::UINT));
        
$threadsPerPage XenForo_Application::get('options')->discussionsPerPage;

        
$this->canonicalizeRequestUrl(
            
XenForo_Link::buildPublicLink('forums'$forum, array('page' => $page))
        );

        list(
$defaultOrder$defaultOrderDirection) = $this->_getDefaultThreadSort($forum);

        
$order $this->_input->filterSingle('order'XenForo_Input::STRING, array('default' => $defaultOrder));
        
$orderDirection $this->_input->filterSingle('direction'XenForo_Input::STRING, array('default' => $defaultOrderDirection));

        
$displayConditions $this->_getDisplayConditions($forum);

        
$fetchElements $this->_getThreadFetchElements($forum$displayConditions);
        
$threadFetchConditions $fetchElements['conditions'];
        
$threadFetchOptions $fetchElements['options'] + array(
            
'perPage' => $threadsPerPage,
            
'page' => $page,
            
'order' => $order,
            
'orderDirection' => $orderDirection
        
);
        unset(
$fetchElements);

        
$totalThreads $threadModel->countThreadsInForum($forumId$threadFetchConditions);

        
$this->canonicalizePageNumber($page$threadsPerPage$totalThreads'forums'$forum);

        
$threads $threadModel->getThreadsInForum($forumId$threadFetchConditions$threadFetchOptions);

        if (
$page == 1)
        {
            
$stickyThreadFetchOptions $threadFetchOptions;
            unset(
$stickyThreadFetchOptions['perPage'], $stickyThreadFetchOptions['page']);

            
$stickyThreads $threadModel->getStickyThreadsInForum($forumId$threadFetchConditions$stickyThreadFetchOptions);
        }
        else
        {
            
$stickyThreads = array();
        }

        
// prepare all threads for the thread list
        
$inlineModOptions = array();
        
$permissions $visitor->getNodePermissions($forumId);

        foreach (
$threads AS &$thread)
        {
            
$threadModOptions $threadModel->addInlineModOptionToThread($thread$forum$permissions);
            
$inlineModOptions += $threadModOptions;

            
$thread $threadModel->prepareThread($thread$forum$permissions);
        }
        foreach (
$stickyThreads AS &$thread)
        {
            
$threadModOptions $threadModel->addInlineModOptionToThread($thread$forum$permissions);
            
$inlineModOptions += $threadModOptions;

            
$thread $threadModel->prepareThread($thread$forum$permissions);
        }
        unset(
$thread);

        
// if we've read everything on the first page of a normal sort order, probably need to mark as read
        
if ($visitor['user_id'] && $page == && !$displayConditions
            
&& $order == 'last_post_date' && $orderDirection == 'desc'
            
&& $forum['forum_read_date'] < $forum['last_post_date']
        )
        {
            
$hasNew false;
            foreach (
$threads AS $thread)
            {
                if (
$thread['isNew'] && !$thread['isIgnored'])
                {
                    
$hasNew true;
                    break;
                }
            }

            if (!
$hasNew)
            {
                
// everything read, but forum not marked as read. Let's check.
                
$this->_getForumModel()->markForumReadIfNeeded($forum);
            }
        }

        
// get the ordering params set for the header links
        
$orderParams = array();
        foreach (
$this->_getThreadSortFields($forum) AS $field)
        {
            
$orderParams[$field] = $displayConditions;
            
$orderParams[$field]['order'] = ($field != $defaultOrder $field false);
            if (
$order == $field)
            {
                
$orderParams[$field]['direction'] = ($orderDirection == 'desc' 'asc' 'desc');
            }
        }

        
$pageNavParams $displayConditions;
        
$pageNavParams['order'] = ($order != $defaultOrder $order false);
        
$pageNavParams['direction'] = ($orderDirection != $defaultOrderDirection $orderDirection false);

        
$viewParams = array(
            
'nodeList' => $this->_getNodeModel()->getNodeDataForListDisplay($forum0),
            
'forum' => $forum,
            
'nodeBreadCrumbs' => $ftpHelper->getNodeBreadCrumbs($forumfalse),

            
'canPostThread' => $forumModel->canPostThreadInForum($forum),
            
'canSearch' => $visitor->canSearch(),
            
'canWatchForum' => $forumModel->canWatchForum($forum),

            
'inlineModOptions' => $inlineModOptions,
            
'threads' => $threads,
            
'stickyThreads' => $stickyThreads,

            
'ignoredNames' => $this->_getIgnoredContentUserNames($threads) + $this->_getIgnoredContentUserNames($stickyThreads),

            
'order' => $order,
            
'orderDirection' => $orderDirection,
            
'orderParams' => $orderParams,
            
'displayConditions' => $displayConditions,

            
'pageNavParams' => $pageNavParams,
            
'page' => $page,
            
'threadStartOffset' => ($page 1) * $threadsPerPage 1,
            
'threadEndOffset' => ($page 1) * $threadsPerPage count($threads),
            
'threadsPerPage' => $threadsPerPage,
            
'totalThreads' => $totalThreads,

            
'showPostedNotice' => $this->_input->filterSingle('posted'XenForo_Input::UINT)
        );

        return 
$this->responseView('XenForo_ViewPublic_Forum_View''forum_view'$viewParams);
    }

    protected function 
_getForumFetchOptions()
    {
        
$userId XenForo_Visitor::getUserId();

        return array(
            
'readUserId' => $userId,
            
'watchUserId' => $userId
        
);
    }

    protected function 
_getDisplayConditions(array $forum)
    {
        
$displayConditions = array();

        
$prefixId $this->_input->filterSingle('prefix_id'XenForo_Input::UINT);
        if (
$prefixId)
        {
            
$displayConditions['prefix_id'] = $prefixId;
        }

        return 
$displayConditions;
    }

    protected function 
_getThreadFetchElements(array $forum, array $displayConditions)
    {
        
$threadModel $this->_getThreadModel();
        
$visitor XenForo_Visitor::getInstance();

        
$threadFetchConditions $displayConditions $threadModel->getPermissionBasedThreadFetchConditions($forum);

        if (
$this->_routeMatch->getResponseType() != 'rss')
        {
            
$threadFetchConditions += array('sticky' => 0);
        }

        
$threadFetchOptions = array(
            
'join' => XenForo_Model_Thread::FETCH_USER,
            
'readUserId' => $visitor['user_id'],
            
'watchUserId' => $visitor['user_id'],
            
'postCountUserId' => $visitor['user_id'],
        );
        if (!empty(
$threadFetchConditions['deleted']))
        {
            
$threadFetchOptions['join'] |= XenForo_Model_Thread::FETCH_DELETION_LOG;
        }

        if (
$this->getResponseType() == 'rss')
        {
            
$threadFetchOptions['join'] |= XenForo_Model_Thread::FETCH_FIRSTPOST;
        }

        return array(
            
'conditions' => $threadFetchConditions,
            
'options' => $threadFetchOptions
        
);
    }

    protected function 
_getDefaultThreadSort(array $forum)
    {
        return array(
$forum['default_sort_order'], $forum['default_sort_direction']);
    }

    protected function 
_getThreadSortFields(array $forum)
    {
        return array(
'title''post_date''reply_count''view_count''last_post_date');
    }

    
/**
     * Gets the data for the global forum RSS feed.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function getGlobalForumRss()
    {
        
$threadModel $this->_getThreadModel();
        
$visitor XenForo_Visitor::getInstance();

        
$threadsPerPage max(1XenForo_Application::get('options')->discussionsPerPage);
        
$autoReadDate XenForo_Application::$time - (XenForo_Application::get('options')->readMarkingDataLifetime 86400);

        
$threads $threadModel->getThreads(
            array(
'find_new' => true'last_post_date' => array('>'$autoReadDate)),
            array(
                
'limit' => $threadsPerPage 3// to filter
                
'order' => 'last_post_date',
                
'join' =>
                    
XenForo_Model_Thread::FETCH_FORUM XenForo_Model_Thread::FETCH_FORUM_OPTIONS |
                    
XenForo_Model_Thread::FETCH_USER XenForo_Model_Thread::FETCH_FIRSTPOST,
                
'permissionCombinationId' => $visitor['permission_combination_id']
            )
        );
        foreach (
$threads AS $key => &$thread)
        {
            
$thread['permissions'] = XenForo_Permission::unserializePermissions($thread['node_permission_cache']);

            if (!
$threadModel->canViewThreadAndContainer($thread$thread$null$thread['permissions']))
            {
                unset(
$threads[$key]);
            }
        }
        
$threads array_slice($threads0$threadsPerPagetrue);

        foreach (
$threads AS &$thread)
        {
            
$thread $threadModel->prepareThread($thread$thread$thread['permissions']);
        }

        
$viewParams = array(
            
'threads' => $threads,
        );
        return 
$this->responseView('XenForo_ViewPublic_Forum_GlobalRss'''$viewParams);
    }

    
/**
     * Displays a confirmation of watching (or stopping the watch of) a forum.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionWatch()
    {
        
$forumId $this->_input->filterSingle('node_id'XenForo_Input::UINT);
        
$forumName $this->_input->filterSingle('node_name'XenForo_Input::STRING);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        
$forum $this->getHelper('ForumThreadPost')->assertForumValidAndViewable(
            
$forumId $forumId $forumName,
            
$this->_getForumFetchOptions()
        );
        
$forumId $forum['node_id'];

        if (!
$this->_getForumModel()->canWatchForum($forum))
        {
            return 
$this->responseNoPermission();
        }

        
/** @var $forumWatchModel XenForo_Model_ForumWatch */
        
$forumWatchModel $this->getModelFromCache('XenForo_Model_ForumWatch');

        if (
$this->isConfirmedPost())
        {
            if (
$this->_input->filterSingle('stop'XenForo_Input::STRING))
            {
                
$notifyOn 'delete';
            }
            else
            {
                
$notifyOn $this->_input->filterSingle('notify_on'XenForo_Input::STRING);
                if (
$notifyOn)
                {
                    if (
$forum['allowed_watch_notifications'] == 'none')
                    {
                        
$notifyOn '';
                    }
                    else if (
$forum['allowed_watch_notifications'] == 'thread' && $notifyOn == 'message')
                    {
                        
$notifyOn 'thread';
                    }
                }
            }

            
$sendAlert $this->_input->filterSingle('send_alert'XenForo_Input::BOOLEAN);
            
$sendEmail $this->_input->filterSingle('send_email'XenForo_Input::BOOLEAN);

            
$forumWatchModel->setForumWatchState(
                
XenForo_Visitor::getUserId(), $forumId,
                
$notifyOn$sendAlert$sendEmail
            
);

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildPublicLink('forums'$forum),
                
null,
                array(
'linkPhrase' => ($notifyOn != 'delete' ? new XenForo_Phrase('unwatch_forum') : new XenForo_Phrase('watch_forum')))
            );
        }
        else
        {
            
$forumWatch $forumWatchModel->getUserForumWatchByForumId(
                
XenForo_Visitor::getUserId(), $forumId
            
);

            
$viewParams = array(
                
'forum' => $forum,
                
'forumWatch' => $forumWatch,
                
'nodeBreadCrumbs' => $ftpHelper->getNodeBreadCrumbs($forum),
            );

            return 
$this->responseView('XenForo_ViewPublic_Forum_Watch''forum_watch'$viewParams);
        }
    }

    
/**
     * Displays a form to create a new thread in this forum.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionCreateThread()
    {
        
$forumId $this->_input->filterSingle('node_id'XenForo_Input::UINT);
        
$forumName $this->_input->filterSingle('node_name'XenForo_Input::STRING);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        
$forum $ftpHelper->assertForumValidAndViewable($forumId $forumId $forumName);

        
$forumId $forum['node_id'];

        
$this->_assertCanPostThreadInForum($forum);

        
$maxResponses XenForo_Application::get('options')->pollMaximumResponses;
        if (
$maxResponses == 0)
        {
            
$maxResponses 10// number to create for non-JS users
        
}
        if (
$maxResponses 2)
        {
            
$pollExtraArray array_fill(0$maxResponses 2true);
        }
        else
        {
            
$pollExtraArray = array();
        }

        
$title $this->_input->filterSingle('title'XenForo_Input::STRING);
        
$prefixId $this->_input->filterSingle('prefix_id'XenForo_Input::STRING);
        
$draft $this->_getDraftModel()->getDraftByUserKey("forum-$forumId"XenForo_Visitor::getUserId());
        
$attachmentHash null;

        if (!
$prefixId)
        {
            
$prefixId $forum['default_prefix_id'];
        }

        if (
$draft)
        {
            
$extra = @unserialize($draft['extra_data']);
            if (!empty(
$extra['prefix_id']) && !$prefixId)
            {
                
$prefixId $extra['prefix_id'];
            }
            if (!empty(
$extra['title']) && !$title)
            {
                
$title $extra['title'];
            }

            if (!empty(
$extra['attachment_hash']))
            {
                
$attachmentHash $extra['attachment_hash'];
            }
        }

        
$attachmentParams $this->_getForumModel()->getAttachmentParams($forum, array(
            
'node_id' => $forum['node_id']
        ), 
nullnull$attachmentHash);

        
$viewParams = array(
            
'thread' => array(
                
'discussion_open' => 1,
                
'prefix_id' => $forum['default_prefix_id'],
            ),
            
'forum' => $forum,
            
'nodeBreadCrumbs' => $ftpHelper->getNodeBreadCrumbs($forum),

            
'title' => $title,
            
'prefixId' => $prefixId,
            
'draft' => $draft,

            
'prefixes' => $this->_getPrefixModel()->getUsablePrefixesInForums($forumId),

            
'attachmentParams' => $attachmentParams,

            
'watchState' => $this->_getThreadWatchModel()->getThreadWatchStateForVisitor(false),

            
'captcha' => XenForo_Captcha_Abstract::createDefault(),

            
'pollExtraArray' => $pollExtraArray,

            
'canLockUnlockThread' => $this->_getForumModel()->canLockUnlockThreadInForum($forum),
            
'canStickUnstickThread' => $this->_getForumModel()->canStickUnstickThreadInForum($forum),

            
'attachmentConstraints' => $this->getModelFromCache('XenForo_Model_Attachment')->getAttachmentConstraints(),
        );
        return 
$this->responseView('XenForo_ViewPublic_Thread_Create''thread_create'$viewParams);
    }

    
/**
     * Inserts a new thread into this forum.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionAddThread()
    {
        
$this->_assertPostOnly();

        
$forumId $this->_input->filterSingle('node_id'XenForo_Input::UINT);
        
$forumName $this->_input->filterSingle('node_name'XenForo_Input::STRING);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        
$forum $ftpHelper->assertForumValidAndViewable($forumId $forumId $forumName);

        
$forumId $forum['node_id'];

        
$this->_assertCanPostThreadInForum($forum);

        if (!
XenForo_Captcha_Abstract::validateDefault($this->_input))
        {
            return 
$this->responseCaptchaFailed();
        }

        
$visitor XenForo_Visitor::getInstance();

        
$input $this->_input->filter(array(
            
'title' => XenForo_Input::STRING,
            
'prefix_id' => XenForo_Input::UINT,
            
'attachment_hash' => XenForo_Input::STRING,

            
'watch_thread_state' => XenForo_Input::UINT,
            
'watch_thread' => XenForo_Input::UINT,
            
'watch_thread_email' => XenForo_Input::UINT,

            
'_set' => array(XenForo_Input::UINT'array' => true),
            
'discussion_open' => XenForo_Input::UINT,
            
'sticky' => XenForo_Input::UINT,

            
'poll' => XenForo_Input::ARRAY_SIMPLE// filtered below
        
));
        
$input['message'] = $this->getHelper('Editor')->getMessageText('message'$this->_input);
        
$input['message'] = XenForo_Helper_String::autoLinkBbCode($input['message']);

        if (!
$this->_getPrefixModel()->verifyPrefixIsUsable($input['prefix_id'], $forumId))
        {
            
$input['prefix_id'] = 0// not usable, just blank it out
        
}

        
$pollInputHandler = new XenForo_Input($input['poll']);
        
$pollInput $pollInputHandler->filter(array(
            
'question' => XenForo_Input::STRING,
            
'responses' => array(XenForo_Input::STRING'array' => true),
            
'multiple' => XenForo_Input::UINT,
            
'public_votes' => XenForo_Input::UINT,
            
'close' => XenForo_Input::UINT,
            
'close_length' => XenForo_Input::UNUM,
            
'close_units' => XenForo_Input::STRING
        
));

        
// note: assumes that the message dw will pick up the username issues
        
$writer XenForo_DataWriter::create('XenForo_DataWriter_Discussion_Thread');
        
$writer->bulkSet(array(
            
'user_id' => $visitor['user_id'],
            
'username' => $visitor['username'],
            
'title' => $input['title'],
            
'prefix_id' => $input['prefix_id'],
            
'node_id' => $forumId
        
));

        
// discussion state changes instead of first message state
        
$writer->set('discussion_state'$this->getModelFromCache('XenForo_Model_Post')->getPostInsertMessageState(array(), $forum));

        
// discussion open state - moderator permission required
        
if (!empty($input['_set']['discussion_open']) && $this->_getForumModel()->canLockUnlockThreadInForum($forum))
        {
            
$writer->set('discussion_open'$input['discussion_open']);
        }

        
// discussion sticky state - moderator permission required
        
if (!empty($input['_set']['sticky']) && $this->_getForumModel()->canStickUnstickThreadInForum($forum))
        {
            
$writer->set('sticky'$input['sticky']);
        }

        
$postWriter $writer->getFirstMessageDw();
        
$postWriter->set('message'$input['message']);
        
$postWriter->setExtraData(XenForo_DataWriter_DiscussionMessage::DATA_ATTACHMENT_HASH$input['attachment_hash']);
        
$postWriter->setExtraData(XenForo_DataWriter_DiscussionMessage_Post::DATA_FORUM$forum);
        
$postWriter->setOption(XenForo_DataWriter_DiscussionMessage_Post::OPTION_MAX_TAGGED_USERS$visitor->hasPermission('general''maxTaggedUsers'));

        
$writer->setExtraData(XenForo_DataWriter_Discussion_Thread::DATA_FORUM$forum);

        if (
$pollInput['question'] !== '')
        {
            
$pollWriter XenForo_DataWriter::create('XenForo_DataWriter_Poll');
            
$pollWriter->bulkSet(
                
XenForo_Application::arrayFilterKeys($pollInput, array('question''multiple''public_votes'))
            );
            
$pollWriter->set('content_type''thread');
            
$pollWriter->set('content_id'0); // changed before saving
            
if ($pollInput['close'])
            {
                if (!
$pollInput['close_length'])
                {
                    
$pollWriter->error(new XenForo_Phrase('please_enter_valid_length_of_time'));
                }
                else
                {
                    
$pollWriter->set('close_date'$pollWriter->preVerifyCloseDate(strtotime('+' $pollInput['close_length'] . ' ' $pollInput['close_units'])));
                }
            }
            
$pollWriter->addResponses($pollInput['responses']);
            
$pollWriter->preSave();
            
$writer->mergeErrors($pollWriter->getErrors());

            
$writer->set('discussion_type''poll''', array('setAfterPreSave' => true));
        }
        else
        {
            
$pollWriter false;

            foreach (
$pollInput['responses'] AS $response)
            {
                if (
$response !== '')
                {
                    
$writer->error(new XenForo_Phrase('you_entered_poll_response_but_no_question'));
                    break;
                }
            }
        }

        
// TODO: check for required prefix in this node

        
$spamModel $this->_getSpamPreventionModel();

        if (!
$writer->hasErrors()
            && 
$writer->get('discussion_state') == 'visible'
            
&& $spamModel->visitorRequiresSpamCheck()
        )
        {
            switch (
$spamModel->checkMessageSpam($input['title'] . "n" $input['message'], array(), $this->_request))
            {
                case 
XenForo_Model_SpamPrevention::RESULT_MODERATED:
                    
$writer->set('discussion_state''moderated');
                    break;

                case 
XenForo_Model_SpamPrevention::RESULT_DENIED;
                    
$spamModel->logSpamTrigger('thread'null);
                    
$writer->error(new XenForo_Phrase('your_content_cannot_be_submitted_try_later'));
                    break;
            }
        }

        
$writer->preSave();

        if (
$forum['require_prefix'] && !$writer->get('prefix_id'))
        {
            
$writer->error(new XenForo_Phrase('please_select_a_prefix'), 'prefix_id');
        }

        if (!
$writer->hasErrors())
        {
            
$this->assertNotFlooding('post');
        }

        
$writer->save();

        
$thread $writer->getMergedData();

        if (
$pollWriter)
        {
            
$pollWriter->set('content_id'$thread['thread_id'], '', array('setAfterPreSave' => true));
            
$pollWriter->save();
        }

        
$spamModel->logContentSpamCheck('thread'$thread['thread_id']);
        
$spamModel->logSpamTrigger('thread'$thread['thread_id']);
        
$this->_getDraftModel()->deleteDraft('forum-' $forum['node_id']);

        
$this->_getThreadWatchModel()->setVisitorThreadWatchStateFromInput($thread['thread_id'], $input);

        
$this->_getThreadModel()->markThreadRead($thread$forumXenForo_Application::$time);

        if (!
$this->_getThreadModel()->canViewThread($thread$forum))
        {
            
$return XenForo_Link::buildPublicLink('forums'$forum, array('posted' => 1));
        }
        else
        {
            
$return XenForo_Link::buildPublicLink('threads'$thread);
        }

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::SUCCESS,
            
$return,
            new 
XenForo_Phrase('your_thread_has_been_posted')
        );
    }

    
/**
     * Shows a preview of the thread creation.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionCreateThreadPreview()
    {
        
$this->_assertPostOnly();

        
$forumId $this->_input->filterSingle('node_id'XenForo_Input::UINT);
        
$forumName $this->_input->filterSingle('node_name'XenForo_Input::STRING);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        
$forum $ftpHelper->assertForumValidAndViewable($forumId $forumId $forumName);

        
$forumId $forum['node_id'];

        
$this->_assertCanPostThreadInForum($forum);

        
$message $this->getHelper('Editor')->getMessageText('message'$this->_input);
        
$message XenForo_Helper_String::autoLinkBbCode($message);

        
/** @var $taggingModel XenForo_Model_UserTagging */
        
$taggingModel $this->getModelFromCache('XenForo_Model_UserTagging');
        
$taggingModel->getTaggedUsersInMessage($message$message);

        
$viewParams = array(
            
'forum' => $forum,
            
'message' => $message
        
);

        return 
$this->responseView('XenForo_ViewPublic_Thread_CreatePreview''thread_create_preview'$viewParams);
    }

    public function 
actionSaveDraft()
    {
        
$this->_assertPostOnly();

        
$forumId $this->_input->filterSingle('node_id'XenForo_Input::UINT);
        
$forumName $this->_input->filterSingle('node_name'XenForo_Input::STRING);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        
$forum $ftpHelper->assertForumValidAndViewable($forumId $forumId $forumName);

        
$forumId $forum['node_id'];

        
$this->_assertCanPostThreadInForum($forum);

        
$extra $this->_input->filter(array(
            
'title' => XenForo_Input::STRING,
            
'prefix_id' => XenForo_Input::UINT,
            
'attachment_hash' => XenForo_Input::STRING,

            
'watch_thread_state' => XenForo_Input::UINT,
            
'watch_thread' => XenForo_Input::UINT,
            
'watch_thread_email' => XenForo_Input::UINT,

            
'_set' => array(XenForo_Input::UINT'array' => true),
            
'discussion_open' => XenForo_Input::UINT,
            
'sticky' => XenForo_Input::UINT,

            
'poll' => XenForo_Input::ARRAY_SIMPLE// filtered below
        
));
        
$message $this->getHelper('Editor')->getMessageText('message'$this->_input);
        
$forceDelete $this->_input->filterSingle('delete_draft'XenForo_Input::BOOLEAN);

        if (!
strlen($message) || $forceDelete)
        {
            
$draftSaved false;
            
$draftDeleted $this->_getDraftModel()->deleteDraft("forum-$forumId") || $forceDelete;
        }
        else
        {
            
$this->_getDraftModel()->saveDraft("forum-$forumId"$message$extra);
            
$draftSaved true;
            
$draftDeleted false;
        }

        
$viewParams = array(
            
'forum' => $forum,
            
'draftSaved' => $draftSaved,
            
'draftDeleted' => $draftDeleted
        
);
        return 
$this->responseView('XenForo_ViewPublic_Forum_SaveDraft'''$viewParams);
    }

    public function 
actionMarkRead()
    {
        
$forumId $this->_input->filterSingle('node_id'XenForo_Input::UINT);
        
$forumName $this->_input->filterSingle('node_name'XenForo_Input::STRING);

        
$visitor XenForo_Visitor::getInstance();

        
$markDate $this->_input->filterSingle('date'XenForo_Input::UINT);
        if (!
$markDate)
        {
            
$markDate XenForo_Application::$time;
        }

        
$forumModel $this->_getForumModel();

        if (
$forumId || $forumName)
        {
            
// mark individual forum read
            
$ftpHelper $this->getHelper('ForumThreadPost');
            
$forum $ftpHelper->assertForumValidAndViewable(
                
$forumId $forumId $forumName, array('readUserId' => $visitor['user_id'])
            );

            
$forumId $forum['node_id'];

            if (
$this->isConfirmedPost())
            {
                
$forumModel->markForumTreeRead($forum$markDate);

                return 
$this->responseRedirect(
                    
XenForo_ControllerResponse_Redirect::SUCCESS,
                    
XenForo_Link::buildPublicLink('forums'$forum),
                    new 
XenForo_Phrase('forum_x_marked_as_read', array('forum' => $forum['title']))
                );
            }
            else
            {
                
$viewParams = array(
                    
'forum' => $forum,
                    
'markDate' => $markDate
                
);

                return 
$this->responseView('XenForo_ViewPublic_Forum_MarkRead''forum_mark_read'$viewParams);
            }
        }
        else
        {
            
// mark all forums read
            
if ($this->isConfirmedPost())
            {
                
$forumModel->markForumTreeRead(null$markDate);

                return 
$this->responseRedirect(
                    
XenForo_ControllerResponse_Redirect::SUCCESS,
                    
XenForo_Link::buildPublicLink('forums'),
                    new 
XenForo_Phrase('all_forums_marked_as_read')
                );
            }
            else
            {
                
$viewParams = array(
                    
'forum' => false,
                    
'markDate' => $markDate
                
);

                return 
$this->responseView('XenForo_ViewPublic_Forum_MarkRead''forum_mark_read'$viewParams);
            }
        }
    }

    
/**
     * Fetches a grouped list of all prefixes available to the specified forum
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionPrefixes()
    {
        
$this->_assertPostOnly();

        
$forumId $this->_input->filterSingle('node_id'XenForo_Input::UINT);
        
$forum $this->getHelper('ForumThreadPost')->assertForumValidAndViewable($forumId);

        
$viewParams = array(
            
'forum' => $forum,
            
'prefixGroups' => $this->_getPrefixModel()->getUsablePrefixesInForums($forum['node_id']),
        );

        return 
$this->responseView('XenForo_ViewPublic_Forum_Prefixes'''$viewParams);
    }

    
/**
     * Session activity details.
     * @see XenForo_Controller::getSessionActivityDetailsForList()
     */
    
public static function getSessionActivityDetailsForList(array $activities)
    {
        
$forumIds = array();
        
$nodeNames = array();
        foreach (
$activities AS $activity)
        {
            if (!empty(
$activity['params']['node_id']))
            {
                
$forumIds[$activity['params']['node_id']] = intval($activity['params']['node_id']);
            }
            else if (!empty(
$activity['params']['node_name']))
            {
                
$nodeNames[$activity['params']['node_name']] = $activity['params']['node_name'];
            }
        }

        if (
$nodeNames)
        {
            
$nodeNames XenForo_Model::create('XenForo_Model_Node')->getNodeIdsFromNames($nodeNames);

            foreach (
$nodeNames AS $nodeName => $nodeId)
            {
                
$forumIds[$nodeName] = $nodeId;
            }
        }

        
$forumData = array();

        if (
$forumIds)
        {
            
/* @var $forumModel XenForo_Model_Forum */
            
$forumModel XenForo_Model::create('XenForo_Model_Forum');

            
$visitor XenForo_Visitor::getInstance();
            
$permissionCombinationId $visitor['permission_combination_id'];

            
$forums $forumModel->getForumsByIds($forumIds, array(
                
'permissionCombinationId' => $permissionCombinationId
            
));
            foreach (
$forums AS $forum)
            {
                
$visitor->setNodePermissions($forum['node_id'], $forum['node_permission_cache']);
                if (
$forumModel->canViewForum($forum))
                {
                    
$forumData[$forum['node_id']] = array(
                        
'title' => $forum['title'],
                        
'url' => XenForo_Link::buildPublicLink('forums'$forum)
                    );
                }
            }
        }

        
$output = array();
        foreach (
$activities AS $key => $activity)
        {
            
$forum false;
            
$list false;
            if (!empty(
$activity['params']['node_id']))
            {
                
$nodeId $activity['params']['node_id'];
                if (isset(
$forumData[$nodeId]))
                {
                    
$forum $forumData[$nodeId];
                }
            }
            else if (!empty(
$activity['params']['node_name']))
            {
                
$nodeName $activity['params']['node_name'];
                if (isset(
$nodeNames[$nodeName]))
                {
                    
$nodeId $nodeNames[$nodeName];
                    if (isset(
$forumData[$nodeId]))
                    {
                        
$forum $forumData[$nodeId];
                    }
                }
            }
            else
            {
                
$list true;
            }

            if (
$forum)
            {
                
$output[$key] = array(
                    new 
XenForo_Phrase('viewing_forum'),
                    
$forum['title'],
                    
$forum['url'],
                    
false
                
);
            }
            else
            {
                
$output[$key] = $list ? new XenForo_Phrase('viewing_forum_list') : new XenForo_Phrase('viewing_forum');
            }
        }

        return 
$output;
    }

    
/**
     * Asserts that the currently browsing user can post a thread in
     * the specified forum.
     *
     * @param array $forum
     */
    
protected function _assertCanPostThreadInForum(array $forum)
    {
        if (!
$this->_getForumModel()->canPostThreadInForum($forum$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }
    }

    
/**
     * @return XenForo_Model_Forum
     */
    
protected function _getForumModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Forum');
    }

    
/**
     * @return XenForo_Model_Node
     */
    
protected function _getNodeModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Node');
    }

    
/**
     * @return XenForo_Model_Thread
     */
    
protected function _getThreadModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Thread');
    }

    
/**
     * @return XenForo_Model_ThreadWatch
     */
    
protected function _getThreadWatchModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_ThreadWatch');
    }

    
/**
     * @return XenForo_Model_ThreadPrefix
     */
    
protected function _getPrefixModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_ThreadPrefix');
    }

    
/**
     * @return XenForo_Model_SpamPrevention
     */
    
protected function _getSpamPreventionModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_SpamPrevention');
    }

    
/**
     * @return XenForo_Model_Draft
     */
    
protected function _getDraftModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Draft');
    }
}
Онлайн: 1
Реклама