Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/InlineMod/Thread/Merge.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
Merge extends AbstractAction
{
    public function
getTitle()
    {
        return \
XF::phrase('merge_threads...');
    }
   
    protected function
canApplyInternal(AbstractCollection $entities, array $options, &$error)
    {
       
$result = parent::canApplyInternal($entities, $options, $error);
       
        if (
$result)
        {
            foreach (
$entities AS $entity)
            {
                if (
$entity->discussion_type == 'redirect')
                {
                    return
false;
                }
            }

            if (
$options['target_thread_id'])
            {
                if (!isset(
$entities[$options['target_thread_id']]))
                {
                    return
false;
                }
            }

            if (
$entities->count() < 2)
            {
                return
false;
            }
        }
       
        return
$result;
    }

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

    public function
applyInternal(AbstractCollection $entities, array $options)
    {
        if (!
$options['target_thread_id'])
        {
            throw new \
InvalidArgumentException("No target thread selected");
        }

       
$source = $entities->toArray();
       
$target = $source[$options['target_thread_id']];
        unset(
$source[$options['target_thread_id']]);

       
/** @var \XF\Service\Thread\Merger $merger */
       
$merger = $this->app()->service('XF:Thread\Merger', $target);

        if (
$options['alert'])
        {
           
$merger->setSendAlert(true, $options['alert_reason']);
        }

        if (
$options['redirect'])
        {
           
$merger->setRedirect(true, $options['redirect_length']);
        }

       
$merger->merge($source);

       
$this->returnUrl = $this->app()->router()->buildLink('threads', $target);
    }

    protected function
applyToEntity(Entity $entity, array $options)
    {
        throw new \
LogicException("applyToEntity should not be called on thread merging");
    }

    public function
getBaseOptions()
    {
        return [
           
'target_thread_id' => 0,
           
'redirect' => false,
           
'redirect_length' => 0,
           
'alert' => false,
           
'alert_reason' => ''
       
];
    }

    public function
renderForm(AbstractCollection $entities, \XF\Mvc\Controller $controller)
    {
       
$viewParams = [
           
'threads' => $entities,
           
'total' => count($entities),
           
'first' => $entities->first()
        ];
        return
$controller->view('XF:Public:InlineMod\Thread\Merge', 'inline_mod_thread_merge', $viewParams);
    }

    public function
getFormOptions(AbstractCollection $entities, Request $request)
    {
       
$options = [
           
'target_thread_id' => $request->filter('target_thread_id', 'uint'),
           
'alert' => $request->filter('starter_alert', 'bool'),
           
'alert_reason' => $request->filter('starter_alert_reason', 'str')
        ];

       
$redirectType = $request->filter('redirect_type', 'str');
        if (
$redirectType == 'permanent')
        {
           
$options['redirect'] = true;
           
$options['redirect_length'] = 0;
        }
        else if (
$redirectType == 'temporary')
        {
           
$options['redirect'] = true;
           
$options['redirect_length'] = $request->filter('redirect_length', 'timeoffset');
        }
        else
        {
           
$options['redirect'] = false;
           
$options['redirect_length'] = 0;
        }

        return
$options;
    }
}