Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/components/com_extmanager/controllers/templates.php
<?php
/**
* @version        $Id: templates.php 2405 2021-04-13 16:06:13Z IOS $
* @package        Elxis
* @subpackage    Component Extensions Manager
* @copyright    Copyright (c) 2006-2021 Elxis CMS (https://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( https://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( https://www.elxis.org )
* @description     Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


class
templatesExtmanagerController extends extmanagerController {

   
/*********************/
    /* MAGIC CONSTRUCTOR */
    /*********************/
   
public function __construct($view=null, $task='', $model=null) {
       
parent::__construct($view, $task, $model);
    }


   
/*********************************/
    /* PREPARE TO DISPLAY TEMPLATES */
    /*********************************/
   
public function listtempls() {
       
$this->listExtensions('templates');//base
   
}


   
/*******************/
    /* DELETE TEMPLATE */
    /*******************/
   
public function deletetemplate() {
       
$this->deleteExtension('templates');//base
   
}


   
/*****************/
    /* EDIT TEMPLATE */
    /*****************/
   
public function edittemplate() {
       
$this->editExtension('templates');//base
   
}


   
/*****************/
    /* SAVE TEMPLATE */
    /*****************/
   
public function savetemplate() {
       
$elxis = eFactory::getElxis();
       
$eLang = eFactory::getLang();
       
$eSession = eFactory::getSession();

       
$sess_token = trim($eSession->get('token_fmextedit'));
       
$token = trim(filter_input(INPUT_POST, 'token', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
        if ((
$token == '') || ($sess_token == '') || ($sess_token != $token)) {
           
exitPage::make('403', 'CEXT-0010', $eLang->get('REQDROPPEDSEC'));
        }

       
$task = isset($_POST['task']) ? trim($_POST['task']) : 'save';
       
$id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
        if (
$id < 1) {
           
$link = $elxis->makeAURL('extmanager:templates/');
           
$elxis->redirect($link, 'Engine not found!', true);
        }

        if (
$elxis->acl()->check('com_extmanager', 'templates', 'edit') < 1) {
           
$msg = $eLang->get('NOTALLOWACTION');
           
$link = $elxis->makeAURL('extmanager:/');
           
$elxis->redirect($link, $msg, true);
        }

       
$row = new templatesDbTable();
        if (!
$row->load($id)) {
           
$link = $elxis->makeAURL('extmanager:templates/');
           
$elxis->redirect($link, 'Template not found!', true);
        }

       
$reldir = ($row->section == 'backend') ? 'templates/admin/' : 'templates/';
       
$xmlfile = ELXIS_PATH.'/'.$reldir.$row->template.'/'.$row->template.'.xml';
       
$hasxml = true;
        if (!
file_exists($xmlfile)) {
           
$xmlfile = ELXIS_PATH.'/'.$reldir.$row->template.'/templateDetails.xml'; //elxis 2009.x compatibility
           
if (!file_exists($xmlfile)) { $hasxml = false; }
        }

        if (
$hasxml) {
           
elxisLoader::loadFile('includes/libraries/elxis/parameters.class.php');
           
$params = new elxisParameters('', $xmlfile, 'template');
           
$row->params = isset($_POST['params']) ? $params->toString($_POST['params']) : null;
            unset(
$params);
        } else {
           
$row->params = null;
        }

        if (!
$row->update()) {
           
$redirurl = $elxis->makeAURL('extmanager:templates/edit.html?id='.$id);
           
$elxis->redirect($redirurl, $row->getErrorMsg(), true);
        }

       
$eSession->set('token_fmextedit');

        if (isset(
$_POST['onsave'])) {
           
$onsave = trim($_POST['onsave']);
           
$onsave = ltrim($_POST['onsave'], '/');
           
$xmldir = dirname($xmlfile).'/';
            if ((
$onsave != '') && file_exists($xmldir.$onsave) && is_file($xmldir.$onsave)) {
                include(
$xmldir.$onsave);
            }
        }

       
$p = array();
        if (
$task == 'apply') {
           
$p[] = 'id='.$id;
            if (isset(
$_POST['tabopen'])) {
               
$v = (int)$_POST['tabopen'];
                if (
$v > 0) { $p[] = 'tabopen='.$v; }
            }
        }
        if (isset(
$_POST['page'])) {
           
$v = (int)$_POST['page'];
            if (
$v > 1) { $p[] = 'page='.$v; }
        }
        if (isset(
$_POST['sn'])) {
           
$v = trim($_POST['sn']);
            if (
$v != '') { $p[] = 'sn='.$v; }
        }
        if (isset(
$_POST['so'])) {
           
$v = trim($_POST['so']);
            if (
$v != '') { $p[] = 'so='.$v; }
        }
        if (isset(
$_POST['lpsection'])) {
           
$v = trim($_POST['lpsection']);
            if (
$v != '') { $p[] = 'section='.$v; }
        }

       
$redirurl = $elxis->makeAURL('extmanager:templates/');
        if (
$task == 'apply') { $redirurl .= 'edit.html'; }
        if (
$p) { $redirurl .= '?'.implode('&', $p); }
       
$elxis->redirect($redirurl, $eLang->get('ITEM_SAVED'));
    }


   
/************************************/
    /* PREPARE TO LIST MODULE POSITIONS */
    /************************************/
   
public function listpositions() {
       
$eLang = eFactory::getLang();
       
$eDoc = eFactory::getDocument();
       
$elxis = eFactory::getElxis();
       
$pathway = eFactory::getPathway();

        if (
$elxis->acl()->check('com_extmanager', 'templates', 'edit') < 1) {
           
$link = $elxis->makeAURL('extmanager:/');
           
$elxis->redirect($link, $eLang->get('NOTALLOWACTION'), true);
        }


       
$options = array('limit' => 20, 'page' => 1, 'maxpage' => 1, 'sn' => 'position', 'so' => 'asc', 'limitstart' => 0, 'total' => 0);
       
$options['limit'] = (isset($_GET['limit'])) ? (int)$_GET['limit'] : 20;
        if (
$options['limit'] < 1) { $options['limit'] = 20; }
       
$elxis->updateCookie('limit', $options['limit']);
       
$options['page'] = (isset($_GET['page'])) ? (int)$_GET['page'] : 1;
        if (
$options['page'] < 1) { $options['page'] = 1; }
        if (isset(
$_GET['sn'])) {
           
$sn = trim($_GET['sn']);
            if (
$sn != '') { if (in_array($sn, array('position', 'modules', 'description'))) { $options['sn'] = $sn; } }
        }
       
$options['so'] = (isset($_GET['so'])) ? trim($_GET['so']) : 'asc';
        if (
$options['so'] != 'desc') { $options['so'] = 'asc'; }

       
$options['total'] = $this->model->countPositions();

       
$options['maxpage'] = ceil($options['total']/$options['limit']);
        if (
$options['maxpage'] < 1) { $options['maxpage'] = 1; }
        if (
$options['page'] > $options['maxpage']) { $options['page'] = $options['maxpage']; }
       
$options['limitstart'] = (($options['page'] - 1) * $options['limit']);

       
$rows = array();
        if (
$options['total'] > 0) {
           
$rows = $this->model->getFullPositions($options);
        }

       
$pathway->addNode($eLang->get('EXTENSIONS'), 'extmanager:/');
       
$pathway->addNode($eLang->get('TEMPLATES'), 'extmanager:templates/');
       
$pathway->addNode($eLang->get('MODULE_POSITIONS'));
       
$eDoc->setTitle($eLang->get('MODULE_POSITIONS'));
       
$eDoc->addFontAwesome();
       
$eDoc->addScriptLink($elxis->secureBase().'/components/com_extmanager/js/extmanager.js');
        if (
$rows) {
           
$eDoc->addNativeDocReady('elx5DataTable(\'positionstbl\', false);');
        }

       
$this->view->listPositionsHTML($rows, $options, $elxis, $eLang);
    }


   
/*******************************/
    /* SAVE MODULE POSITION (AJAX) */
    /*******************************/
   
public function saveposition() {
       
$elxis = eFactory::getElxis();
       
$eLang = eFactory::getLang();

       
$response = array('success' => 0, 'message' => '');

        if (
$elxis->acl()->check('com_extmanager', 'templates', 'edit') < 1) {
           
$response['message'] = $eLang->get('NOTALLOWACTION');
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$sess_token = trim(eFactory::getSession()->get('token_modpos'));
       
$token = trim(filter_input(INPUT_POST, 'token', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
        if ((
$token == '') || ($sess_token == '') || ($sess_token != $token)) {
           
$response['message'] = $eLang->get('REQDROPPEDSEC');
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$id = (isset($_POST['posid'])) ? (int)$_POST['posid'] : 0;
        if (
$id < 0) { $id = 0; }
       
$position = strtolower(trim(filter_input(INPUT_POST, 'position', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW)));
       
$description = trim(strip_tags(filter_input(INPUT_POST, 'description', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH)));
       
$position2 = preg_replace("/[^a-z0-9\_]/", '', $position);

        if ((
$position == '') || ($position != $position2)) {
           
$response['message'] = $eLang->get('POS_NAME_CHARS');
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$oldname = '';
       
elxisLoader::loadFile('includes/libraries/elxis/database/tables/tplpositions.db.php');
       
$row = new tplpositionsDbTable();
        if (
$id > 0) {
            if (!
$row->load($id)) {
               
$response['message'] = 'The requested position was not found!';
               
$this->ajaxHeaders('application/json');
                echo
json_encode($response);
                exit;
            }
            if (
$row->position != $position) {
               
$oldname = $row->position;
               
$num = $this->model->countPositionName($position);
                if (
$num > 0) {
                   
$response['message'] = $eLang->get('ALREADY_POS_NAME');
                   
$this->ajaxHeaders('application/json');
                    echo
json_encode($response);
                    exit;
                }
            }
        } else {
           
$num = $this->model->countPositionName($position);
            if (
$num > 0) {
               
$response['message'] = $eLang->get('ALREADY_POS_NAME');
               
$this->ajaxHeaders('application/json');
                echo
json_encode($response);
                exit;
            }
        }

       
$row->position = $position;
       
$row->description = $description;

        if (!
$row->store()) {
           
$response['message'] = 'Could not save position!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

        if ((
$id > 0) && ($oldname != '')) {
           
$this->model->updateModulesPositions($oldname, $row->position);
        }

       
$response['success'] = 1;

       
$this->ajaxHeaders('application/json');
        echo
json_encode($response);
        exit;
    }


   
/**************************/
    /* DELETE MODULE POSITION */
    /**************************/
   
public function deleteposition() {
       
$elxis = eFactory::getElxis();
       
$eLang = eFactory::getLang();

       
$response = array('success' => 0, 'message' => '');

        if (
$elxis->acl()->check('com_extmanager', 'templates', 'edit') < 1) {
           
$response['message'] = $eLang->get('NOTALLOWACTION');
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$id = isset($_POST['elids']) ? (int)$_POST['elids'] : 0;
        if (
$id < 1) {
           
$response['message'] = 'Invalid position!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
elxisLoader::loadFile('includes/libraries/elxis/database/tables/tplpositions.db.php');
       
$row = new tplpositionsDbTable();
        if (!
$row->load($id)) {
           
$response['message'] = 'The requested position was not found!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$options = array('section' => 'frontend', 'position' => $row->position);
       
$num = $this->model->countModules($options);
        if (
$num > 0) {
           
$response['message'] = $eLang->get('CNOT_DELETE_POSMODS');
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$ok = $row->delete();
        if (
$ok) {
           
$response['success'] = 1;
        } else {
           
$response['message'] = 'Could not delete module position!';
        }

       
$this->ajaxHeaders('application/json');
        echo
json_encode($response);
        exit;
    }


   
/*****************/
    /* COPY TEMPLATE */
    /*****************/
   
public function copytemplate() {
       
$elxis = eFactory::getElxis();
       
$eLang = eFactory::getLang();
       
$eFiles = eFactory::getFiles();

       
$response = array('success' => 0, 'message' => '');

        if (
$elxis->acl()->check('com_extmanager', 'templates', 'install') < 1) {
           
$response['message'] = $eLang->get('NOTALLOWACTION');
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }
        if (
defined('ELXIS_MULTISITE') && (ELXIS_MULTISITE != 1)) {
           
$response['message'] = 'You can only copy templates on the mother site!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$originalid = isset($_POST['originalid']) ? (int)$_POST['originalid'] : 0;
        if (
$originalid < 1) {
           
$response['message'] = 'No original template specified!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$original = new templatesDbTable();
        if (!
$original->load($originalid)) {
           
$response['message'] = 'Original template not found!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }
        if (
$original->section == 'backend') {
           
$response['message'] = 'You can copy only frontend templates!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$pat = "#([\']|[\"]|[\$]|[\#]|[\<]|[\>]|[\*]|[\%]|[\~]|[\`]|[\^]|[\|]|[\}]|[\\\])#u";
       
$title = filter_input(INPUT_POST, 'title', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW || FILTER_FLAG_STRIP_HIGH);
       
$title = eUTF::trim(preg_replace($pat, '', $title));
        if (
$title == '') {
           
$response['message'] = addslashes(sprintf($eLang->get('FIELDNOEMPTY'), $eLang->get('TITLE')));
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

       
$template = filter_input(INPUT_POST, 'template', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW || FILTER_FLAG_STRIP_HIGH);
       
$template = trim(preg_replace($pat, '', $template));
        if (
$template == '') {
           
$response['message'] = addslashes(sprintf($eLang->get('FIELDNOEMPTY'), $eLang->get('TEMPLATE')));
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }
       
$b = trim(preg_replace("/[^a-z0-9_]/", '', $template));
        if (
$b != $template) {
           
$response['message'] = addslashes(sprintf($eLang->get('FIELDNOACCCHAR'), $eLang->get('TEMPLATE')));
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }
        if (
file_exists(ELXIS_PATH.'/templates/'.$template)) {
           
$response['message'] = 'There is already a template named '.$template.'!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }
        if (
strpos($template, $original->template) !== false) {
           
$response['message'] = 'The new template name contains part of the original one!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }
       
$originaltemplate = $original->template;

        unset(
$original);

       
$ok = $eFiles->copyFolder('templates/'.$originaltemplate.'/', 'templates/'.$template.'/', false, false);
        if (!
$ok) {
           
$response['message'] = 'Copying template '.$originaltemplate.' to '.$template.' failed!';
           
$this->ajaxHeaders('application/json');
            echo
json_encode($response);
            exit;
        }

        if (
file_exists(ELXIS_PATH.'/templates/'.$template.'/'.$originaltemplate.'.xml')) {
           
$eFiles->move('templates/'.$template.'/'.$originaltemplate.'.xml', 'templates/'.$template.'/'.$template.'.xml');
           
$contents = file_get_contents(ELXIS_PATH.'/templates/'.$template.'/'.$template.'.xml');
           
$contents = preg_replace('@<name>(.*?)<\/name>@', '<name>'.$template.'</name>', $contents);
           
$contents = preg_replace('@<title>(.*?)<\/title>@', '<title>'.$title.'</title>', $contents);
           
$contents = preg_replace('@<created>(.*?)<\/created>@', '<created>'.gmdate('Y-m-d H:i:s').'</created>', $contents);
           
$contents = preg_replace('@<version>(.*?)<\/version>@', '<version>1.0</version>', $contents);
           
$contents = str_replace('/'.$originaltemplate.'/', '/'.$template.'/', $contents);
           
$eFiles->createFile('templates/'.$template.'/'.$template.'.xml', $contents);
            unset(
$contents);
        }

        if (
file_exists(ELXIS_PATH.'/templates/'.$template.'/'.$originaltemplate.'.png')) {
           
$eFiles->move('templates/'.$template.'/'.$originaltemplate.'.png', 'templates/'.$template.'/'.$template.'.png');
        }

       
$files = $eFiles->listFiles('templates/'.$template.'/', '(.php)$', true, true, false);
        if (
$files) {
            foreach (
$files as $file) {
                if (
strpos($file, 'templates/language/') !== false) { continue; }
               
$relpath = str_replace(ELXIS_PATH.'/', '', $file);
               
$contents = file_get_contents($file);
               
$contents = str_replace('/'.$originaltemplate.'/', '/'.$template.'/', $contents);
               
$contents = str_replace($originaltemplate.'.xml', $template.'.xml', $contents);
               
$contents = str_replace('\''.$originaltemplate.'\'', '\''.$template.'\'', $contents);
               
$eFiles->createFile($relpath, $contents);
                unset(
$contents);
            }
        }
        unset(
$files);

        if (
file_exists(ELXIS_PATH.'/templates/'.$template.'/language/')) {
           
$files = $eFiles->listFiles('templates/'.$template.'/language/', '(.php)$', false, false, false);
            if (
$files) {
                foreach (
$files as $file) {
                    if (
strpos($file, '.tpl_'.$originaltemplate.'.') === false) { continue; }
                   
$newfile = str_replace('.tpl_'.$originaltemplate.'.', '.tpl_'.$template.'.', $file);
                   
$eFiles->move('templates/'.$template.'/language/'.$file, 'templates/'.$template.'/language/'.$newfile);
                }
            }
            unset(
$files);
        }

       
$row = new templatesDbTable();
       
$row->title = $title;
       
$row->template = $template;
       
$row->section = 'frontend';
       
$row->iscore = 0;
       
$row->params = null;
       
$row->insert();

       
$response['success'] = 1;

       
$this->ajaxHeaders('application/json');
        echo
json_encode($response);
        exit;
    }

}
   
?>