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'); } // плагин позволяющий поставить метки шаблонов // для быстрого поиска шаблона отвечающего за вывод // перед использованием очистить 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') . "
" . implode('
', $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') . "
" . implode('
', $message), 'accept')); } } ?>