Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Admin/Controller/Thread.php
<?php

namespace XF\Admin\Controller;

use
XF\Mvc\ParameterBag;

use function
count;

class
Thread extends AbstractController
{
    protected function
preDispatchController($action, ParameterBag $params)
    {
       
$this->assertAdminPermission('thread');
    }

    public function
actionList()
    {
       
$this->setSectionContext('batchUpdateThreads');

       
$criteria = $this->filter('criteria', 'array');
       
$order = $this->filter('order', 'str');
       
$direction = $this->filter('direction', 'str');

       
$page = $this->filterPage();
       
$perPage = 50;

       
$showingAll = $this->filter('all', 'bool');
        if (
$showingAll)
        {
           
$perPage = 500;
        }

       
/** @var \XF\Searcher\Thread $searcher */
       
$searcher = $this->searcher('XF:Thread', $criteria);
       
$searcher->setOrder($order, $direction);

       
$finder = $searcher->getFinder();
       
$finder->limitByPage($page, $perPage);

       
$total = $finder->total();
       
$threads = $finder->fetch();

       
$viewParams = [
           
'threads' => $threads,

           
'total' => $total,
           
'page' => $page,
           
'perPage' => $perPage,

           
'showingAll' => $showingAll,
           
'showAll' => (!$showingAll && $total <= 500),

           
'criteria' => $searcher->getFilteredCriteria(),
           
'order' => $order,
           
'direction' => $direction
       
];
        return
$this->view('XF:Thread\Listing', 'thread_list', $viewParams);
    }

    public function
actionReplyBans()
    {
       
$replyBanRepo = $this->getReplyBanRepo();
       
$replyBanFinder = $replyBanRepo->findReplyBansForList();

       
$user = null;
       
$linkParams = [];
        if (
$username = $this->filter('username', 'str'))
        {
           
$user = $this->finder('XF:User')->where('username', $username)->fetchOne();
            if (
$user)
            {
               
$replyBanFinder->where('user_id', $user->user_id);
               
$linkParams['username'] = $user->username;
            }
        }

       
$page = $this->filterPage();
       
$perPage = 25;

       
$replyBanFinder->limitByPage($page, $perPage);
       
$total = $replyBanFinder->total();

       
$this->assertValidPage($page, $perPage, $total, 'threads/reply-bans');

       
$viewParams = [
           
'bans' => $replyBanFinder->fetch(),
           
'user' => $user,

           
'page' => $page,
           
'perPage' => $perPage,
           
'total' => $total,

           
'linkParams' => $linkParams
       
];
        return
$this->view('XF:Thread\ReplyBan\Listing', 'thread_reply_ban_list', $viewParams);
    }

    public function
actionReplyBansDelete(ParameterBag $params)
    {
       
$replyBan = $this->assertReplyBanExists($params->thread_reply_ban_id);

       
/** @var \XF\ControllerPlugin\Delete $plugin */
       
$plugin = $this->plugin('XF:Delete');
        return
$plugin->actionDelete(
           
$replyBan,
           
$this->buildLink('threads/reply-bans/delete', $replyBan),
           
null,
           
$this->buildLink('threads/reply-bans'),
           
"{$replyBan->Thread->title} - {$replyBan->User->username}"
       
);
    }

    public function
actionBatchUpdate()
    {
       
$this->setSectionContext('batchUpdateThreads');

       
$searcher = $this->searcher('XF:Thread');

       
$viewParams = [
           
'criteria' => $searcher->getFormCriteria(),
           
'success' => $this->filter('success', 'bool')
        ] +
$searcher->getFormData();
        return
$this->view('XF:Thread\BatchUpdate', 'thread_batch_update', $viewParams);
    }

    public function
actionBatchUpdateConfirm()
    {
       
$this->setSectionContext('batchUpdateThreads');

       
$this->assertPostOnly();

       
$input = $this->filterFormJson([
           
'criteria' => 'array',
           
'thread_ids' => 'array-uint'
       
]);

       
$searcher = $this->searcher('XF:Thread', $input['criteria']);
       
$threadIds = $input['thread_ids'];

       
$total = count($threadIds) ?: $searcher->getFinder()->total();
        if (!
$total)
        {
            throw
$this->exception($this->error(\XF::phraseDeferred('no_items_matched_your_filter')));
        }

        if (
$threadIds)
        {
           
$threadFinder = $this->finder('XF:Thread');
           
$threadFinder->where('thread_id', $threadIds);
        }
        else
        {
           
$threadFinder = clone $searcher->getFinder();
        }
       
$hasPrefixes = (bool)$threadFinder
           
->where('prefix_id', '>', 0)
            ->
total();

       
/** @var \XF\Repository\ThreadPrefix $prefixRepo */
       
$prefixRepo = $this->repository('XF:ThreadPrefix');
       
$prefixes = $prefixRepo->getPrefixListData();

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

       
/** @var \XF\Repository\ThreadType */
       
$threadTypeRepo = $this->repository('XF:ThreadType');
       
$threadTypes = $threadTypeRepo->getThreadTypeListData(null,
            \
XF\Repository\ThreadType::FILTER_BULK_CONVERTIBLE
       
);

       
$viewParams = [
           
'total' => $total,
           
'threadIds' => $threadIds,
           
'hasPrefixes' => $hasPrefixes,
           
'criteria' => $searcher->getFilteredCriteria(),

           
'prefixes' => $prefixes,
           
'forums' => $forums,
           
'threadTypes' => $threadTypes
       
];
        return
$this->view('XF:Thread\BatchUpdate\Confirm', 'thread_batch_update_confirm', $viewParams);
    }

    public function
actionBatchUpdateAction()
    {
       
$this->setSectionContext('batchUpdateThreads');

       
$this->assertPostOnly();

        if (
$this->request->exists('thread_ids'))
        {
           
$threadIds = $this->filter('thread_ids', 'json-array');
           
$total = count($threadIds);
           
$jobCriteria = null;
        }
        else
        {
           
$criteria = $this->filter('criteria', 'json-array');
           
$searcher = $this->searcher('XF:Thread', $criteria);
           
$total = $searcher->getFinder()->total();
           
$jobCriteria = $searcher->getFilteredCriteria();

           
$threadIds = null;
        }

        if (!
$total)
        {
            throw
$this->exception($this->error(\XF::phraseDeferred('no_items_matched_your_filter')));
        }

       
$actions = $this->filter('actions', 'array');

        if (
$this->request->exists('confirm_delete') && empty($actions['delete']))
        {
            return
$this->error(\XF::phrase('you_must_confirm_deletion_to_proceed'));
        }

       
$this->app->jobManager()->enqueueUnique('threadAction', 'XF:ThreadAction', [
           
'total' => $total,
           
'actions' => $actions,
           
'threadIds' => $threadIds,
           
'criteria' => $jobCriteria
       
]);

        return
$this->redirect($this->buildLink('threads/batch-update', null, ['success' => true]));
    }

   
/**
     * @param string $id
     * @param array|string|null $with
     * @param null|string $phraseKey
     *
     * @return \XF\Entity\ThreadReplyBan
     */
   
protected function assertReplyBanExists($id, array $extraWith = [], $phraseKey = null)
    {
       
$extraWith[] = 'Thread';
       
$extraWith[] = 'User';
        return
$this->assertRecordExists('XF:ThreadReplyBan', $id, $extraWith, $phraseKey);
    }

   
/**
     * @return \XF\Repository\ThreadReplyBan
     */
   
protected function getReplyBanRepo()
    {
        return
$this->repository('XF:ThreadReplyBan');
    }
}