Your IP : 216.73.216.196


Current Path : /var/www/html/administrator/components/com_kunena/src/Controller/
Upload File :
Current File : /var/www/html/administrator/components/com_kunena/src/Controller/TemplateController.php

<?php

/**
 * Kunena Component
 *
 * @package         Kunena.Administrator
 * @subpackage      Controllers
 *
 * @copyright       Copyright (C) 2008 - 2026 Kunena Team. All rights reserved.
 * @license         https://www.gnu.org/copyleft/gpl.html GNU/GPL
 * @link            https://www.kunena.org
 **/

namespace Kunena\Forum\Administrator\Controller;

\defined('_JEXEC') or die();

use Exception;
use Joomla\Filesystem\File;
use Joomla\Filesystem\Folder;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\FormController;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\CMS\Session\Session;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;
use Kunena\Forum\Libraries\Cache\KunenaCacheHelper;
use Kunena\Forum\Libraries\Config\KunenaConfig;
use Kunena\Forum\Libraries\Factory\KunenaFactory;
use Kunena\Forum\Libraries\Path\KunenaPath;
use Kunena\Forum\Libraries\Route\KunenaRoute;
use Kunena\Forum\Libraries\Template\KunenaTemplateHelper;

/**
 * Kunena Template Controller
 *
 * @since   Kunena 6.0
 */
class TemplateController extends FormController
{
    /**
     * @var     null|string
     * @since   Kunena 6.0
     */
    protected $baseurl = null;

    /**
     * @var     KunenaConfig
     * @since   Kunena 6.0
     */
    public $config = null;

    public $baseurlTemplate;

    /**
     * @var     array
     * @since   Kunena 2.0
     */
    protected $locked = ['aurelia'];

    /**
     * Constructor.
     *
     * @param   MVCFactoryInterface|null  $factory  The factory.
     * @param   null                      $app      The CMSApplication for the dispatcher
     * @param   null                      $input    Input
     *
     * @param   array                     $config   An optional associative array of configuration settings.
     *
     * @throws Exception
     * @since   Kunena 2.0
     *
     * @see     BaseController
     */
    public function __construct($config = [], ?MVCFactoryInterface $factory = null, $app = null, $input = null)
    {
        parent::__construct($config, $factory, $app, $input);

        $this->baseurl = 'administrator/index.php?option=com_kunena&view=templates';
        $this->baseurlTemplate = 'administrator/index.php?option=com_kunena&view=template';
        $this->config  = KunenaFactory::getConfig();
    }

