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

/**
 * Controller for post-related actions.
 *
 * @package XenForo_Post
 */
class XenForo_ControllerPublic_Post extends XenForo_ControllerPublic_Abstract
{
    public function 
actionIndex()
    {
        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId);

        return 
$this->getPostSpecificRedirect(
            
$post$threadXenForo_ControllerResponse_Redirect::RESOURCE_CANONICAL_PERMANENT
        
);
    }

    
/**
     * Gets the redirect to a particular post in the specified thread.
     *
     * @param array $post
     * @param array $thread
     * @param constant $redirectType
     *
     * @return XenForo_ControllerResponse_Redirect
     */
    
public function getPostSpecificRedirect(array $post, array $thread,
        
$redirectType XenForo_ControllerResponse_Redirect::SUCCESS
    
)
    {
        
$page floor($post['position'] / XenForo_Application::get('options')->messagesPerPage) + 1;

        return 
$this->responseRedirect(
            
$redirectType,
            
XenForo_Link::buildPublicLink('threads'$thread, array('page' => $page)) . '#post-' $post['post_id']
        );
    }

    
/**
     * Displays a form to edit an existing post.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionEdit()
    {
        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId);
        
$this->_assertCanEditPost($post$thread$forum);

        
$postModel $this->_getPostModel();
        
$attachmentModel $this->_getAttachmentModel();

        
$attachmentParams $this->getModelFromCache('XenForo_Model_Forum')->getAttachmentParams($forum, array(
            
'post_id' => $post['post_id']
        ));

        
$attachments $attachmentModel->getAttachmentsByContentId('post'$postId);

        if (
$this->_input->inRequest('more_options'))
        {
            
$post['message'] = $this->getHelper('Editor')->getMessageText('message'$this->_input);
        }

        
$viewParams = array(
            
'post' => $post,
            
'thread' => $thread,
            
'forum' => $forum,
            
'nodeBreadCrumbs' => $ftpHelper->getNodeBreadCrumbs($forum),

            
'attachmentParams' => $attachmentParams,
            
'attachments' => $attachmentModel->prepareAttachments($attachments),
            
'attachmentConstraints' => $attachmentModel->getAttachmentConstraints(),

            
'watchState' => $this->_getThreadWatchModel()->getThreadWatchStateForVisitor($thread['thread_id'], false),

            
'canDeletePost' => $postModel->canDeletePost($post$thread$forum'soft'),
            
'canHardDeletePost' => $postModel->canDeletePost($post$thread$forum'hard'),
            
'canSilentEdit' => $postModel->canControlSilentEdit($post$thread$forum)
        );

        if (
$this->_input->inRequest('more_options'))
        {
            
$viewParams['silentEdit'] = $this->_input->filterSingle('silent'XenForo_Input::UINT);
            
$viewParams['clearEdit'] = $this->_input->filterSingle('clear_edit'XenForo_Input::UINT);
        }

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

    
/**
     * Updates an existing post.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionSave()
    {
        
$this->_assertPostOnly();

        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId);

        
$this->_assertCanEditPost($post$thread$forum);

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

            
'watch_thread_state' => XenForo_Input::UINT,
            
'watch_thread' => XenForo_Input::UINT,
            
'watch_thread_email' => XenForo_Input::UINT
        
));
        
$input['message'] = $this->getHelper('Editor')->getMessageText('message'$this->_input);
        
$input['message'] = XenForo_Helper_String::autoLinkBbCode($input['message']);

        
$dw XenForo_DataWriter::create('XenForo_DataWriter_DiscussionMessage_Post');
        
$dw->setExistingData($postId);
        
$dw->set('message'$input['message']);
        
$dw->setExtraData(XenForo_DataWriter_DiscussionMessage::DATA_ATTACHMENT_HASH$input['attachment_hash']);
        
$dw->setExtraData(XenForo_DataWriter_DiscussionMessage_Post::DATA_FORUM$forum);
        
$this->_setSilentEditOptions($post$thread$forum$dw);

        
$spamModel $this->_getSpamPreventionModel();

        if (!
$dw->hasErrors()
            && 
$dw->get('message_state') == 'visible'
            
&& $spamModel->visitorRequiresSpamCheck()
        )
        {
            
$spamExtraParams = array(
                
'permalink' => XenForo_Link::buildPublicLink('canonical:threads'$thread)
            );
            switch (
$spamModel->checkMessageSpam($input['message'], $spamExtraParams$this->_request))
            {
                case 
XenForo_Model_SpamPrevention::RESULT_MODERATED:
                case 
XenForo_Model_SpamPrevention::RESULT_DENIED;
                    
$spamModel->logSpamTrigger('post'$post['post_id']);
                    
$dw->error(new XenForo_Phrase('your_content_cannot_be_submitted_try_later'));
                    break;
            }
        }

        
$dw->save();

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

        
XenForo_Model_Log::logModeratorAction('post'$post'edit', array(), $thread);

        return 
$this->getPostSpecificRedirect($post$thread);
    }

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

        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId);

        
$this->_assertCanEditPost($post$thread$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(
            
'post' => $post,
            
'thread' => $thread,
            
'forum' => $forum,
            
'message' => $message
        
);

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

    
/**
     * Displays a simple form to edit an existing post inline
     *
     * @return XenForo_ControllerPublic_Abstract
     */
    
