Files
ave-cms-alt/class/class.templates.php
2025-09-18 17:05:50 +05:00

694 lines
19 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* AVE.cms
*
* @package AVE.cms
* @version 4.x
* @filesource
* @copyright © 2007-2025 AVE.cms, https://www.ave.gitget.ru
*
*/
class AVE_Templates
{
public static function setTemplate($template_id)
{
$cache_file = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/include/templates/' . $template_id . '/template.inc';
if (isset($_REQUEST['template_text']) && $_REQUEST['template_text'] != '')
$template = stripslashes(pretty_chars($_REQUEST['template_text']));
else
return false;
// Проверяем наличие папки шаблона
if (! file_exists(dirname($cache_file)))
mkdir(dirname($cache_file), 0766, true);
// Сохраняем данные в фвйл
file_put_contents($cache_file, $template);
return true;
}
public static function getTemplate($template_id)
{
$cache_file = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/include/templates/' . $template_id . '/template.inc';
if (file_exists($cache_file) && filesize($cache_file))
$template = file_get_contents($cache_file);
else
$template = false;
return $template;
}
public static function templatesList()
{
global $AVE_DB, $AVE_Template;
//-- Сss файлы
$dir = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/css/';
if ($handle = opendir($dir))
{
$css_files = array();
$ii = 0;
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != ".." && substr($file, -3) == 'css')
{
if(! is_dir($dir ."/" . $file))
$files[$ii]['filename'] = $file;
$files[$ii]['filesize'] = filesize($dir ."/" . $file);
$css_files[] = $files;
}
$ii = $ii++;
}
closedir($handle);
}
$AVE_Template->assign('css_files', $css_files);
unset($dir, $css_files);
//-- Js файлы
$dir = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/js/';
if ($handle = opendir($dir))
{
$js_files = array();
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != ".." && substr($file,-2) == 'js')
{
if(! is_dir($dir."/".$file))
$files[$ii]['filename'] = $file;
$files[$ii]['filesize'] = filesize($dir ."/" . $file);
$js_files[] = $files;
}
}
closedir($handle);
}
$AVE_Template->assign('js_files', $js_files);
unset($dir, $js_files);
$items = array();
$num_tpl = $AVE_DB->Query("
SELECT
COUNT(*)
FROM
" . PREFIX . "_templates
")->GetCell();
$page_limit = (isset($_REQUEST['set']) && is_numeric($_REQUEST['set'])) ? (int)$_REQUEST['set'] : 30;
$pages = ceil($num_tpl / $page_limit);
$set_start = get_current_page() * $page_limit - $page_limit;
if ($num_tpl > $page_limit)
{
$page_nav = " <a class=\"pnav\" href=\"index.php?do=templates&page={s}&amp;cp=" . SESSION. "\">{t}</a> ";
$page_nav = get_pagination($pages, 'page', $page_nav);
$AVE_Template->assign('page_nav', $page_nav);
}
$sql = $AVE_DB->Query("
SELECT
*
FROM
" . PREFIX . "_templates
LIMIT
" . $set_start . "," . $page_limit . "
");
while ($row = $sql->FetchRow())
{
$inuse = $AVE_DB->Query("
SELECT 1
FROM
" . PREFIX . "_rubrics AS rubric,
" . PREFIX . "_module AS module
WHERE
rubric.rubric_template_id = '" . $row->Id . "'
OR
module.ModuleTemplate = '" . $row->Id . "'
LIMIT 1
")->NumRows();
if (! $inuse)
$row->can_deleted = 1;
$row->template_author = get_username_by_id($row->template_author_id);
array_push($items, $row);
unset($row);
}
$AVE_Template->assign('items', $items);
$AVE_Template->assign('content', $AVE_Template->fetch('templates/templates.tpl'));
}
public static function templatesNew()
{
global $AVE_Template;
$AVE_Template->assign('content', $AVE_Template->fetch('templates/form.tpl'));
}
public static function templatesEdit()
{
global $AVE_DB, $AVE_Template;
$template_id = (int)($_REQUEST['Id'] ?? 0);
// Попытка получить запись из базы по ID
$row = $AVE_DB->Query("
SELECT *
FROM " . PREFIX . "_templates
WHERE Id = '" . $template_id . "'
")->FetchRow();
if (!$row) {
// Если запись не найдена, получаем последний созданный шаблон из базы
$row = $AVE_DB->Query("
SELECT *
FROM " . PREFIX . "_templates
ORDER BY Id DESC
LIMIT 1
")->FetchRow();
if (!$row) {
// Если таблица пуста, инициализируем пустой объект
$row = new stdClass();
$row->template_text = '';
}
// При выводе последнего шаблона берем текст из базы напрямую
$row->template_text = pretty_chars($row->template_text);
$row->template_text = stripslashes($row->template_text);
} else {
// Если шаблон найден, берем содержимое из кеша (файла)
$template = self::getTemplate($template_id);
if ($template !== false && $template !== null) {
$row->template_text = $template;
} else {
// Если кеш отсутствует, fallback на базу
$row->template_text = pretty_chars($row->template_text);
$row->template_text = stripslashes($row->template_text);
}
}
// Проверка PHP-кода и прав
$check_code = strtolower($row->template_text ?? '');
if (is_php_code($check_code) && !check_permission('template_php')) {
$AVE_Template->assign('php_forbidden', 1);
$AVE_Template->assign('read_only', 'readonly');
}
$AVE_Template->assign('row', $row);
$AVE_Template->assign('content', $AVE_Template->fetch('templates/form.tpl'));
}
public static function templatesSave()
{
global $AVE_DB, $AVE_Template;
if (isset($_REQUEST['Id']) AND is_numeric($_REQUEST['Id']))
{
$template_id = $_REQUEST['Id'];
$ok = true;
$check_code = strtolower($_REQUEST['template_text']);
if (is_php_code($check_code) && ! check_permission('template_php'))
{
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP') . ' (' . stripslashes($_REQUEST['template_title']) . ')');
$AVE_Template->assign('php_forbidden', 1);
$ok = false;
$message = $AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP_ERR');
$header = $AVE_Template->get_config_vars('TEMPLATES_ERROR');
$theme = 'error';
}
if ($ok === false)
{
if (isAjax())
{
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
exit;
}
else
{
$row->template_text = stripslashes($_REQUEST['template_text']);
$AVE_Template->assign('row', $row);
}
}
else
{
$sql = $AVE_DB->Query("
UPDATE
" . PREFIX . "_templates
SET
template_title = '" . $_REQUEST['template_title'] . "',
template_text = '" . addslashes(pretty_chars($_REQUEST['template_text'])) . "'
WHERE
Id = '" . $template_id . "'
");
if ($sql === false)
{
$message = $AVE_Template->get_config_vars('TEMPLATES_SAVED_ERR');
$header = $AVE_Template->get_config_vars('TEMPLATES_ERROR');
$theme = 'error';
}
else
{
// Сохраняем шаблон в файле
self::setTemplate($template_id);
$message = $AVE_Template->get_config_vars('TEMPLATES_SAVED');
$header = $AVE_Template->get_config_vars('TEMPLATES_SUCCESS');
$theme = 'accept';
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_CHANGE') . ' - (' . stripslashes($_REQUEST['template_title']) . ')');
}
if (isAjax())
{
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
}
else
{
$AVE_Template->assign('message', $message);
header('Location:index.php?do=templates&cp=' . SESSION);
}
exit;
}
}
else
{
$save = true;
$errors = array();
$row = new stdClass();
$row->template_text = pretty_chars($_REQUEST['template_text']);
$row->template_text = stripslashes($row->template_text);
$row->template_title = stripslashes($_REQUEST['template_title']);
if (empty($_REQUEST['template_title']))
{
$save = false;
$errors[] = $AVE_Template->get_config_vars('TEMPLATES_REPORT_ERROR_TITLE');
}
if (empty($_REQUEST['template_text']))
{
$save = false;
$errors[] = $AVE_Template->get_config_vars('TEMPLATES_REPORT_ERROR_TEXT');
}
$check_code = strtolower($_REQUEST['template_text']);
if (is_php_code($check_code) && !check_permission('template_php'))
{
$AVE_Template->assign('php_forbidden', 1);
$save = false;
}
if ($save === false)
{
$AVE_Template->assign('row', $row);
$AVE_Template->assign('errors', $errors);
$AVE_Template->assign('content', $AVE_Template->fetch('templates/form.tpl'));
}
else
{
$sql = $AVE_DB->Query("
INSERT
INTO
" . PREFIX . "_templates
SET
Id = '',
template_title = '" . $_REQUEST['template_title'] . "',
template_text = '" . addslashes(pretty_chars($_REQUEST['template_text'])) . "',
template_author_id = '" . $_SESSION['user_id'] . "',
template_created = '" . time() . "'
");
$template_id = $AVE_DB->InsertId();
// Сохраняем шаблон в файле
self::setTemplate($template_id);
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_NEW') . '(' . stripslashes(htmlspecialchars($_REQUEST['template_text'], ENT_QUOTES)) . ') (Id:' . (int)$iid . ')');
if (! $_REQUEST['next_edit'])
header('Location:index.php?do=templates&cp=' . SESSION);
else
header('Location:index.php?do=templates&action=edit&Id=' . (int)$template_new . '&cp=' . SESSION);
exit;
}
}
}
public static function templatesDelete()
{
global $AVE_DB, $AVE_Template;
$template_id = (int)($_REQUEST['Id'] ?? 0);
// Проверка использования шаблона
$Used = $AVE_DB->Query("
SELECT rubric_template_id
FROM " . PREFIX . "_rubrics
WHERE rubric_template_id = '" . $template_id . "'
")->GetCell();
if ($Used >= 1 || $template_id == 1) {
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_ID_ERR') . ' - (' . templateName($template_id) . ')');
header('Location:index.php?do=templates');
exit;
} else {
$template_name = templateName($template_id);
// Удаляем запись из базы
$AVE_DB->Query("
DELETE FROM " . PREFIX . "_templates
WHERE Id = '" . $template_id . "'
");
// Удаляем кеш-файл шаблона
$cache_file = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/include/templates/' . $template_id . '/template.inc';
if (file_exists($cache_file)) {
@unlink($cache_file);
// Если хотите, можно логировать успешное удаление
reportLog("Cache file deleted: " . $cache_file);
}
// Можно также удалить пустую папку, если нужно
$cache_dir = dirname($cache_file);
if (is_dir($cache_dir) && count(scandir($cache_dir)) == 2) { // только . и ..
@rmdir($cache_dir);
}
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_DELETE') . ' - (' . $template_name . ')');
header('Location:index.php?do=templates');
exit;
}
}
public static function templatesMulti()
{
global $AVE_DB, $AVE_Template;
$ok = true;
$errors = array();
$template_text = $AVE_DB->Query("
SELECT
template_text
FROM
" . PREFIX . "_templates
WHERE
Id = '" . (int)$_REQUEST['Id'] . "'
")->GetCell();
$template_title = $AVE_DB->Query("
SELECT
template_title
FROM
" . PREFIX . "_templates
WHERE
template_title = '" . $_REQUEST['template_title'] . "'
")->GetCell();
if ($template_title != '')
{
array_push($errors, $AVE_Template->get_config_vars('TEMPLATES_EXIST'));
$AVE_Template->assign('errors', $errors);
$ok = false;
}
if ($_REQUEST['template_title'] == '')
{
array_push($errors, $AVE_Template->get_config_vars('TEMPLATES_NO_NAME'));
$AVE_Template->assign('errors', $errors);
$ok = false;
}
if ($ok)
{
$AVE_DB->Query("
INSERT
INTO
" . PREFIX . "_templates
SET
Id = '',
template_title = '" . $_REQUEST['template_title'] . "',
template_text = '" . addslashes($template_text) . "',
template_author_id = '" . $_SESSION['user_id'] . "',
template_created = '" . time() . "'
");
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_COPY') . ' - (<strong>' . $_REQUEST['template_title'].'</strong> - '.templateName((int)$_REQUEST['Id']) . ')');
header('Location:index.php?do=templates'.'&cp=' . SESSION);
exit;
}
$row = new stdClass();
$row->template_text = pretty_chars($template_text);
$row->template_text = stripslashes($template_text);
$row->template_title = stripslashes($_REQUEST['template_title']);
$AVE_Template->assign('row', $row);
$AVE_Template->assign('content', $AVE_Template->fetch('templates/form.tpl'));
}
public static function templatesEditCss()
{
global $AVE_Template;
$_REQUEST['sub'] = (! isset($_REQUEST['sub']))
? ''
: $_REQUEST['sub'];
switch ($_REQUEST['sub'])
{
case 'save':
$dir = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/css/' . $_REQUEST['name_file'];
$check_code = stripcslashes($_REQUEST['code_text']);
if (is_php_code($check_code))
{
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP_CSS') . ' - (' . stripslashes($_REQUEST['name_file']) . ')');
$message = $AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP_ERR');
$header = $AVE_Template->get_config_vars('TEMPLATES_ERROR');
$theme = 'error';
if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = '1') {
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
exit;
}
header('Location:index.php?do=templates');
exit;
}
$result = file_put_contents($dir, trim($check_code));
if ($result === false)
{
$message = $AVE_Template->get_config_vars('TEMPLATES_SAVED_ERR_FILE');
$header = $AVE_Template->get_config_vars('TEMPLATES_ERROR');
$theme = 'error';
}
else
{
$message = $AVE_Template->get_config_vars('TEMPLATES_SAVED_FILE');
$header = $AVE_Template->get_config_vars('TEMPLATES_SUCCESS');
$theme = 'accept';
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_FILE') . ' - (' . stripslashes($dir) . ')');
}
if (isAjax())
{
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
}
else
{
$AVE_Template->assign('message', $message);
header('Location:index.php?do=templates&cp=' . SESSION);
}
exit;
case 'delete':
$file = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/css/'. $_REQUEST['name_file'];
if (! is_file($file))
return false;
if (@unlink($file))
{
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_DEL_OK') . ' ('.basename($_REQUEST['name_file']).')');
}
else
{
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_DEL_ER') . ' ('.basename($_REQUEST['name_file']).')');
}
header('Location:index.php?do=templates&cp=' . SESSION);
exit;
default:
$dir = BASE_DIR.'/templates/'.DEFAULT_THEME_FOLDER.'/css/'.stripslashes($_REQUEST['name_file']);
$code_text = file_get_contents($dir);
$formaction = "index.php?do=templates&action=edit_css&sub=save&name_file=".stripslashes($_REQUEST['name_file']);
$AVE_Template->assign('formaction', $formaction);
$AVE_Template->assign('code_text', $code_text);
break;
}
$AVE_Template->assign('content', $AVE_Template->fetch('templates/edit_css.tpl'));
}
public static function templatesEditJs()
{
global $AVE_Template;
$_REQUEST['sub'] = (! isset($_REQUEST['sub']))
? ''
: $_REQUEST['sub'];
switch ($_REQUEST['sub'])
{
case 'save':
$dir = BASE_DIR.'/templates/'.DEFAULT_THEME_FOLDER.'/js/'.$_REQUEST['name_file'];
$check_code = stripcslashes($_REQUEST['code_text']);
if (is_php_code($check_code))
{
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP_JS') . ' - (' . stripslashes($_REQUEST['name_file']) . ')');
$message = $AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP_ERR');
$header = $AVE_Template->get_config_vars('TEMPLATES_ERROR');
$theme = 'error';
if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = '1') {
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
exit;
}
header('Location:index.php?do=templates');
exit;
}
$result = file_put_contents($dir, trim($check_code));
if ($result === false)
{
$message = $AVE_Template->get_config_vars('TEMPLATES_SAVED_ERR_FILE');
$header = $AVE_Template->get_config_vars('TEMPLATES_ERROR');
$theme = 'error';
}
else
{
$message = $AVE_Template->get_config_vars('TEMPLATES_SAVED_FILE');
$header = $AVE_Template->get_config_vars('TEMPLATES_SUCCESS');
$theme = 'accept';
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_FILE') . ' - (' . stripslashes($dir) . ')');
}
if (isAjax())
{
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
}
else
{
$AVE_Template->assign('message', $message);
header('Location:index.php?do=templates&cp=' . SESSION);
}
exit;
case 'delete':
$file = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/js/'. $_REQUEST['name_file'];
if (! is_file($file))
return false;
if (@unlink($file))
{
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_DEL_OK') . ' ('.basename($_REQUEST['name_file']).')');
}
else
{
reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_DEL_ER') . ' ('.basename($_REQUEST['name_file']).')');
}
header('Location:index.php?do=templates&cp=' . SESSION);
exit;
default:
$dir = BASE_DIR.'/templates/'.DEFAULT_THEME_FOLDER.'/js/'.stripslashes($_REQUEST['name_file']);
$code_text = file_get_contents($dir);
$formaction = "index.php?do=templates&action=edit_js&sub=save&name_file=".stripslashes($_REQUEST['name_file']);
$AVE_Template->assign('formaction', $formaction);
$AVE_Template->assign('code_text', $code_text);
break;
}
$AVE_Template->assign('content', $AVE_Template->fetch('templates/edit_js.tpl'));
}
}
?>