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

namespace XF\Admin\Controller;

use
XF\Mvc\ParameterBag;
use
XF\Diff;

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

    public function
actionIndex()
    {
       
$templateModRepo = $this->getTemplateModificationRepo();

       
$type = $this->filter('type', 'str');
        if (!
$type)
        {
           
$type = 'public';
        }
       
$types = $templateModRepo->getModificationTypes();
        if (!isset(
$types[$type]))
        {
            return
$this->error(\XF::phrase('cannot_view_template_modifications_of_this_type'));
        }

       
$modifications = $templateModRepo->findTemplateModificationsForList($type)->fetch();
       
$modifications = $templateModRepo->addLogsToModifications($modifications);

       
$addOns = $modifications->pluckNamed('AddOn', 'addon_id');

       
$viewParams = [
           
'canCreateModification' => $templateModRepo->canCreateTemplateModification(),

           
'groupedModifications' => $modifications->groupBy('addon_id'),
           
'addOns' => $addOns,

           
'modificationCount' => $modifications->count(),

           
'type' => $type,
           
'types' => $types
       
];

        return
$this->view('XF:TemplateModification\Listing', 'template_modification_list', $viewParams);
    }

    protected function
templateModificationAddEdit(\XF\Entity\TemplateModification $modification)
    {
       
$types = $this->getTemplateModificationRepo()->getModificationTypes();
        if (!isset(
$types[$modification->type]))
        {
            return
$this->error(\XF::phrase('cannot_edit_template_modifications_of_this_type'));
        }

       
$viewParams = [
           
'modification' => $modification,
           
'types' => $types
       
];
        return
$this->view('XF:TemplateModification\Edit', 'template_modification_edit', $viewParams);
    }

    public function
actionEdit(ParameterBag $params)
    {
       
$modification = $this->assertTemplateModificationExists($params['modification_id']);
        return
$this->templateModificationAddEdit($modification);
    }

    public function
actionAdd()
    {
       
$templateModRepo = $this->getTemplateModificationRepo();

        if (!
$templateModRepo->canCreateTemplateModification())
        {
            return
$this->noPermission();
        }

       
$modification = $this->em()->create('XF:TemplateModification');
       
$modification->type = $this->filter('type', 'str', 'public');
        return
$this->templateModificationAddEdit($modification);
    }

    protected function
modificationSaveProcess(\XF\Entity\TemplateModification $modification)
    {
       
$form = $this->formAction();

       
$input = $this->filter([
           
'type' => 'str',
           
'template' => 'str',
           
'modification_key' => 'str',
           
'description' => 'str',
           
'action' => 'str',
           
'find' => 'str,no-trim',
           
'replace' => 'str,no-trim',
           
'execution_order' => 'uint',
           
'enabled' => 'bool',
           
'addon_id' => 'str'
       
]);

       
$form->basicEntitySave($modification, $input);

        return
$form;
    }

    public function
actionSave(ParameterBag $params)
    {
       
$this->assertPostOnly();

        if (
$this->filter('test', 'bool'))
        {
            return
$this->rerouteController(__CLASS__, 'test', $params);
        }

        if (
$params['modification_id'])
        {
           
$modification = $this->assertTemplateModificationExists($params['modification_id']);
        }
        else
        {
           
$modification = $this->em()->create('XF:TemplateModification');
        }

       
$this->modificationSaveProcess($modification)->run();

        return
$this->redirect($this->buildLink('template-modifications', '', ['type' => $modification->type]));
    }

    public function
actionToggle()
    {
       
/** @var \XF\ControllerPlugin\Toggle $plugin */
       
$plugin = $this->plugin('XF:Toggle');
        return
$plugin->actionToggle('XF:TemplateModification', 'enabled');
    }

    public function
actionDelete(ParameterBag $params)
    {
       
$modification = $this->assertTemplateModificationExists($params['modification_id']);
        if (!
$modification->canEdit())
        {
            return
$this->error(\XF::phrase('item_cannot_be_deleted_associated_with_addon_explain'));
        }

       
/** @var \XF\ControllerPlugin\Delete $plugin */
       
$plugin = $this->plugin('XF:Delete');
        return
$plugin->actionDelete(
           
$modification,
           
$this->buildLink('template-modifications/delete', $modification),
           
$this->buildLink('template-modifications/edit', $modification),
           
$this->buildLink('template-modifications', null, ['type' => $modification->type]),
           
$modification->template
       
);
    }

    public function