public function actionEditInline()
    {
        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId);
        
$this->_assertCanEditPost($post$thread$forum);

        
$postModel $this->_getPostModel();

        
$viewParams = array(
            
'post' => $post,
            
'thread' => $thread,
            
'forum' => $forum,
            
'nodeBreadCrumbs' => $ftpHelper->getNodeBreadCrumbs($forum),

            
'canSilentEdit' => $postModel->canControlSilentEdit($post$thread$forum)
        );

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

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

        if (
$this->_input->inRequest('more_options'))
        {
            return 
$this->responseReroute(__CLASS__'edit');
        }

        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId);

        
$this->_assertCanEditPost($post$thread$forum);

        
$dw XenForo_DataWriter::create('XenForo_DataWriter_DiscussionMessage_Post');
        
$dw->setExistingData($postId);
        
$dw->set('message',
            
XenForo_Helper_String::autoLinkBbCode(
                
$this->getHelper('Editor')->getMessageText('message'$this->_input)
            )
        );
        
$dw->setExtraData(XenForo_DataWriter_DiscussionMessage_Post::DATA_FORUM$forum);
        
$this->_setSilentEditOptions($post$thread$forum$dw);
        
$dw->save();

        
XenForo_Model_Log::logModeratorAction('post'$post'edit', array(), $thread);

        if (
$this->_noRedirect())
        {
            
$this->_request->setParam('thread_id'$thread['thread_id']);

            return 
$this->responseReroute('XenForo_ControllerPublic_Thread''show-posts');
        }
        else
        {
            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildPublicLink('posts'$post)
            );
        }
    }

    protected function 
_setSilentEditOptions(array $post, array $thread, array $forum,
        
XenForo_DataWriter_DiscussionMessage_Post $dw
    
)
    {
        if (
$this->_getPostModel()->canControlSilentEdit($post$thread$forum))
        {
            
$logEdit = !$this->_input->filterSingle('silent'XenForo_Input::UINT);
            
$dw->setOption(XenForo_DataWriter_DiscussionMessage_Post::OPTION_UPDATE_EDIT_DATE$logEdit);
            if (!
$logEdit && $this->_input->filterSingle('clear_edit'XenForo_Input::UINT))
            {
                
$dw->set('last_edit_date'0);
            }
        }
    }

    
