Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Pub/Controller/Watched.php
<?php

namespace XF\Pub\Controller;

use
XF\Mvc\ParameterBag;

class
Watched extends AbstractController
{
    protected function
preDispatchController($action, ParameterBag $params)
    {
       
$this->assertRegistrationRequired();
    }

    public function
actionThreads()
    {
       
$this->setSectionContext('forums');

       
$page = $this->filterPage();
       
$perPage = $this->options()->discussionsPerPage;

       
/** @var \XF\Repository\Thread $threadRepo */
       
$threadRepo = $this->repository('XF:Thread');
       
$threadFinder = $threadRepo->findThreadsForWatchedList();

       
$total = $threadFinder->total();
       
$threads = $threadFinder->limitByPage($page, $perPage)->fetch();

       
$viewParams = [
           
'page' => $page,
           
'perPage' => $perPage,
           
'total' => $total,
           
'threads' => $threads->filterViewable()
        ];
        return
$this->view('XF:Watched\Threads', 'watched_threads_list', $viewParams);
    }

    public function
actionThreadsManage()
    {
       
$this->setSectionContext('forums');

        if (!
$state = $this->filter('state', 'str'))
        {
            return
$this->redirect($this->buildLink('watched/threads'));
        }

        if (
$this->isPost())
        {
           
/** @var \XF\Repository\ThreadWatch $threadWatchRepo */
           
$threadWatchRepo = $this->repository('XF:ThreadWatch');

            if (
$threadWatchRepo->isValidWatchState($state))
            {
               
$threadWatchRepo->setWatchStateForAll(\XF::visitor(), $state);
            }

            return
$this->redirect($this->buildLink('watched/threads'));
        }
        else
        {
           
$viewParams = [
               
'state' => $state
           
];
            return
$this->view('XF:Watched\ThreadsManage', 'watched_threads_manage', $viewParams);
        }
    }

    public function
actionThreadsUpdate()
    {
       
$this->assertPostOnly();
       
$this->setSectionContext('forums');

       
/** @var \XF\Repository\ThreadWatch $threadWatchRepo */
       
$threadWatchRepo = $this->repository('XF:ThreadWatch');

       
$state = $this->filter('state', 'str');

        if (
$state && $threadWatchRepo->isValidWatchState($state))
        {
           
$threadIds = $this->filter('thread_ids', 'array-uint');
           
$threads = $this->em()->findByIds('XF:Thread', $threadIds);
           
$visitor = \XF::visitor();

           
/** @var \XF\Entity\Thread $thread */
           
foreach ($threads AS $thread)
            {
               
$threadWatchRepo->setWatchState($thread, $visitor, $state);
            }
        }

        return
$this->redirect($this->buildLink('watched/threads'));
    }

    public function
actionForums()
    {
       
$this->setSectionContext('forums');

       
/** @var \XF\Repository\Node $nodeRepo */
       
$nodeRepo = $this->repository('XF:Node');

       
$watchedFinder = $this->finder('XF:ForumWatch');
       
/** @var \XF\Entity\ForumWatch[]|\XF\Mvc\Entity\ArrayCollection $watchedForums */
       
$watchedForums = $watchedFinder->where('user_id', \XF::visitor()->user_id)
            ->
keyedBy('node_id')
            ->
with('Forum', true)
            ->
with('Forum.Node', true)
            ->
fetch();

       
$nodes = $nodeRepo->getFullNodeList();
       
$nodes = $nodes->filter(function(\XF\Entity\Node $node) use ($watchedForums)
        {
            if (
$node->display_in_list || isset($watchedForums[$node->node_id]))
            {
                return
true;
            }

           
$lft = $node->lft;
           
$rgt = $node->rgt;

            foreach (
$watchedForums AS $watched)
            {
               
$watchedNode = $watched->Forum->Node;
                if (
$watchedNode->lft > $lft && $watchedNode->rgt < $rgt)
                {
                   
// we're watching a node within this so we have to include it
                   
return true;
                }
            }

            return
false;
        });
       
$nodeRepo->loadNodeTypeDataForNodes($nodes);
       
$nodes = $nodeRepo->filterViewable($nodes);

       
$nodeTree = $nodeRepo->createNodeTree($nodes);
       
$nodeExtras = $nodeRepo->getNodeListExtras($nodeTree);

       
$viewParams = [
           
'nodeTree' => $nodeTree,
           
'nodeExtras' => $nodeExtras,

           
'watchedForums' => $watchedForums
       
];
        return
$this->view('XF:Watched\Forums', 'watched_forums_list', $viewParams);
    }

    public function
actionForumsManage()
    {
       
$this->setSectionContext('forums');

        if (!
$state = $this->filter('state', 'str'))
        {
            return
$this->redirect($this->buildLink('watched/forums'));
        }

        if (
$this->isPost())
        {
           
/** @var \XF\Repository\ForumWatch $forumWatchRepo */
           
$forumWatchRepo = $this->repository('XF:ForumWatch');

            if (
$forumWatchRepo->isValidWatchState($state))
            {
               
$forumWatchRepo->setWatchStateForAll(\XF::visitor(), $state);
            }

            return
$this->redirect($this->buildLink('watched/forums'));
        }
        else
        {
           
$viewParams = [
               
'state' => $state
           
];
            return
$this->view('XF:Watched\ForumsManage', 'watched_forums_manage', $viewParams);
        }
    }

    public function
actionForumsUpdate()
    {
       
$this->assertPostOnly();
       
$this->setSectionContext('forums');

        if (
$action = $this->filter('action', 'str'))
        {
           
$nodeIds = $this->filter('node_ids', 'array-uint');
           
$visitor = \XF::visitor();

            foreach (
$nodeIds AS $nodeId)
            {
               
$watch = $this->em()->find('XF:ForumWatch', [
                   
'node_id' => $nodeId,
                   
'user_id' => $visitor->user_id
               
]);
                if (!
$watch)
                {
                    continue;
                }

                switch (
$action)
                {
                    case
'email':
                    case
'no_email':
                       
$watch->send_email = ($action == 'email');
                       
$watch->save();
                        break;

                    case
'alert':
                    case
'no_alert':
                       
$watch->send_alert = ($action == 'alert');
                       
$watch->save();
                        break;

                    case
'delete':
                       
$watch->delete();
                        break;
                }
            }
        }

        return
$this->redirect($this->buildLink('watched/forums'));
    }

    public static function
getActivityDetails(array $activities)
    {
        return \
XF::phrase('managing_account_details');
    }
}