    /**
     * Save template settings
     *
     * @param   null  $key     key
     * @param   null  $urlVar  url var
     *
     * @return  void
     *
     * @throws  Exception
     * @since   Kunena 2.0
     */
    public function save($key = null, $urlVar = null)
    {
        $template = $this->input->get('templatename', '');
        KunenaFactory::loadLanguage('com_kunena.controllers', 'admin');

        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        if (!$template) {
            $this->app->enqueueMessage(
                Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_OPERATION_FAILED') . ': ' .
                    Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_TEMPLATE_NOT_SPECIFIED'),
                'error'
            );

            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $this->internalSaveParamFile($template);

        $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_CONFIGURATION_SAVED'), 'success');
        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Method to save param.ini file on filesystem.
     *
     * @param   string  $template  The name of the template.
     *
     * @return  void
     *
     * @throws Exception
     * @throws null
     * @since   Kunena 3.0
     */
    protected function internalSaveParamFile(string $template): void
    {
        $params = $this->input->get('jform', [], 'post', 'array');

        if ($params['editorType'] == 'ckeditor') {
            $editorButtons = $this->SaveCKeditorParamFile($params);
        } else {
            $editorButtons = $this->SaveSCeditorParamFile($params);
        }

        if (!empty($params['nameskinckeditor'])) {
            if (!is_dir(KPATH_MEDIA . '/core/js/skins/' . $params['nameskinckeditor'])) {
                $params['nameskinckeditor'] = '';
                $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_CANNOT_FIND_CKEDITOR_SKIN'), 'error');
            }
        }

        if (!empty($params['ckeditorcustomprefixconfigfile'])) {
            if (!is_file(KPATH_MEDIA . '/core/js/' . $params['ckeditorcustomprefixconfigfile'] . 'ckeditor_config.js')) {
                $params['ckeditorcustomprefixconfigfile'] = '';
                $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_CANNOT_FIND_CKEDITOR_CUSTOM_CONFIG_FILE'), 'error');
            }
        }

        $file = KPATH_SITE . '/template/' . $template . '/config/params.ini';

        if (\count($params) > 0) {
            if (\count($editorButtons) > 0) {
                $editorButtons           = implode(',', $editorButtons);
                $params['editorButtons'] = $editorButtons;
            } else {
                $params['editorButtons'] = '';
            }

            $registry = new Registry();
            $registry->loadArray($params);
            $txt    = $registry->toString('INI');
            $return = File::write($file, $txt);

            if (!$return) {
                $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_OPERATION_FAILED') . ': ' . Text::sprintf('COM_KUNENA_A_TEMPLATE_MANAGER_FAILED_WRITE_FILE', $file), 'error');
                $this->app->redirect(KunenaRoute::_($this->baseurl, false));
            }
        }
    }

    /**
     * Save param into ini file for CKeditor
     *
     * @return  array
     *
     * @since   Kunena 2.0
     *@throws  Exception
     * @throws  null
     */
    protected function SaveCKeditorParamFile(array $params)
    {
        $editorButtons = [];

        if (!$params['Bold']) {
            $editorButtons[] = 'Bold';
        }

        if (!$params['Italic']) {
            $editorButtons[] = 'Italic';
        }

        if (!$params['Underline']) {
            $editorButtons[] = 'Underline';
        }

        if (!$params['Strike']) {
            $editorButtons[] = 'Strike';
        }

        if (!$params['Superscript']) {
            $editorButtons[] = 'Superscript';
        }

        if (!$params['Subscript']) {
            $editorButtons[] = 'Subscript';
        }

        if (!$params['JustifyRight']) {
            $editorButtons[] = 'JustifyRight';
        }

        if (!$params['JustifyLeft']) {
            $editorButtons[] = 'JustifyLeft';
        }

        if (!$params['JustifyBlock']) {
            $editorButtons[] = 'JustifyBlock';
        }

        if (!$params['JustifyCenter']) {
            $editorButtons[] = 'JustifyCenter';
        }

        if (!$params['RemoveFormat']) {
            $editorButtons[] = 'RemoveFormat';
        }

        if (!$params['Confidential']) {
            $editorButtons[] = 'Confidential';
        }

        if (!$params['Hidetext']) {
            $editorButtons[] = 'Hidetext';
        }

        if (!$params['Spoiler']) {
            $editorButtons[] = 'Spoiler';
        }

        if (!$params['Smiley']) {
            $editorButtons[] = 'Smiley';
        }

        if (!$params['Ebay']) {
            $editorButtons[] = 'Ebay';
        }

        if (!$params['X_Social']) {
            $editorButtons[] = 'X_Social';
        }

        if (!$params['Instagram']) {
            $editorButtons[] = 'Instagram';
        }

        if (!$params['Soundcloud']) {
            $editorButtons[] = 'Soundcloud';
        }

        if (!$params['Map']) {
            $editorButtons[] = 'Map';
        }

        if (!$params['FontSize']) {
            $editorButtons[] = 'FontSize';
        }

        if (!$params['TextColor']) {
            $editorButtons[] = 'TextColor';
        }

        if (!$params['Maximize']) {
            $editorButtons[] = 'Maximize';
        }

        if (!$params['Image']) {
            $editorButtons[] = 'Image';
        }

        if (!$params['Video']) {
            $editorButtons[] = 'Video';
        }

        if (!$params['Link_Unlink']) {
            $editorButtons[] = 'Link,Unlink';
        }

        if (!$params['BulletedList']) {
            $editorButtons[] = 'BulletedList';
        }

        if (!$params['NumberedList']) {
            $editorButtons[] = 'NumberedList';
        }

        if (!$params['Blockquote']) {
            $editorButtons[] = 'Blockquote';
        }

        if (!$params['Code']) {
            $editorButtons[] = 'Code';
        }

        return $editorButtons;
    }

    /**
     * Save param into ini file for SCeditor
     *
     * @return  array
     *
     * @since   Kunena 2.0
     *@throws  Exception
     * @throws  null
     */
    protected function SaveSCeditorParamFile(array $params)
    {
        // The parameters set into the $editorButtons array should be all in lowercase
        $editorButtons = [];
        
        if ($params['Cut']) {
            $editorButtons[] = 'cut';
        }
        
        if ($params['Copy']) {
            $editorButtons[] = 'copy';
        }
        
        if ($params['Paste']) {
            $editorButtons[] = 'paste';
        }
        
        if ($params['Bold']) {
            $editorButtons[] = 'bold';
        }
        
        if ($params['Source']) {
            $editorButtons[] = 'source';
        }
        
        if ($params['Table']) {
            $editorButtons[] = 'table';
        }
        
        if ($params['Quote']) {
            $editorButtons[] = 'quote';
        }
        
        if ($params['Italic']) {
            $editorButtons[] = 'italic';
        }
        
        if ($params['Underline']) {
            $editorButtons[] = 'underline';
        }
        
        if ($params['Strike']) {
            $editorButtons[] = 'strike';
        }
        
        if ($params['Superscript']) {
            $editorButtons[] = 'superscript';
        }
        
        if ($params['Subscript']) {
            $editorButtons[] = 'subscript';
        }
        
        if ($params['JustifyRight']) {
            $editorButtons[] = 'right';
        }
        
        if ($params['JustifyLeft']) {
            $editorButtons[] = 'left';
        }
        
        if ($params['JustifyBlock']) {
            $editorButtons[] = 'justify';
        }
        
        if ($params['JustifyCenter']) {
            $editorButtons[] = 'center';
        }
        
        if ($params['RemoveFormat']) {
            $editorButtons[] = 'removeFormat';
        }
        
        if (!$params['Confidential']) {
            $editorButtons[] = 'Confidential';
        }
        
        if (!$params['Hidetext']) {
            $editorButtons[] = 'Hidetext';
        }
        
        if (!$params['Spoiler']) {
            $editorButtons[] = 'Spoiler';
        }
        
        if (!$params['Smiley']) {
            $editorButtons[] = 'Emoticon';
        }
        
        if ($params['Ebay']) {
            $editorButtons[] = 'Ebay';
        }
        
        if ($params['X_Social']) {
            $editorButtons[] = 'X_Social';
        }
        
        if ($params['Instagram']) {
            $editorButtons[] = 'Instagram';
        }
        
        if ($params['Soundcloud']) {
            $editorButtons[] = 'Soundcloud';
        }
        
        if ($params['Map']) {
            $editorButtons[] = 'Map';
        }
        
        if ($params['FontSize']) {
            $editorButtons[] = 'font,size';
        }
        
        if ($params['TextColor']) {
            $editorButtons[] = 'color';
        }
        
        if ($params['Image']) {
            $editorButtons[] = 'Image';
        }
        
        if ($params['Video']) {
            $editorButtons[] = 'Video';
        }
        
        if ($params['Link_Unlink']) {
            $editorButtons[] = 'link,unlink';
        }
        
        if ($params['BulletedList']) {
            $editorButtons[] = 'bulletedList';
        }
        
        if ($params['NumberedList']) {
            $editorButtons[] = 'orderedlist';
        }
        
        if (!$params['Blockquote']) {
            $editorButtons[] = 'Blockquote';
        }
        
        if ($params['Code']) {
            $editorButtons[] = 'Code';
        }
        
        return $editorButtons;
    }    

    /**
     * Apply
     *
     * @return  void
     *
     * @throws  null
     * @throws  Exception
     * @since   Kunena 2.0
     */
    public function applychanges(): void
    {
        $template = $this->input->get('templatename', '');
        $menus    = $this->input->get('selections', [], 'array');
        $menus    = ArrayHelper::toInteger($menus);

        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        if (!$template) {
            $this->app->enqueueMessage(
                Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_OPERATION_FAILED') . ': ' .
                    Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_TEMPLATE_NOT_SPECIFIED'),
                'error'
            );

            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $this->internalSaveParamFile($template);

        $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_CONFIGURATION_SAVED'), 'success');
        $this->setRedirect(KunenaRoute::_($this->baseurl . '&view=template&layout=edit&name=' . $template, false));
    }

    /**
     * Method to restore the default settings of the template selected
     *
     * @return  void
     *
     * @throws  Exception
     * @since   Kunena 5.1
     */
    public function restore(): void
    {
        $template = $this->input->get('templatename');
        $file     = KPATH_SITE . '/template/' . $template . '/config/params.ini';

        if (file_exists($file)) {
            $result = File::delete($file);

            if ($result) {
                File::write($file, '');
            }
        }

        $this->app->enqueueMessage(Text::_('COM_KUNENA_TEMPLATES_SETTINGS_RESTORED_SUCCESSFULLY'), 'success');
        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Edit the template selected
     *
     * @param   null  $key     key
     * @param   null  $urlVar  url var
     *
     * @return  void
     *
     * @throws  Exception
     * @since   Kunena 2.0
     */
    public function edit($key = null, $urlVar = null)
    {
        $cid      = $this->input->get('cid', [], 'array');
        $template = array_shift($cid);

        if (!$template) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_TEMPLATE_NOT_SPECIFIED'), 'error');

            return;
        }

        $tBaseDir = KunenaPath::clean(KPATH_SITE . '/template');

        if (!is_dir($tBaseDir . '/' . $template)) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_TEMPLATE_NOT_FOUND'), 'error');

            return;
        }

        $template = KunenaPath::clean($template);
        $this->app->setUserState('kunena.edit.templatename', $template);

        $this->setRedirect(KunenaRoute::_($this->baseurl . "&view=template&layout=edit&name={$template}", false));
    }

    /**
     * Choose scss
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function chooseScss(): void
    {
        $template     = $this->input->getArray(['cid' => '']);
        $templatename = array_shift($template['cid']);
        $this->app->setUserState('kunena.templatename', $templatename);

        $tBaseDir = KunenaPath::clean(KPATH_SITE . '/template');

        if (!is_dir($tBaseDir . '/' . $templatename . '/assets/scss')) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_NO_SCSS'), 'warning');

            return;
        }

        $this->setRedirect(KunenaRoute::_($this->baseurlTemplate . "&layout=choosescss", false));
    }

    /**
     * Edit Scss
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function editscss(): void
    {
        $template     = $this->app->getInput()->getArray(['cid' => '']);
        $templatename = array_shift($template['cid']);

        $filename = $this->app->getInput()->get('filename');

        if (File::getExt($filename) !== 'scss') {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_WRONG_SCSS'), 'warning');
            $this->setRedirect(KunenaRoute::_($this->baseurl . '&layout=choosescss&id=' . $template, false));
        }

        $this->app->setUserState('kunena.templatename', $templatename);
        $this->app->setUserState('kunena.editscss.filename', $filename);

        $this->setRedirect(KunenaRoute::_($this->baseurlTemplate . "&layout=editscss", false));
    }

    /**
     * Choose Css
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function chooseCss(): void
    {
        $template     = $this->input->getArray(['cid' => '']);
        $templatename = array_shift($template['cid']);

        $this->app->setUserState('kunena.templatename', $templatename);

        $this->setRedirect(KunenaRoute::_($this->baseurlTemplate . "&layout=choosecss", false));
    }

    /**
     * Edit Css
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function editCss(): void
    {
        $template     = $this->app->getInput()->getArray(['cid' => '']);
        $templatename = array_shift($template['cid']);

        $filename = $this->app->getInput()->get('filename');

        if (File::getExt($filename) !== 'css') {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_WRONG_CSS'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl . '&layout=choosecss&id=' . $templatename, false));
        }

        $this->app->setUserState('kunena.editCss.tmpl', $templatename);
        $this->app->setUserState('kunena.editCss.filename', $filename);

        $this->setRedirect(KunenaRoute::_($this->baseurlTemplate . "&layout=editcss", false));
    }

    /**
     * Apply scss
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function applyScss(): void
    {
        $this->internalSaveScss();
    }

    /**
     * Save Scss
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function saveScss(): void
    {
        $this->internalSaveScss();
    }

    /**
     * Internal method to save Scss or apply changes
     *
     * @return  void
     *
     * @since   Kunena 6.0
     */
    protected function internalSaveScss(): void
    {
        $template     = $this->app->getInput()->getArray(['cid' => '']);
        $templatename = array_shift($template['cid']);

        $filename    = $this->app->getInput()->get('filename');
        $filecontent = $this->app->getInput()->get('filecontent', '', 'raw');
        $task         = $this->app->getInput()->get('task');

        if (!Session::checkToken('post')) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        if (!$templatename) {
            $this->app->enqueueMessage(
                Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_OPERATION_FAILED') . ': '
                    . Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_TEMPLATE_NOT_SPECIFIED.'),
                'error'
            );
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $file   = KPATH_SITE . '/template/' . $templatename . '/assets/scss/' . $filename;
        $return = File::write($file, $filecontent);

        $ktemplate = KunenaFactory::getTemplate();
        $ktemplate->createCacheDir();

        if ($return && $task == 'applyScss') {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_FILE_SAVED'), 'success');
            $this->setRedirect(KunenaRoute::_($this->baseurlTemplate . '&layout=editscss', false));
        } elseif (!$return && $task == 'applyScss') {
            $this->app->enqueueMessage(
                Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_OPERATION_FAILED') . ': '
                    . Text::sprintf('COM_KUNENA_A_TEMPLATE_MANAGER_FAILED_OPEN_FILE.', $file),
                'error'
            );
            $this->setRedirect(KunenaRoute::_($this->baseurlTemplate . '&layout=choosescss', false));
        } elseif ($return && $task == 'saveScss') {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_FILE_SAVED'), 'success');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));
        } else {
            $this->app->enqueueMessage(
                Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_OPERATION_FAILED') . ': '
                    . Text::sprintf('COM_KUNENA_A_TEMPLATE_MANAGER_FAILED_OPEN_FILE.', $file),
                'error'
            );
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));
        }
    }

    /**
     * Apply Css
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function applyCss(): void
    {
        $this->internalSaveCss();
    }

    /**
     * Save Css
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function saveCss(): void
    {
        $this->internalSaveCss();
    }

    /**
     * Internal method to save Css or apply changes
     *
     * @return  void
     *
     * @since   Kunena 6.0
     */
    protected function internalSaveCss(): void
    {
        $template     = $this->app->getInput()->getArray(['cid' => '']);
        $templatename = array_shift($template['cid']);
        $filename     = $this->app->getInput()->get('filename');
        $filecontent  = $this->app->getInput()->get('filecontent', '', 'raw');
        $task         = $this->app->getInput()->get('task');

        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        if (!$templatename) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_OPERATION_FAILED') . ': ' . Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_TEMPLATE_NOT_SPECIFIED.'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $file   = KPATH_MEDIA . '/core/css/' . $filename;
        $return = File::write($file, $filecontent);

        if ($return && $task == 'applyCss') {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_FILE_SAVED'), 'success');
            $this->setRedirect(KunenaRoute::_($this->baseurlTemplate . "&layout=editcss", false));
        } elseif (!$return && $task == 'applyCss') {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_OPERATION_FAILED') . ': ' . Text::sprintf('COM_KUNENA_A_TEMPLATE_MANAGER_FAILED_OPEN_FILE.', $file), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurlTemplate . "&layout=choosecss", false));
        } elseif ($return && $task == 'saveCss') {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_FILE_SAVED'), 'success');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));
        } else {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_OPERATION_FAILED') . ': ' . Text::sprintf('COM_KUNENA_A_TEMPLATE_MANAGER_FAILED_OPEN_FILE.', $file), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));
        }
    }

    /**
     * Add a new template
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function addnew()
    {
        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $this->setRedirect(KunenaRoute::_($this->baseurlTemplate . '&layout=addnew', false));
    }

    /**
     * Publish
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function publish(): void
    {
        $cid = $this->input->get('cid', [], 'array');
        $id  = array_shift($cid);

        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        if ($id) {
            $this->config->template = $id;
            $this->config->save();
        }

        $template = KunenaFactory::getTemplate($id);
        $template->clearCache();

        $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_DEFAULT_SELECTED'), 'success');
        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }

    /**
     * Uninstall Kunena template
     *
     * @return  void
     *
     * @throws  Exception
     * @throws  null
     * @since   Kunena 2.0
     */
    public function uninstall(): void
    {
        $cid      = $this->input->get('cid', [], 'array');
        $id       = array_shift($cid);
        $template = $id;

        if (!Session::checkToken()) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        // Initialize variables
        $otemplate = KunenaTemplateHelper::parseXmlFile($id);

        if (!$otemplate) {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_TEMPLATE_NOT_SPECIFIED'), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        if (\in_array($id, $this->locked)) {
            $this->app->enqueueMessage(Text::sprintf('COM_KUNENA_A_CTRL_TEMPLATES_ERROR_UNINSTALL_SYSTEM_TEMPLATE', $otemplate->name), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        if (KunenaTemplateHelper::isDefault($template)) {
            $this->app->enqueueMessage(Text::sprintf('COM_KUNENA_A_CTRL_TEMPLATES_ERROR_UNINSTALL_DEFAULT_TEMPLATE', $otemplate->name), 'error');
            $this->setRedirect(KunenaRoute::_($this->baseurl, false));

            return;
        }

        $tpl = KPATH_SITE . '/template/' . $template;

        // Delete the template directory
        if (is_dir($tpl)) {
            $retval = Folder::delete($tpl);

            // Clear all cache, just in case.
            KunenaCacheHelper::clearAll();
            $this->app->enqueueMessage(Text::sprintf('COM_KUNENA_A_TEMPLATE_MANAGER_UNINSTALL_SUCCESS', $id), 'success');
        } else {
            $this->app->enqueueMessage(Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_TEMPLATE') . ' ' . Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_UNINSTALL') . ': ' . Text::_('COM_KUNENA_A_TEMPLATE_MANAGER_DIR_NOT_EXIST'), 'error');
        }

        $this->setRedirect(KunenaRoute::_($this->baseurl, false));
    }
}