/**
     * Deletes an existing post.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionDelete()
    {
        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId);

        
$hardDelete $this->_input->filterSingle('hard_delete'XenForo_Input::UINT);
        
$deleteType = ($hardDelete 'hard' 'soft');

        
$this->_assertCanDeletePost($post$thread$forum$deleteType);

        
$postModel $this->_getPostModel();

        if (
$this->isConfirmedPost()) // delete the post
        
{
            
$options = array(
                
'reason' => $this->_input->filterSingle('reason'XenForo_Input::STRING)
            );

            
$dw $postModel->deletePost($postId$deleteType$options$forum);

            if (
$post['post_id'] == $thread['first_post_id'])
            {
                
XenForo_Model_Log::logModeratorAction(
                    
'thread'$thread'delete_' $deleteType, array('reason' => $options['reason'])
                );
            }
            else
            {
                
XenForo_Model_Log::logModeratorAction(
                    
'post'$post'delete_' $deleteType, array('reason' => $options['reason']), $thread
                
);
            }

            
XenForo_Helper_Cookie::clearIdFromCookie($postId'inlinemod_posts');

            if (
$dw->discussionDeleted() || !$post['position'])
            {
                
XenForo_Helper_Cookie::clearIdFromCookie($thread['thread_id'], 'inlinemod_threads');

                return 
$this->responseRedirect(
                    
XenForo_ControllerResponse_Redirect::SUCCESS,
                    
XenForo_Link::buildPublicLink('forums'$forum)
                );
            }
            else
            {
                return 
$this->responseRedirect(
                    
XenForo_ControllerResponse_Redirect::SUCCESS,
                    
$this->getDynamicRedirect(XenForo_Link::buildPublicLink('threads'$thread))
                );
            }
        }
        else 
// show a deletion confirmation dialog
        
{
            
$viewParams = array(
                
'post' => $post,
                
'thread' => $thread,
                
'forum' => $forum,
                
'nodeBreadCrumbs' => $ftpHelper->getNodeBreadCrumbs($forum),

                
'canHardDelete' => $postModel->canDeletePost($post$thread$forum'hard'),

                
'redirect' => $this->getDynamicRedirect(XenForo_Link::buildPublicLink('threads'$thread))
            );

            return 
$this->responseView(
                
'XenForo_ViewPublic_Post_Delete',
                
'post_delete',
                
$viewParams
            
);
        }
    }

    public function 
actionHistory()
    {
        
$this->_request->setParam('content_type''post');
        
$this->_request->setParam('content_id'$this->_input->filterSingle('post_id'XenForo_Input::UINT));
        return 
$this->responseReroute('XenForo_ControllerPublic_EditHistory''index');
    }

    
/**
     * Displays a form to like a post or likes a post (via, uhh, POST).
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionLike()
    {
        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId);

        if (!
$this->_getPostModel()->canLikePost($post$thread$forum$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }

        
$likeModel $this->_getLikeModel();

        
$existingLike $likeModel->getContentLikeByLikeUser('post'$postIdXenForo_Visitor::getUserId());

        if (
$this->_request->isPost())
        {
            if (
$existingLike)
            {
                
$latestUsers $likeModel->unlikeContent($existingLike);
            }
            else
            {
                
$latestUsers $likeModel->likeContent('post'$postId$post['user_id']);
            }

            
$liked = ($existingLike false true);

            if (
$this->_noRedirect() && $latestUsers !== false)
            {
                
$post['likeUsers'] = $latestUsers;
                
$post['likes'] += ($liked : -1);
                
$post['like_date'] = ($liked XenForo_Application::$time 0);

                
$viewParams = array(
                    
'post' => $post,
                    
'thread' => $thread,
                    
'forum' => $forum,
                    
'liked' => $liked,
                );

                return 
$this->responseView('XenForo_ViewPublic_Post_LikeConfirmed'''$viewParams);
            }
            else
            {
                return 
$this->getPostSpecificRedirect($post$thread);
            }
        }
        else
        {
            
$viewParams = array(
                
'post' => $post,
                
'thread' => $thread,
                
'forum' => $forum,
                
'like' => $existingLike,
                
'nodeBreadCrumbs' => $ftpHelper->getNodeBreadCrumbs($forum)
            );

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

    
/**
     * List of everyone that liked this post.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionLikes()
    {
        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId);

        
$likes $this->_getLikeModel()->getContentLikes('post'$postId);
        if (!
$likes)
        {
            return 
$this->responseError(new XenForo_Phrase('no_one_has_liked_this_post_yet'));
        }

        
$viewParams = array(
            
'post' => $post,
            
'thread' => $thread,
            
'forum' => $forum,
            
'nodeBreadCrumbs' => $ftpHelper->getNodeBreadCrumbs($forum),

            
'likes' => $likes
        
);

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

    
/**
     * Reports this post.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionReport()
    {
        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId);

        if (!
$this->_getPostModel()->canReportPost($post$thread$forum$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }

        if (
$this->_request->isPost())
        {
            
$message $this->_input->filterSingle('message'XenForo_Input::STRING);
            if (!
$message)
            {
                return 
$this->responseError(new XenForo_Phrase('please_enter_reason_for_reporting_this_message'));
            }

            
$this->assertNotFlooding('report');

            
/* @var $reportModel XenForo_Model_Report */
            