actionTest(ParameterBag $params)
    {
        if (
$params['modification_id'])
        {
           
$modification = $this->assertTemplateModificationExists($params['modification_id']);
        }
        else
        {
           
$modification = $this->em()->create('XF:TemplateModification');
        }

       
$input = $this->filter([
           
'type' => 'str',
           
'template' => 'str',
           
'modification_key' => 'str',
           
'description' => 'str',
           
'action' => 'str',
           
'find' => 'str,no-trim',
           
'replace' => 'str,no-trim',
           
'execution_order' => 'uint',
           
'enabled' => 'bool',
           
'addon_id' => 'str'
       
]);

       
$modification->bulkSet($input);
       
$modification->preSave();

       
$errors = $modification->getErrors();
        if (isset(
$errors['template']))
        {
            return
$this->error($errors['template']);
        }
        if (isset(
$errors['find']))
        {
            return
$this->error($errors['find']);
        }

       
$template = $this->finder('XF:Template')
            ->
where([
               
'style_id' => 0,
               
'title' => $input['template'],
               
'type' => $input['type']
            ])
            ->
fetchOne();
        if (!
$template)
        {
            return
$this->error(\XF::phrase('requested_template_not_found'));
        }

       
$content = $template->template;
       
$contentModified = $this->getTemplateModificationRepo()->applyTemplateModifications($content, [$modification]);

       
$diff = new Diff();
       
$diffs = $diff->findDifferences($content, $contentModified);

       
$viewParams = [
           
'modification' => $modification,
           
'content' => $content,
           
'contentModified' => $contentModified,
           
'diffs' => $diffs
       
];

        return
$this->view('XF:TemplateModification\Test', 'template_modification_test', $viewParams);
    }

    public function
actionLog(ParameterBag $params)
    {
       
$modification = $this->assertTemplateModificationExists($params['modification_id']);

       
$viewParams = [
           
'modification' => $modification
       
];

        return
$this->view('XF:TemplateModification\Log', 'template_modification_log', $viewParams);
    }

    public function
actionAutoComplete()
    {
       
$type = $this->filter('type', 'str');

       
$types = $this->getTemplateModificationRepo()->getModificationTypes();
        if (empty(
$types[$type]))
        {
           
$type = 'public';
        }

       
$q = $this->filter('q', 'str');

       
$finder = $this->finder('XF:Template');
       
$finder->where('type', $type)
            ->
where('style_id', 0)
            ->
where(
               
$finder->columnUtf8('title'),
               
'LIKE', $finder->escapeLike($q, '?%'))
            ->
limit(10);

       
$results = [];
        foreach (
$finder->fetch() AS $templateMap)
        {
           
$results[] = [
               
'id' => $templateMap->title,
               
'text' => $templateMap->title
           
];
        }

       
$view = $this->view();
       
$view->setJsonParam('results', $results);

        return
$view;
    }

    public function
actionContents()
    {
       
$type = $this->filter('type', 'str');

       
$types = $this->getTemplateModificationRepo()->getModificationTypes();
        if (empty(
$types[$type]))
        {
           
$type = 'public';
        }

       
$templateTitle = $this->filter('template', 'str');

       
$template = $this->finder('XF:Template')
            ->
where([
               
'style_id' => 0,
               
'title' => $templateTitle,
               
'type' => $type
           
])
            ->
fetchOne();

       
$view = $this->view('XF:TemplateModification\Contents', '');
       
$view->setJsonParam('template', $template ? $template->template : false);
        return
$view;
    }

   
/**
     * @param string $id
     * @param array|string|null $with
     * @param null|string $phraseKey
     *
     * @return \XF\Entity\TemplateModification
     */
   
protected function assertTemplateModificationExists($id, $with = null, $phraseKey = null)
    {
        return
$this->assertRecordExists('XF:TemplateModification', $id, $with, $phraseKey);
    }

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