Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/InlineMod/Thread/ApplyPrefix.php
<?php

namespace XF\InlineMod\Thread;

use
XF\Http\Request;
use
XF\InlineMod\AbstractAction;
use
XF\Mvc\Entity\AbstractCollection;
use
XF\Mvc\Entity\Entity;

use function
count;

class
ApplyPrefix extends AbstractAction
{
    public function
getTitle()
    {
        return \
XF::phrase('apply_prefix...');
    }

    protected function
canApplyToEntity(Entity $entity, array $options, &$error = null)
    {
       
/** @var \XF\Entity\Thread $entity */
       
return $entity->canEdit($error);
    }

    protected function
applyToEntity(Entity $entity, array $options)
    {
        if (
$entity->discussion_type == 'redirect')
        {
            return;
        }

       
/** @var \XF\Entity\Thread $entity */
       
if (!$entity->Forum->isPrefixValid($options['prefix_id']))
        {
            return;
        }

       
/** @var \XF\Service\Thread\Editor $editor */
       
$editor = $this->app()->service('XF:Thread\Editor', $entity);
       
$editor->setPerformValidations(false);
       
$editor->setPrefix($options['prefix_id']);
        if (
$editor->validate($errors))
        {
           
$editor->save();
        }
    }

    public function
getBaseOptions()
    {
        return [
           
'prefix_id' => null
       
];
    }

    public function
renderForm(AbstractCollection $entities, \XF\Mvc\Controller $controller)
    {
       
$forums = $entities->pluckNamed('Forum', 'node_id');
       
$prefixIds = [];

        foreach (
$forums AS $forum)
        {
           
$prefixIds = array_merge($prefixIds, array_keys($forum->prefix_cache));
        }

       
$prefixes = $this->app()->finder('XF:ThreadPrefix')
            ->
where('prefix_id', array_unique($prefixIds))
            ->
order('materialized_order')
            ->
fetch();

       
$prefixes = $prefixes->filter(function(\XF\Entity\ThreadPrefix $prefix)
        {
            return
$prefix->isUsableByUser();
        });

        if (!
$prefixes->count())
        {
            return
$controller->error(\XF::phrase('no_thread_prefixes_available_for_selected_forums'));
        }

       
$selectedPrefix = 0;
       
$prefixCounts = [0 => 0];
        foreach (
$entities AS $thread)
        {
           
$threadPrefixId = $thread->prefix_id;

            if (!isset(
$prefixCounts[$threadPrefixId]))
            {
               
$prefixCounts[$threadPrefixId] = 1;
            }
            else
            {
               
$prefixCounts[$threadPrefixId]++;
            }

            if (
$prefixCounts[$threadPrefixId] > $prefixCounts[$selectedPrefix])
            {
               
$selectedPrefix = $threadPrefixId;
            }
        }

       
$viewParams = [
           
'threads' => $entities,
           
'prefixes' => $prefixes->groupBy('prefix_group_id'),
           
'forumCount' => count($forums->keys()),
           
'selectedPrefix' => $selectedPrefix,
           
'total' => count($entities)
        ];
        return
$controller->view('XF:Public:InlineMod\Thread\ApplyPrefix', 'inline_mod_thread_apply_prefix', $viewParams);
    }

    public function
getFormOptions(AbstractCollection $entities, Request $request)
    {
        return [
           
'prefix_id' => $request->filter('prefix_id', 'uint')
        ];
    }
}