$reportModel XenForo_Model::create('XenForo_Model_Report');
            
$reportModel->reportContent('post'$post$message);

            
$controllerResponse $this->getPostSpecificRedirect($post$thread);
            
$controllerResponse->redirectMessage = new XenForo_Phrase('thank_you_for_reporting_this_message');
            return 
$controllerResponse;
        }
        else
        {
            
$viewParams = array(
                
'post' => $post,
                
'thread' => $thread,
                
'forum' => $forum,
                
'nodeBreadCrumbs' => $ftpHelper->getNodeBreadCrumbs($forum),
            );

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

    
/**
     * Displays a form to add a reply to a thread.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionQuote()
    {
        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId,  array(
            
'join' => XenForo_Model_Post::FETCH_USER
        
));

        
$quote $this->_getPostModel()->getQuoteTextForPost($post);

        
$viewParams = array(
            
'thread' => $thread,
            
'forum' => $forum,
            
'post' => $post,
            
'quote' => $quote
        
);

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

    
/**
     * Displays the IP associated with a post
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionIp()
    {
        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId,  array(
            
'join' => XenForo_Model_Post::FETCH_USER
        
));

        if (!
$this->_getPostModel()->canViewIps($post$thread$forum$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }

        if (!
$post['ip_id'])
        {
            return 
$this->responseError(new XenForo_Phrase('no_ip_information_available'));
        }

        
$viewParams = array(
            
'forum' => $forum,
            
'thread' => $thread,
            
'post' => $post,
            
'nodeBreadCrumbs' => $ftpHelper->getNodeBreadCrumbs($forum),
            
'ipInfo' => $this->getModelFromCache('XenForo_Model_Ip')->getContentIpInfo($post)
        );

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

    
/**
     * Shows a dialog containing the permalink to a post
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionPermalink()
    {
        
$postId $this->_input->filterSingle('post_id'XenForo_Input::UINT);

        
$ftpHelper $this->getHelper('ForumThreadPost');
        list(
$post$thread$forum) = $ftpHelper->assertPostValidAndViewable($postId);

        
$viewParams = array(
            
'post' => $post,
            
'thread' => $thread,
            
'forum' => $forum,
        );

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

    
/**
     * Session activity details.
     * @see XenForo_Controller::getSessionActivityDetailsForList()
     */
    
public static function getSessionActivityDetailsForList(array $activities)
    {
        return new 
XenForo_Phrase('viewing_thread'); // no need to be more specific - this is a fairly infrequent event
    
}

    
/**
     * Asserts that the currently browsing user can edit this post.
     *
     * @param array $post
     * @param array $thread
     * @param array $forum
     */
    
protected function _assertCanEditPost(array $post, array $thread, array $forum)
    {
        if (!
$this->_getPostModel()->canEditPost($post$thread$forum$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }
    }

    
/**
     * Asserts that the currently browsing user can delete this post.
     *
     * @param array $post
     * @param array $thread
     * @param array $forum
     * @param string $deleteType Type of deletion (soft or hard)
     */
    
protected function _assertCanDeletePost(array $post, array $thread, array $forum$deleteType)
    {
        if (!
$this->_getPostModel()->canDeletePost($post$thread$forum$deleteType$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }
    }

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

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

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

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

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