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

class XenForo_ControllerPublic_FindNew extends XenForo_ControllerPublic_Abstract
{
    public function 
actionThreads()
    {
        return 
$this->responseReroute(__CLASS__'posts');
    }
    
    
/**
     * Finds new/unread posts.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionPosts()
    {
        
$this->_routeMatch->setSections('forums');
        
$threadModel $this->_getThreadModel();
        
$visitor XenForo_Visitor::getInstance();

        
$searchId $this->_input->filterSingle('search_id'XenForo_Input::UINT);
        if (!
$searchId)
        {
            return 
$this->findNewPosts();
        }

        
$searchModel $this->_getSearchModel();

        
$search $searchModel->getSearchById($searchId);
        if (!
$search
            
|| $search['user_id'] != XenForo_Visitor::getUserId()
            || !
in_array($search['search_type'], array('new-posts''recent-posts'))
        )
        {
            return 
$this->findNewPosts();
        }

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

        
$pageResultIds $searchModel->sliceSearchResultsToPage($search$page$perPage);
        
$threadIds XenForo_Application::arrayColumn($pageResultIds1);

        
$threadsMatched $threadModel->getThreadsByIds($threadIds, array(
            
'join' =>
                
XenForo_Model_Thread::FETCH_FORUM |
                
XenForo_Model_Thread::FETCH_USER |
                
XenForo_Model_Thread::FETCH_FIRSTPOST,
            
'permissionCombinationId' => $visitor['permission_combination_id'],
            
'readUserId' => $visitor['user_id'],
            
'includeForumReadDate' => true,
            
'watchUserId' => $visitor['user_id'],
            
'forumWatchUserId' => $visitor['user_id'],
            
'postCountUserId' => $visitor['user_id']
        ));
        
$threads = array();
        
$inlineModOptions = array();
        foreach (
$threadIds AS $threadId)
        {
            if (!isset(
$threadsMatched[$threadId]))
            {
                continue;
            }

            
$thread $threadsMatched[$threadId];

            
$thread['permissions'] = XenForo_Permission::unserializePermissions($thread['node_permission_cache']);
            if (!
$threadModel->canViewThreadAndContainer($thread$thread$null$thread['permissions']))
            {
                continue;
            }

            
$thread $threadModel->prepareThread($thread$thread$thread['permissions']);

            
$thread['forum'] = array(
                
'node_id' => $thread['node_id'],
                
'node_name' => $thread['node_name'],
                
'title' => $thread['node_title']
            );

            
$threadModOptions $threadModel->addInlineModOptionToThread($thread$thread$thread['permissions']);
            
$inlineModOptions += $threadModOptions;

            
$threads[$thread['thread_id']] = $thread;
        }

        if (!
$threads)
        {
            return 
$this->getNoPostsResponse();
        }

        
$resultStartOffset = ($page 1) * $perPage 1;
        
$resultEndOffset = ($page 1) * $perPage count($threadIds);

        
$viewParams = array(
            
'search' => $search,
            
'threads' => $threads,
            
'inlineModOptions' => $inlineModOptions,

            
'threadStartOffset' => $resultStartOffset,
            
'threadEndOffset' => $resultEndOffset,

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

            
'page' => $page,
            
'perPage' => $perPage,
            
'totalThreads' => $search['result_count'],
            
'nextPage' => ($resultEndOffset $search['result_count'] ? ($page 1) : 0),

            
'showingNewPosts' => ($search['search_type'] == 'new-posts')
        );

        return 
$this->getFindNewWrapper(
            
$this->responseView('XenForo_ViewPublic_FindNew_Posts''find_new_posts'$viewParams),
            
'posts'
        
);
    }

    public function 
findNewPosts()
    {
        
$threadModel $this->_getThreadModel();
        
$searchModel $this->_getSearchModel();

        
$userId XenForo_Visitor::getUserId();
        
$visitor XenForo_Visitor::getInstance();

        
$limitOptions = array(
            
'limit' => XenForo_Application::get('options')->maximumSearchResults
        
);

        
$days $this->_input->filterSingle('days'XenForo_Input::UINT);
        
$recent $this->_input->filterSingle('recent'XenForo_Input::UINT);
        
$watched $this->_input->filterSingle('watched'XenForo_Input::UINT);

        if (
$userId && !$days && !$recent)
        {
            
$threadIds $threadModel->getUnreadThreadIds($userId$limitOptions$watched);

            
$searchType 'new-posts';
        }
        else
        {
            if (
$days 1)
            {
                
$days max(7XenForo_Application::get('options')->readMarkingDataLifetime);
            }

            
$fetchOptions $limitOptions + array(
                
'order' => 'last_post_date',
                
'orderDirection' => 'desc',
                
'watchUserId' => $userId,
                
'forumWatchUserId' => $userId,
                
'join' => XenForo_Model_Thread::FETCH_FORUM_OPTIONS
            
);

            
$threadIds array_keys($threadModel->getThreads(array(
                
'last_post_date' => array('>'XenForo_Application::$time 86400 $days),
                
'not_discussion_type' => 'redirect',
                
'deleted' => false,
                
'moderated' => false,
                
'find_new' => true,
                
'watch_only' => $watched
            
), $fetchOptions));

            
$searchType 'recent-posts';
        }

        
$threads $threadModel->getThreadsByIds(
            
$threadIds,
            array(
                
'join' =>
                    
XenForo_Model_Thread::FETCH_FORUM |
                    
XenForo_Model_Thread::FETCH_USER,
                
'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'])
                || 
$visitor->isIgnoring($thread['user_id'])
            )
            {
                unset(
$threads[$key]);
            }
        }

        
$results = array();
        foreach (
$threadIds AS $threadId)
        {
            if (isset(
$threads[$threadId]))
            {
                
$results[] = array(
                    
XenForo_Model_Search::CONTENT_TYPE => 'thread',
                    
XenForo_Model_Search::CONTENT_ID => $threadId
                
);
            }
        }

        if (!
$results)
        {
            return 
$this->getNoPostsResponse();
        }

        
$search $searchModel->insertSearch($results$searchType'', array(), 'date'false);

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::SUCCESS,
            
XenForo_Link::buildPublicLink('find-new/posts'$search)
        );
    }

    public function 
getNoPostsResponse()
    {
        
$days $this->_input->filterSingle('days'XenForo_Input::UINT);
        
$recent $this->_input->filterSingle('recent'XenForo_Input::UINT);

        
$this->_routeMatch->setSections('forums');

        return 
$this->getFindNewWrapper($this->responseView('XenForo_ViewPublic_FindNew_PostsNone''find_new_posts_none', array(
            
'days' => $days,
            
'recent' => $recent
        
)), 'posts');
    }

    public function 
getFindNewWrapper(XenForo_ControllerResponse_View $subView$selectedTab)
    {
        
$tabs $this->_getWrapperTabs();

        
$view $this->responseView('XenForo_ViewPublic_FindNew_Wrapper''find_new_wrapper', array(
            
'tabs' => $tabs,
            
'showTabs' => count($tabs) > 1,
            
'selectedTab' => $selectedTab
        
));
        
$view->subView $subView;

        return 
$view;
    }

    protected function 
_getWrapperTabs()
    {
        return array(
            
'posts' => array(
                
'href' => XenForo_Link::buildPublicLink('find-new/posts'),
                
'title' => new XenForo_Phrase('new_posts')
            )
        );
    }

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

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

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