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

/**
 * Controller for content watching actions.
 *
 * @package XenForo_Watch
 */
class XenForo_ControllerPublic_Watched extends XenForo_ControllerPublic_Abstract
{
    
/**
     * Pre-dispatch code for all actions.
     */
    
protected function _preDispatch($action)
    {
        if (
strtolower($action) !== 'viaemail')
        {
            
$this->_assertRegistrationRequired();
        }
    }

    protected function 
_assertIpNotBanned() {}
    protected function 
_assertViewingPermissions($action) {}

    public function 
actionViaEmail()
    {
        
$userId $this->_input->filterSingle('u'XenForo_Input::UINT);
        if (!
$userId)
        {
            
$userId XenForo_Visitor::getUserId();
        }

        if (!
$userId || (XenForo_Visitor::getUserId() && $userId != XenForo_Visitor::getUserId()))
        {
            return 
$this->responseError(new XenForo_Phrase('this_link_is_not_usable_by_you'), 403);
        }

        
$confirmKey $this->_input->filterSingle('c'XenForo_Input::STRING);

        
/** @var $userModel XenForo_Model_User */
        
$userModel $this->getModelFromCache('XenForo_Model_User');

        
$user $userModel->getUserById($userId);
        if (!
$user || $confirmKey != $userModel->getUserEmailConfirmKey($user))
        {
            return 
$this->responseError(new XenForo_Phrase('this_link_could_not_be_verified'), 403);
        }

        
$action $this->_input->filterSingle('a'XenForo_Input::STRING);
        
$type $this->_input->filterSingle('t'XenForo_Input::STRING);
        
$id $type $this->_input->filterSingle('id'XenForo_Input::UINT) : 0;

        if (
$this->isConfirmedPost())
        {
            switch (
$action)
            {
                case 
'stop':
                    
$action '';
                    break;

                case 
'no_email':
                default:
                    
$action 'watch_no_email';
            }

            
$this->_takeEmailAction($user$action$type$id);

            return 
$this->responseMessage(new XenForo_Phrase('your_email_notification_selections_have_been_updated'));
        }
        else
        {
            
$viewParams = array(
                
'user' => $user,
                
'confirmKey' => $confirmKey,
                
'action' => $action,
                
'type' => $type,
                
'id' => $id,
                
'confirmPhrase' => $this->_getEmailActionConfirmPhrase($user$action$type$id)
            );

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

    protected function 
_takeEmailAction(array $user$action$type$id)
    {
        if (
$type == '' || $type == 'thread')
        {
            if (
$id)
            {
                
$this->_getThreadWatchModel()->setThreadWatchState($user['user_id'], $id$action);
            }
            else
            {
                
$this->_getThreadWatchModel()->setThreadWatchStateForAll($user['user_id'], $action);
            }
        }

        if (
$type == '' || $type == 'forum')
        {
            if (
$id)
            {
                
$this->_getForumWatchModel()->setForumWatchState(
                    
$user['user_id'], $id,
                    
$action == '' 'delete' null,
                    
null,
                    
$action == 'watch_email' true false
                
);
            }
            else
            {
                
$this->_getForumWatchModel()->setForumWatchStateForAll($user['user_id'], $action);
            }
        }
    }

    protected function 
_getEmailActionConfirmPhrase(array $user$action$type$id)
    {
        if (
$type == 'thread')
        {
            if (
$id)
            {
                return new 
XenForo_Phrase('you_sure_you_want_to_update_notification_settings_for_one_thread');
            }
            else
            {
                return new 
XenForo_Phrase('you_sure_you_want_to_update_notification_settings_for_all_threads');
            }
        }

        if (
$type == 'forum')
        {
            if (
$id)
            {
                return new 
XenForo_Phrase('you_sure_you_want_to_update_notification_settings_for_one_forum');
            }
            else
            {
                return new 
XenForo_Phrase('you_sure_you_want_to_update_notification_settings_for_all_forums');
            }
        }

        return new 
XenForo_Phrase('you_sure_you_want_to_update_notification_settings_for_all_watched');
    }

    
/**
     * List of all new watched threads.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionThreads()
    {
        
$threadWatchModel $this->_getThreadWatchModel();
        
$visitor XenForo_Visitor::getInstance();

        
$newThreads $threadWatchModel->getThreadsWatchedByUser($visitor['user_id'], true, array(
            
'join' => XenForo_Model_Thread::FETCH_FORUM XenForo_Model_Thread::FETCH_USER,
            
'readUserId' => $visitor['user_id'],
            
'postCountUserId' => $visitor['user_id'],
            
'permissionCombinationId' => $visitor['permission_combination_id'],
            
'limit' => XenForo_Application::get('options')->discussionsPerPage
        
));
        
$newThreads $threadWatchModel->unserializePermissionsInList($newThreads'node_permission_cache');
        
$newThreads $threadWatchModel->getViewableThreadsFromList($newThreads);

        
$newThreads $this->_prepareWatchedThreads($newThreads);

        
$viewParams = array(
            
'newThreads' => $newThreads
        
);

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

    
/**
     * List of all watched threads.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionThreadsAll()
    {
        
$threadWatchModel $this->_getThreadWatchModel();
        
$visitor XenForo_Visitor::getInstance();

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

        
$threads $threadWatchModel->getThreadsWatchedByUser($visitor['user_id'], false, array(
            
'join' => XenForo_Model_Thread::FETCH_FORUM XenForo_Model_Thread::FETCH_USER,
            
'readUserId' => $visitor['user_id'],
            
'postCountUserId' => $visitor['user_id'],
            
'permissionCombinationId' => $visitor['permission_combination_id'],
            
'perPage' => $threadsPerPage,
            
'page' => $page,
        ));
        
$threads $threadWatchModel->unserializePermissionsInList($threads'node_permission_cache');
        
$threads $threadWatchModel->getViewableThreadsFromList($threads);

        
$threads $this->_prepareWatchedThreads($threads);

        
$totalThreads $threadWatchModel->countThreadsWatchedByUser($visitor['user_id']);

        
$this->canonicalizePageNumber($page$threadsPerPage$totalThreads'watched/threads/all');

        
$viewParams = array(
            
'threads' => $threads,
            
'page' => $page,
            
'threadsPerPage' => $threadsPerPage,
            
'totalThreads' => $totalThreads
        
);

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

    protected function 
_prepareWatchedThreads(array $threads)
    {
        
$visitor XenForo_Visitor::getInstance();

        
$threadModel $this->_getThreadModel();
        foreach (
$threads AS &$thread)
        {
            if (!
$visitor->hasNodePermissionsCached($thread['node_id']))
            {
                
$visitor->setNodePermissions($thread['node_id'], $thread['permissions']);
            }

            
$thread $threadModel->prepareThread($thread$thread);

            
// prevent these things from interfering
            
$thread['canInlineMod'] = false;
            
$thread['canEditThread'] = false;
            
$thread['isIgnored'] = false;
        }

        return 
$threads;
    }

    
/**
     * Update selected watched threads (stop watching, change email notification settings).
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionThreadsUpdate()
    {
        
$this->_assertPostOnly();

        
$input $this->_input->filter(array(
            
'thread_ids' => array(XenForo_Input::UINT'array' => true),
            
'do' => XenForo_Input::STRING
        
));

        
$watch $this->_getThreadWatchModel()->getUserThreadWatchByThreadIds(XenForo_Visitor::getUserId(), $input['thread_ids']);

        foreach (
$watch AS $threadWatch)
        {
            
$dw XenForo_DataWriter::create('XenForo_DataWriter_ThreadWatch');
            
$dw->setExistingData($threadWatchtrue);

            switch (
$input['do'])
            {
                case 
'stop':
                    
$dw->delete();
                    break;

                case 
'email':
                    
$dw->set('email_subscribe'1);
                    
$dw->save();
                    break;

                case 
'no_email':
                    
$dw->set('email_subscribe'0);
                    
$dw->save();
                    break;
            }
        }

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::SUCCESS,
            
$this->getDynamicRedirect(XenForo_Link::buildPublicLink('watched/threads/all'))
        );
    }

    
/**
     * List of all new watched content.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionForums()
    {
        
/** @var $nodeModel XenForo_Model_Node */
        
$nodeModel $this->getModelFromCache('XenForo_Model_Node');
        
$forumWatchModel $this->_getForumWatchModel();
        
$visitor XenForo_Visitor::getInstance();

        
$forumsWatched $forumWatchModel->getUserForumWatchByUser($visitor['user_id']);
        
$nodes $nodeModel->getAllNodes(falsefalse);
        foreach (
$nodes AS $nodeId => $node)
        {
            if (
$node['display_in_list'])
            {
                continue;
            }

            if (!isset(
$forumsWatched[$nodeId]))
            {
                unset(
$nodes[$nodeId]);
            }
        }

        
$viewParams = array(
            
'nodeList' => $nodeModel->getNodeListDisplayData($nodes00),
            
'forumsWatched' => $forumsWatched
        
);

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

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

        
$input $this->_input->filter(array(
            
'node_ids' => array(XenForo_Input::UINT'array' => true),
            
'do' => XenForo_Input::STRING
        
));

        
$watch $this->_getForumWatchModel()->getUserForumWatchByNodeIds(XenForo_Visitor::getUserId(), $input['node_ids']);

        foreach (
$watch AS $forumWatch)
        {
            
$dw XenForo_DataWriter::create('XenForo_DataWriter_ForumWatch');
            
$dw->setExistingData($forumWatchtrue);

            switch (
$input['do'])
            {
                case 
'stop':
                    
$dw->delete();
                    break;

                case 
'email':
                    
$dw->set('send_email'1);
                    
$dw->save();
                    break;

                case 
'no_email':
                    
$dw->set('send_email'0);
                    
$dw->save();
                    break;

                case 
'alert':
                    
$dw->set('send_alert'1);
                    
$dw->save();
                    break;

                case 
'no_alert':
                    
$dw->set('send_alert'0);
                    
$dw->save();
                    break;
            }
        }

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::SUCCESS,
            
$this->getDynamicRedirect(XenForo_Link::buildPublicLink('watched/forums'))
        );
    }

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

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

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

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