Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Widget/NewPosts.php
<?php

namespace XF\Widget;

use function
in_array;

class
NewPosts extends AbstractWidget
{
    protected
$defaultOptions = [
       
'limit' => 5,
       
'style' => 'simple',
       
'filter' => 'latest',
       
'node_ids' => []
    ];

    protected function
getDefaultTemplateParams($context)
    {
       
$params = parent::getDefaultTemplateParams($context);
        if (
$context == 'options')
        {
           
$nodeRepo = $this->app->repository('XF:Node');
           
$params['nodeTree'] = $nodeRepo->createNodeTree($nodeRepo->getFullNodeList());
        }
        return
$params;
    }

    public function
render()
    {
       
$visitor = \XF::visitor();

       
$options = $this->options;
       
$limit = $options['limit'];
       
$filter = $options['filter'];
       
$nodeIds = $options['node_ids'];

        if (!
$visitor->user_id)
        {
           
$filter = 'latest';
        }

       
$router = $this->app->router('public');

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

        switch (
$filter)
        {
            default:
            case
'latest':
               
$threadFinder = $threadRepo->findThreadsWithLatestPosts();
               
$title = \XF::phrase('widget.latest_posts');
               
$link = $router->buildLink('whats-new/posts', null, ['skip' => 1]);
                break;

            case
'unread':
               
$threadFinder = $threadRepo->findThreadsWithUnreadPosts();
               
$title = \XF::phrase('widget.unread_posts');
               
$link = $router->buildLink('whats-new/posts', null, ['unread' => 1]);
                break;

            case
'watched':
               
$threadFinder = $threadRepo->findThreadsForWatchedList();
               
$title = \XF::phrase('widget.latest_watched');
               
$link = $router->buildLink('whats-new/posts', null, ['watched' => 1]);
                break;
        }

       
$threadFinder
           
->with('Forum.Node.Permissions|' . $visitor->permission_combination_id)
            ->
limit(max($limit * 2, 10));

        if (
$nodeIds && !in_array(0, $nodeIds))
        {
           
$threadFinder->where('node_id', $nodeIds);
        }

        if (
$options['style'] == 'full')
        {
           
$threadFinder->with('fullForum');
        }
        else
        {
           
$threadFinder
               
->with('LastPoster')
                ->
withReadData();
        }

       
/** @var \XF\Entity\Thread $thread */
       
foreach ($threads = $threadFinder->fetch() AS $threadId => $thread)
        {
            if (!
$thread->canView()
                ||
$thread->isIgnored()
                ||
$visitor->isIgnoring($thread->last_post_user_id)
            )
            {
                unset(
$threads[$threadId]);
            }
        }
       
$total = $threads->count();
       
$threads = $threads->slice(0, $limit, true);

       
$viewParams = [
           
'title' => $this->getTitle() ?: $title,
           
'link' => $link,
           
'threads' => $threads,
           
'style' => $options['style'],
           
'filter' => $filter,
           
'hasMore' => $total > $threads->count()
        ];
        return
$this->renderer('widget_new_posts', $viewParams);
    }

    public function
verifyOptions(\XF\Http\Request $request, array &$options, &$error = null)
    {
       
$options = $request->filter([
           
'limit' => 'uint',
           
'style' => 'str',
           
'filter' => 'str',
           
'node_ids' => 'array-uint'
       
]);
        if (
in_array(0, $options['node_ids']))
        {
           
$options['node_ids'] = [0];
        }
        if (
$options['limit'] < 1)
        {
           
$options['limit'] = 1;
        }

        return
true;
    }
}