Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/InlineMod/Post/Merge.php
<?php

namespace XF\InlineMod\Post;

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_posts...');
    }

    protected function
canApplyInternal(AbstractCollection $entities, array $options, &$error)
    {
       
$result = parent::canApplyInternal($entities, $options, $error);

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

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

        return
$result;
    }

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

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

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

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

       
$merger->setMessage($options['message']);

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

       
$merger->merge($source);
    }

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

    public function
getBaseOptions()
    {
        return [
           
'target_post_id' => 0,
           
'message' => '',
           
'alert' => false,
           
'alert_reason' => ''
       
];
    }

    public function
renderForm(AbstractCollection $entities, \XF\Mvc\Controller $controller)
    {
       
$viewParams = [
           
'posts' => $entities,
           
'message' => trim(implode("\n\n", $entities->pluckNamed('message'))),

           
'total' => count($entities),
           
'first' => $entities->first()
        ];
        return
$controller->view('XF:Public:InlineMod\Post\Merge', 'inline_mod_post_merge', $viewParams);
    }

    public function
getFormOptions(AbstractCollection $entities, Request $request)
    {
       
$options = [
           
'target_post_id' => $request->filter('target_post_id', 'uint'),
           
'message' => $request->filter('message', 'str'),
           
'alert' => $request->filter('author_alert', 'bool'),
           
'alert_reason' => $request->filter('author_alert_reason', 'str')
        ];

        return
$options;
    }
}