Files
ave-cms-alt/class/class.template.php

488 lines
17 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 (АДАПТИРОВАНО ДЛЯ SMARTY 5 С NAMESPACE)
* @filesource
* @copyright © 2007-2025 AVE.cms, https://ave.gitget.ru
*
*/
/**
* Подключаем файл шаблонизатора Smarty (пользовательская установка)
*/
$smarty_path = BASE_DIR . '/lib/Smarty/libs/Smarty.class.php';
require($smarty_path);
// Импортируем класс Smarty 5 для удобства
use Smarty\Smarty;
/**
* Расширение класса шаблонизатора Smarty
* Теперь наследуемся от Smarty 5 через его namespace
*/
class AVE_Template extends Smarty
{
/**
* СВОЙСТВА
*/
// Вернули свойства без явных типов
public $cache_dir_root;
public $module_cache_dir;
public $session_dir;
public $sql_cache_dir;
public $compile_dir;
/**
* Конструктор
*
* @param string $template_dir путь к директории шаблонов по умолчанию
* @return AVE_Template
*/
function __construct($template_dir)
{
// Вызов конструктора родителя Smarty
parent::__construct();
/**
* Путь к директории шаблонов по умолчанию.
* Если вы не передадите тип ресурса во время подключения файлов, они будут искаться здесь.
*/
$this->template_dir = $template_dir;
/**
* Имя каталога, в котором хранятся компилированные шаблоны.
*/
$this->compile_dir = BASE_DIR . '/tmp/cache/smarty';
/**
* Имя каталога, в котором хранится кэш.
*/
$this->cache_dir_root = BASE_DIR . '/tmp/cache';
/**
* Имя каталога, в котором хранится кэш шаблонов.
*/
$this->cache_dir = BASE_DIR . '/tmp/cache/tpl';
/**
* Имя каталога, в котором хранится кэш модулей.
*/
$this->module_cache_dir = BASE_DIR . '/tmp/cache/module';
/**
* Имя каталога, в котором хранится сессии пользователей.
*/
$this->session_dir = BASE_DIR . '/tmp/session';
/**
* Имя каталога, в котором хранится сессии пользователей.
*/
$this->sql_cache_dir = BASE_DIR . '/tmp/cache/sql';
/**
* Использование поддиректорий для хранения кэша и скомпилированных шаблонов.
*/
$this->use_sub_dirs = SMARTY_USE_SUB_DIRS;
/**
* При каждом вызове РНР-приложения Smarty проверяет, изменился или нет текущий шаблон
* с момента последней компиляции. Если шаблон изменился, он перекомпилируется.
* В случае, если шаблон еще не был скомпилирован, его компиляция производится
* с игнорированием значения этого параметра.
*/
$this->compile_check = SMARTY_COMPILE_CHECK;
/**
* Активирует debugging console - порожденное при помощи javascript окно браузера,
* содержащее информацию о подключенных шаблонах и загруженных переменных для текущей страницы.
*/
$this->debugging = SMARTY_DEBUGGING;
/**
* Регистрация плагинов-функций Smarty.
* АДАПТАЦИЯ: register_function заменен на registerPlugin('function', ...) для Smarty 5.
* Добавлены проверки function_exists для предотвращения ошибки "not callable".
*/
if (function_exists('check_permission')) {
$this->registerPlugin('function', 'check_permission', 'check_permission');
}
if (function_exists('get_home_link')) {
$this->registerPlugin('function', 'get_home_link', 'get_home_link');
}
if (function_exists('num_format')) {
$this->registerPlugin('function', 'num_format', 'num_format');
}
// Исправленная строка: Проверяем make_thumbnail перед регистрацией 'thumb'
if (function_exists('make_thumbnail')) {
$this->registerPlugin('function', 'thumb', 'make_thumbnail');
}
/**
* Регистрация плагинов-модификаторов Smarty.
* АДАПТАЦИЯ: register_modifier заменен на registerPlugin('modifier', ...) для Smarty 5.
*/
if (function_exists('pretty_date')) {
$this->registerPlugin('modifier', 'pretty_date', 'pretty_date');
}
if (function_exists('translate_date')) {
$this->registerPlugin('modifier', 'translate_date', 'translate_date');
}
if (function_exists('utf8')) {
$this->registerPlugin('modifier', 'utf8', 'utf8');
}
if (function_exists('check_permission')) {
// Регистрируем как модификатор, если функция существует
$this->registerPlugin('modifier', 'check_permission', 'check_permission');
}
// stripslashes - это нативная PHP-функция, проверка не нужна
$this->registerPlugin('modifier', 'stripslashes', 'stripslashes');
if (function_exists('htmlspecialchars')) {
// Регистрируем как модификатор, если функция существует
$this->registerPlugin('modifier', 'htmlspecialchars', 'htmlspecialchars');
}
if (function_exists('trim')) {
// Регистрируем как модификатор, если функция существует
$this->registerPlugin('modifier', 'trim', 'trim');
}
if (function_exists('format_size')) {
// Регистрируем как модификатор, если функция существует
$this->registerPlugin('modifier', 'format_size', 'format_size');
}
if (function_exists('urldecode')) {
// Регистрируем как модификатор, если функция существует
$this->registerPlugin('modifier', 'urldecode', 'urldecode');
}
if (function_exists('strtolower')) {
// Регистрируем как модификатор, если функция существует
$this->registerPlugin('modifier', 'strtolower', 'strtolower');
}
if (function_exists('constant')) {
// Регистрируем как модификатор, если функция существует
$this->registerPlugin('modifier', 'constant', 'constant');
}
if (function_exists('stripcslashes')) {
// Регистрируем как модификатор, если функция существует
$this->registerPlugin('modifier', 'stripcslashes', 'stripcslashes');
}
if (function_exists('html_entity_decode')) {
// Регистрируем как модификатор, если функция существует
$this->registerPlugin('modifier', 'html_entity_decode', 'html_entity_decode');
}
// плагин позволяющий поставить метки шаблонов
// для быстрого поиска шаблона отвечающего за вывод
// перед использованием очистить cache/smarty
// $this->register_postfilter('add_template_comment');
/**
* Присваиваем общие значения для шаблонов.
* Можно явно передавать пары имя/значение,
* или ассоциативные массивы, содержащие пары имя/значение.
*/
$assign['BASE_DIR'] = BASE_DIR;
$assign['ABS_PATH'] = ABS_PATH;
$assign['DATE_FORMAT'] = DATE_FORMAT;
$assign['TIME_FORMAT'] = TIME_FORMAT;
$assign['PAGE_NOT_FOUND_ID'] = PAGE_NOT_FOUND_ID;
$this->assign($assign);
}
/**
* ВНУТРЕННИЕ МЕТОДЫ
*/
/**
* Проверка наличия одноименного шаблона в директории темы дизайна.
* При наличии шаблона в директории темы дизайна используется этот шаблон.
*
* @param string $tpl путь к шаблону
* @return string
*/
function _redefine_template($tpl)
{
if (!defined('THEME_FOLDER')) return $tpl;
$r_tpl = str_replace(BASE_DIR, BASE_DIR . '/templates/' . THEME_FOLDER, $tpl);
return (file_exists($r_tpl) && is_file($r_tpl)) ? $r_tpl : $tpl;
}
/**
* ВНЕШНИЕ МЕТОДЫ
*/
/**
* АДАПТАЦИЯ PHP 8 / SMARTY 5:
* Smarty 5 перешел на camelCase (getConfigVars), но старый код использует snake_case (get_config_vars).
* Создаем алиас для обратной совместимости.
*/
function get_config_vars($variable = null, $section = null)
{
return parent::getConfigVars($variable, $section);
}
/**
* Переопределение одноименного метода Smarty
* для конфигурационных файлов созданных в теме дизайна.
*
* ИСПРАВЛЕНИЕ: Добавлен default = null к $file для совместимости с PHP 8/Smarty 5
*
* @param string $file
* @param string $section
* @param string $scope
*/
function config_load($file = null, $section = null, $scope = 'global')
{
// Используем parent::configLoad
parent::configLoad($this->_redefine_template($file), $section, $scope);
}
/**
* Переопределение одноименного метода Smarty
* для пользовательских шаблонов созданных в теме дизайна.
*
* ИСПРАВЛЕНИЕ: Добавлен default = null к $tpl_file для совместимости с PHP 8/Smarty 5
*
* @param string $tpl_file name of template file
* @param string $cache_id
* @param string $compile_id
* @return string|false results of {@link _read_cache_file()}
*/
function is_cached($tpl_file = null, $cache_id = null, $compile_id = null)
{
// Используем parent::isCached
return parent::isCached($this->_redefine_template($tpl_file), $cache_id, $compile_id);
}
/**
* Переопределение одноименного метода Smarty
* для пользовательских шаблонов созданных в теме дизайна.
*
* ИСПРАВЛЕНИЕ: Добавлен default = null к $resource_name для совместимости с PHP 8/Smarty 5
*
* @param string $resource_name
* @param string $cache_id
* @param string $compile_id
* @return string
*/
function fetch($resource_name = null, $cache_id = null, $compile_id = null)
{
// Вызываем родительский fetch
return parent::fetch($this->_redefine_template($resource_name), $cache_id, $compile_id);
}
/**
* Переопределение одноименного метода Smarty
* для пользовательских шаблонов созданных в теме дизайна.
*
* ИСПРАВЛЕНИЕ: Добавлен default = null к $resource_name для совместимости с PHP 8/Smarty 5
*
* @param string $resource_name
* @param string $cache_id
*
* @param string $compile_id
*/
function display($resource_name = null, $cache_id = null, $compile_id = null)
{
// Вызываем родительский display
parent::display($this->_redefine_template($resource_name), $cache_id, $compile_id);
}
function recursivDelete($dir)
{
$it = new RecursiveDirectoryIterator($dir . '/');
$files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
foreach($files as $file)
{
if ($file->getFilename() === '.' || $file->getFilename() === '..')
continue;
if ($file->isDir())
rmdir($file->getRealPath());
else
unlink($file->getRealPath());
}
@rmdir($dir);
}
/**
* Метод очистки кэша
*
*/
function CacheClear()
{
global $AVE_DB, $AVE_Template;
$message = array();
// Метод очистки кэша
if (isset($_REQUEST['templateCache']) && $_REQUEST['templateCache'] == '1')
{
// Smarty clear cache
$this->clearAllCache();
foreach (glob($this->cache_dir_root . "/cache_*") as $filename)
@unlink($filename);
write_htaccess_deny($this->cache_dir . '/');
// Memcached
if (defined('MEMCACHED_SERVER') && defined('MEMCACHED_PORT') && MEMCACHED_SERVER && MEMCACHED_PORT)
{
$m = new \Memcached();
$m->addServer(MEMCACHED_SERVER, MEMCACHED_PORT);
$m->flush();
}
// Здесь используется getConfigVars, но вызывается через старый get_config_vars,
// что теперь будет работать благодаря алиасу
$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_SUCCESS');
reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_SUCCESS_LOG'));
// Очищаем кэш сессий в БД в таблице _sessions
if (defined('PREFIX') && $AVE_DB) {
$AVE_DB->Query("
DELETE FROM
" . PREFIX . "_sessions
");
$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_DB_SUCCESS');
reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_DB_SUCCESS_LOG'));
}
}
//Метод удаления скомпилированных шаблонов
if (isset($_REQUEST['templateCompiledTemplate']) && $_REQUEST['templateCompiledTemplate'] == '1')
{
// Smarty compiled cache
$this->clearCompiledTemplate();
write_htaccess_deny($this->compile_dir . '/');
$filename = $this->compile_dir . '/.htaccess';
$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_CT_SUCCESS');
reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_CT_SUCCESS_LOG'));
}
//Метод удаления скомпилированных шаблонов модулей
if (isset($_REQUEST['moduleCache']) && $_REQUEST['moduleCache'] == '1')
{
if (is_dir($this->module_cache_dir)) {
$this->recursivDelete($this->module_cache_dir);
}
@mkdir($this->module_cache_dir, 0777, true);
write_htaccess_deny($this->module_cache_dir . '/');
$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_MC_SUCCESS');
reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_MC_SUCCESS_LOG'));
}
//Метод удаления всех сессий
if (isset($_REQUEST['sessionUsers']) && $_REQUEST['sessionUsers'] == '1')
{
if (is_dir($this->session_dir)) {
$this->recursivDelete($this->session_dir);
}
@mkdir($this->session_dir, 0777, true);
write_htaccess_deny($this->session_dir . '/');
$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_SU_SUCCESS');
reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_SU_SUCCESS_LOG'));
}
//Метод удаления кэша запросов
if (isset($_REQUEST['sqlCache']) && $_REQUEST['sqlCache'] == '1')
{
if (is_dir($this->sql_cache_dir)) {
$this->recursivDelete($this->sql_cache_dir);
}
@mkdir($this->sql_cache_dir, 0777, true);
write_htaccess_deny($this->sql_cache_dir . '/');
$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_SC_SUCCESS');
reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_SC_SUCCESS_LOG'));
}
echo json_encode(array($AVE_Template->get_config_vars('TEMPLATES_MESSAGE') . "<br />" . implode('<br />', $message), 'accept'));
}
/**
* Метод очистки миниатюр
*
*/
function ThumbnailsClear()
{
global $AVE_DB, $AVE_Template;
$message = [];
function rdel_thumb($dirname)
{
$dirs = glob("$dirname/*", GLOB_ONLYDIR|GLOB_NOSORT);
$dir_thumb = THUMBNAIL_DIR;
foreach ($dirs AS $dir)
{
$tmb = glob("$dir/$dir_thumb", GLOB_ONLYDIR|GLOB_NOSORT);
foreach ($tmb AS $tmbs)
rrmdir($tmbs);
rdel_thumb($dir);
}
$hid_cat = (glob("$dirname/{.tmb}*", GLOB_ONLYDIR|GLOB_BRACE));
// ИСПРАВЛЕНИЕ: Проверяем, существует ли элемент [0]
if (!empty($hid_cat))
{
$hid_tmb = $hid_cat[0];
foreach (glob("$hid_cat[0]/*.png", GLOB_NOSORT) AS $filename)
unlink("$filename");
}
rrmdir(BASE_DIR . '/' . UPLOAD_DIR . '/' . THUMBNAIL_DIR);
}
rdel_thumb(BASE_DIR . '/' . UPLOAD_DIR);
$message[] = $AVE_Template->get_config_vars('TEMPLATES_THUMBNAILS_SUCCESS');
reportLog($AVE_Template->get_config_vars('TEMPLATES_THUMBNAILS_SUCCESS_LOG'));
echo json_encode(array($AVE_Template->get_config_vars('TEMPLATES_MESSAGE') . "<br />" . implode('<br />', $message), 'accept'));
}
}
?>