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

/**
 * Controller for managing profile posts.
 *
 * @package XenForo_ProfilePost
 */
class XenForo_ControllerPublic_ProfilePost extends XenForo_ControllerPublic_Abstract
{
    
/**
     * Redirects to the profile post on the specified user's profile.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionIndex()
    {
        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);
        list(
$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostValidAndViewable($profilePostId);

        return 
$this->getProfilePostSpecificRedirect(
            
$profilePost$userXenForo_ControllerResponse_Redirect::RESOURCE_CANONICAL_PERMANENT
        
);
    }

    
/**
     * Helper to get the correct redirect to a specific profile post.
     *
     * @param array $profilePost
     * @param array $user
     * @param constant $redirectType
     *
     * @return XenForo_ControllerResponse_Redirect
     */
    
public function getProfilePostSpecificRedirect(array $profilePost, array $user,
        
$redirectType XenForo_ControllerResponse_Redirect::SUCCESS
    
)
    {
        if (
$profilePost['post_date'] < XenForo_Application::$time)
        {
            
$profilePostModel $this->_getProfilePostModel();

            
$conditions $profilePostModel->getPermissionBasedProfilePostConditions($user) + array(
                
'post_date' => array('>'$profilePost['post_date'])
            );

            
$count $profilePostModel->countProfilePostsForUserId($user['user_id'], $conditions);

            
$page floor($count XenForo_Application::get('options')->messagesPerPage) + 1;
        }
        else
        {
            
$page 1;
        }

        return 
$this->responseRedirect(
            
$redirectType,
            
XenForo_Link::buildPublicLink('members'$user, array('page' => $page)) . '#profile-post-' $profilePost['profile_post_id']
        );
    }

    
/**
     * Displays a form to edit a profile post.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionEdit()
    {
        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);
        list(
$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostValidAndViewable($profilePostId);

        
$profilePostModel $this->_getProfilePostModel();
        if (!
$profilePostModel->canEditProfilePost($profilePost$user$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }

        
$viewParams = array(
            
'profilePost' => $profilePost,
            
'user' => $user,
            
'canDeletePost' => $profilePostModel->canDeleteProfilePost($profilePost$user'soft'),
            
'canHardDeletePost' => $profilePostModel->canDeleteProfilePost($profilePost$user'hard'),
        );

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

    
/**
     * Edits a profile post.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionSave()
    {
        
$this->_assertPostOnly();

        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);
        list(
$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostValidAndViewable($profilePostId);

        if (!
$this->_getProfilePostModel()->canEditProfilePost($profilePost$user$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }

        
$inputMessage $this->_input->filterSingle('message'XenForo_Input::STRING);

        
$dw XenForo_DataWriter::create('XenForo_DataWriter_DiscussionMessage_ProfilePost');
        
$dw->setExistingData($profilePostId);
        
$dw->set('message'$inputMessage);
        
$dw->save();

        return 
$this->getProfilePostSpecificRedirect($profilePost$user);
    }

    
/**
     * Deletes a profile post.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionDelete()
    {
        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);
        list(
$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostValidAndViewable($profilePostId);

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

        
$profilePostModel $this->_getProfilePostModel();

        if (!
$profilePostModel->canDeleteProfilePost($profilePost$user$deleteType$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }

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

            
$dw XenForo_DataWriter::create('XenForo_DataWriter_DiscussionMessage_ProfilePost');
            
$dw->setExistingData($profilePostId);
            if (
$deleteType == 'hard')
            {
                
$dw->delete();
            }
            else
            {
                
$dw->setExtraData(XenForo_DataWriter_DiscussionMessage::DATA_DELETE_REASON$reason);
                
$dw->set('message_state''deleted');
                
$dw->save();
            }

            
XenForo_Model_Log::logModeratorAction(
                
'profile_post'$profilePost'delete_' $deleteType, array('reason' => $reason), $user
            
);

            
XenForo_Helper_Cookie::clearIdFromCookie($profilePostId'inlinemod_profilePosts');

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildPublicLink('members'$user)
            );
        }
        else 
// show delete confirmation dialog
        
{
            
$viewParams = array(
                
'profilePost' => $profilePost,
                
'user' => $user,
                
'canHardDelete' => $profilePostModel->canDeleteProfilePost($profilePost$user'hard'),
            );

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

    
/**
     * Shows the specified profile post.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionShow()
    {
        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);
        list(
$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostValidAndViewable($profilePostId);

        
$profilePostModel $this->_getProfilePostModel();

        
$profilePost $profilePostModel->prepareProfilePost($profilePost$user);
        
$profilePostModel->addInlineModOptionToProfilePost($profilePost$user);

        
$profilePosts = array($profilePostId => $profilePost);

        
$profilePosts $profilePostModel->addProfilePostCommentsToProfilePosts($profilePosts, array(
            
'join' => XenForo_Model_ProfilePost::FETCH_COMMENT_USER
        
));
        foreach (
$profilePosts AS &$pp)
        {
            if (empty(
$pp['comments']))
            {
                continue;
            }

            foreach (
$pp['comments'] AS &$comment)
            {
                
$comment $profilePostModel->prepareProfilePostComment($comment$pp$user);
            }
        }

        
$profilePost reset($profilePosts);

        
$viewParams array_merge($profilePostModel->getProfilePostViewParams($profilePosts$user), array(
            
'profilePost' => $profilePost,
            
'user' => $user,
        ));

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

    
/**
     * Reports this profile post.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionReport()
    {
        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);
        list(
$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostValidAndViewable($profilePostId);

        if (!
$this->_getProfilePostModel()->canReportProfilePost($profilePost$user$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('profile_post'$profilePost$message);

            
$controllerResponse $this->getProfilePostSpecificRedirect($profilePost$user);
            
$controllerResponse->redirectMessage = new XenForo_Phrase('thank_you_for_reporting_this_message');
            return 
$controllerResponse;
        }
        else
        {
            
$viewParams = array(
                
'profilePost' => $profilePost,
                
'user' => $user,
            );

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

    
/**
     * Displays a form to like a profile post or likes a profile post (via, uhh, POST).
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionLike()
    {
        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);
        list(
$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostValidAndViewable($profilePostId);

        if (!
$this->_getProfilePostModel()->canLikeProfilePost($profilePost$user$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }

        
$likeModel $this->getModelFromCache('XenForo_Model_Like');

        
$existingLike $likeModel->getContentLikeByLikeUser('profile_post'$profilePostIdXenForo_Visitor::getUserId());

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

            
$liked = ($existingLike false true);

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

                
$viewParams = array(
                    
'profilePost' => $profilePost,
                    
'user' => $user,
                    
'liked' => $liked,
                );

                return 
$this->responseView('XenForo_ViewPublic_ProfilePost_LikeConfirmed'''$viewParams);
            }
            else
            {
                return 
$this->getProfilePostSpecificRedirect($profilePost$user);
            }
        }
        else
        {
            
$viewParams = array(
                
'profilePost' => $profilePost,
                
'user' => $user,
                
'like' => $existingLike
            
);

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

    
/**
     * List of everyone that liked this profile post.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionLikes()
    {
        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);
        list(
$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostValidAndViewable($profilePostId);

        
$likes =  $this->getModelFromCache('XenForo_Model_Like')->getContentLikes('profile_post'$profilePostId);
        if (!
$likes)
        {
            return 
$this->responseError(new XenForo_Phrase('no_one_has_liked_this_post_yet'));
        }

        
$viewParams = array(
            
'profilePost' => $profilePost,
            
'user' => $user,

            
'likes' => $likes
        
);

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

    public function 
actionComment()
    {
        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);
        list(
$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostValidAndViewable($profilePostId);

        
$profilePostModel $this->_getProfilePostModel();

        if (!
$profilePostModel->canCommentOnProfilePost($profilePost$user$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }

        if (
$this->_request->isPost())
        {
            
$message $this->_input->filterSingle('message'XenForo_Input::STRING);
            
$visitor XenForo_Visitor::getInstance();

            
$dw XenForo_DataWriter::create('XenForo_DataWriter_ProfilePostComment');
            
$dw->setExtraData(XenForo_DataWriter_ProfilePostComment::DATA_PROFILE_USER$user);
            
$dw->setExtraData(XenForo_DataWriter_ProfilePostComment::DATA_PROFILE_POST$profilePost);
            
$dw->bulkSet(array(
                
'profile_post_id' => $profilePostId,
                
'user_id' => $visitor['user_id'],
                
'username' => $visitor['username'],
                
'message' => $message
            
));
            
$dw->setOption(XenForo_DataWriter_ProfilePostComment::OPTION_MAX_TAGGED_USERS$visitor->hasPermission('general''maxTaggedUsers'));
            
$dw->preSave();

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

            
$dw->save();

            if (
$this->_noRedirect())
            {
                
$comment $profilePostModel->getProfilePostCommentById($dw->get('profile_post_comment_id'), array(
                    
'join' => XenForo_Model_ProfilePost::FETCH_COMMENT_USER
                
));

                
$viewParams = array(
                    
'comment' => $profilePostModel->prepareProfilePostComment($comment$profilePost$user),
                    
'profilePost' => $profilePost,
                    
'user' => $user
                
);

                return 
$this->responseView('XenForo_ViewPublic_ProfilePost_Comment'''$viewParams);
            }
            else
            {
                return 
$this->getProfilePostSpecificRedirect($profilePost$user);
            }
        }
        else
        {
            
$viewParams = array(
                
'profilePost' => $profilePost,
                
'user' => $user
            
);

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

    public function 
actionCommentDelete()
    {
        
$commentId $this->_input->filterSingle('comment'XenForo_Input::UINT);
        list(
$comment$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostCommentValidAndViewable($commentId);

        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);
        if (
$profilePostId != $comment['profile_post_id'])
        {
            return 
$this->responseNoPermission();
        }

        if (!
$this->_getProfilePostModel()->canDeleteProfilePostComment($comment$profilePost$user$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }

        if (
$this->isConfirmedPost())
        {
            
$dw XenForo_DataWriter::create('XenForo_DataWriter_ProfilePostComment');
            
$dw->setExistingData($commentId);
            
$dw->delete();

            
XenForo_Model_Log::logModeratorAction(
                
'profile_post'$profilePost'comment_delete', array('username' => $comment['username']), $user
            
);

            return 
$this->getProfilePostSpecificRedirect($profilePost$user);
        }
        else
        {
            
$viewParams = array(
                
'comment' => $comment,
                
'profilePost' => $profilePost,
                
'user' => $user
            
);

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

    public function 
actionComments()
    {
        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);
        list(
$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostValidAndViewable($profilePostId);

        
$beforeDate $this->_input->filterSingle('before'XenForo_Input::UINT);

        
$profilePostModel $this->_getProfilePostModel();

        
$comments $profilePostModel->getProfilePostCommentsByProfilePost($profilePostId$beforeDate, array(
            
'join' => XenForo_Model_ProfilePost::FETCH_COMMENT_USER,
            
'limit' => 50
        
));

        if (!
$comments)
        {
            return 
$this->responseMessage(new XenForo_Phrase('no_comments_to_display'));
        }

        foreach (
$comments AS &$comment)
        {
            
$comment $profilePostModel->prepareProfilePostComment($comment$profilePost$user);
        }

        
$firstCommentShown reset($comments);
        
$lastCommentShown end($comments);

        
$viewParams = array(
            
'comments' => $comments,
            
'firstCommentShown' => $firstCommentShown,
            
'lastCommentShown' => $lastCommentShown,
            
'profilePost' => $profilePost,
            
'user' => $user
        
);

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

    public function 
actionIp()
    {
        
$profilePostId $this->_input->filterSingle('profile_post_id'XenForo_Input::UINT);

        list(
$profilePost$user) = $this->getHelper('UserProfile')->assertProfilePostValidAndViewable($profilePostId);

        if (!
$this->_getProfilePostModel()->canViewIps($profilePost$user$errorPhraseKey))
        {
            throw 
$this->getErrorOrNoPermissionResponseException($errorPhraseKey);
        }

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

        
$viewParams = array(
            
'user' => $user,
            
'profilePost' => $profilePost,
            
'ipInfo' => $this->getModelFromCache('XenForo_Model_Ip')->getContentIpInfo($profilePost)
        );

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

    
/**
     * Session activity details.
     * @see XenForo_Controller::getSessionActivityDetailsForList()
     */
    
public static function getSessionActivityDetailsForList(array $activities)
    {
        return new 
XenForo_Phrase('viewing_members');
    }

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