Files
ave-cms-alt/class/class.settings.php
2025-10-11 17:17:12 +05:00

1175 lines
38 KiB
PHP
Raw 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 3.x
* @filesource
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
*
*/
/**
* Класс управления настройками системы
*/
class AVE_Settings
{
/**
* СВОЙСТВА
*/
/**
* Количество стран на странице
*
* @public int
*/
public $_limit = 15;
/**
* ВНЕШНИЕ МЕТОДЫ
*/
/**
* Метод отображения настроек
*
*/
function settingsShow()
{
global $AVE_Template;
$date_formats = array(
'%d.%m.%Y',
'%d %B %Y',
'%A, %d.%m.%Y',
'%A, %d %B %Y'
);
$time_formats = array(
'%d.%m.%Y, %H:%M',
'%d %B %Y, %H:%M',
'%A, %d.%m.%Y (%H:%M)',
'%A, %d %B %Y (%H:%M)'
);
// 1. Получаем настройки (ПАРОЛЬ УЖЕ ДЕШИФРОВАН в кэше get_settings())
$settings_data_array = get_settings();
// 2. Извлекаем строку настроек (обычно это $settings[0])
$row = (isset($settings_data_array[0]) && is_array($settings_data_array[0]))
? $settings_data_array[0]
: (is_array($settings_data_array) ? $settings_data_array : array());
// 3. КРИТИЧЕСКАЯ ЛОГИКА МАСКИРОВКИ: Заменяем дешифрованный пароль на '****' для отображения
if (isset($row['mail_type']) && $row['mail_type'] === 'smtp' && !empty($row['mail_smtp_pass'])) {
// Дешифрованный пароль заменяется на '****' для поля формы
$row['mail_smtp_pass'] = '****';
}
$AVE_Template->assign('date_formats', $date_formats);
$AVE_Template->assign('time_formats', $time_formats);
// 4. Передаем модифицированный массив с '****' в шаблон
$AVE_Template->assign('row', $row);
$AVE_Template->assign('available_countries', get_country_list(1));
$AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_main.tpl'));
}
/**
* Записывает события переключения файлов в специальный лог.
*
* @param string $message Сообщение для записи.
* @param string $level Уровень: 'ERROR', 'WARNING', 'INFO'.
*/
private function _logSwitchEvent($message, $level = 'INFO')
{
// Абсолютный путь к папке логов. BASE_DIR должен быть определен.
$log_dir = BASE_DIR . '/tmp/logs';
$log_file = $log_dir . '/query_switch.log';
// Форматируем сообщение
$timestamp = date('Y-m-d H:i:s');
$log_entry = "[" . $timestamp . "] [" . $level . "] " . $message . "\n";
// Проверяем существование директории (и права, если есть возможность)
if (!is_dir($log_dir) || !is_writable($log_dir)) {
// Если лог-директория недоступна, пытаемся записать в системный лог CMS, если это возможно.
@reportLog("ОШИБКА ЛОГА: Не удалось записать событие. Директория '{$log_dir}' недоступна.");
return;
}
// Безопасная запись в файл
@file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX);
}
/**
* Переключает файлы запросов (UNLINK+COPY) и очищает связанные таблицы в БД.
*
* @param bool $use_safe_version Новое значение (использовать безопасную версию).
* @param bool $clear_db_flag Флаг: TRUE, если версия действительно изменилась и нужна очистка БД.
* @return bool TRUE в случае успеха, FALSE в случае ошибки.
*/
private function _switchQueryFiles($use_safe_version, $clear_db_flag)
{
global $AVE_DB;
$version_name = $use_safe_version ? 'Безопасная (Safe)' : 'Оригинальная (Original)';
$this->_logSwitchEvent("=== Начат процесс переключения на версию: {$version_name}. ===");
$manifest_path = BASE_DIR . '/inc/query_variants/query_manifest.php';
$manifest = @require $manifest_path;
if (!is_array($manifest) || empty($manifest)) {
$this->_logSwitchEvent('ОШИБКА: Файл манифеста не загружен или пуст.', 'ERROR');
return false;
}
$source_dir_name = $use_safe_version ? 'safe_files' : 'original_files';
$source_base = BASE_DIR . '/inc/query_variants/' . $source_dir_name;
$error_count = 0;
// ИТЕРАЦИЯ И КОПИРОВАНИЕ
foreach ($manifest as $relative_path) {
$source_file = $source_base . '/' . $relative_path;
$target_file = BASE_DIR . '/' . $relative_path;
if (!file_exists($source_file)) {
$error_count++;
$this->_logSwitchEvent("ОШИБКА ФАЙЛА: Отсутствует исходный файл: {$source_file}", 'ERROR');
continue;
}
$target_dir = dirname($target_file);
if (!is_dir($target_dir)) {
if (!@mkdir($target_dir, 0775, true)) {
$error_count++;
$this->_logSwitchEvent("ОШИБКА ФАЙЛА: Не удалось создать директорию: {$target_dir}", 'ERROR');
}
}
if (file_exists($target_file)) {
if (!@unlink($target_file)) {
$error_count++;
$this->_logSwitchEvent("ОШИБКА ФАЙЛА: Не удалось удалить старый файл: {$target_file}", 'ERROR');
continue;
}
}
if (!@copy($source_file, $target_file)) {
$error_count++;
$this->_logSwitchEvent("ОШИБКА ФАЙЛА: Не удалось скопировать файл: {$source_file}", 'ERROR');
}
}
// ЛОГИКА ОЧИСТКИ БАЗЫ ДАННЫХ
if ($error_count > 0) {
$this->_logSwitchEvent("ПРЕДУПРЕЖДЕНИЕ: Обнаружены ошибки копирования файлов ({$error_count} шт.). Очистка БД не будет выполнена.", 'WARNING');
}
if ($clear_db_flag)
{
$this->_logSwitchEvent("Очистка БД: Обнаружено фактическое переключение версии. Запуск DELETE FROM и ALTER TABLE.", 'INFO');
// 1. Очистка ДОЧЕРНЕЙ таблицы
if (@$AVE_DB->query("DELETE FROM `" . PREFIX . "_request_conditions`")) {
$this->_logSwitchEvent('Очистка `_request_conditions`: Успех.', 'INFO');
} else {
$this->_logSwitchEvent('ОШИБКА БД: Не удалось выполнить DELETE FROM для `_request_conditions`.', 'ERROR');
$error_count++;
}
// 2. Очистка РОДИТЕЛЬСКОЙ таблицы
if (@$AVE_DB->query("DELETE FROM `" . PREFIX . "_request`")) {
$this->_logSwitchEvent('Очистка `_request`: Успех.', 'INFO');
} else {
$this->_logSwitchEvent('ОШИБКА БД: Не удалось выполнить DELETE FROM для `_request`.', 'ERROR');
$error_count++;
}
// 3. Сброс СЧЕТЧИКА
if (@$AVE_DB->query("ALTER TABLE `" . PREFIX . "_request` AUTO_INCREMENT = 1")) {
$this->_logSwitchEvent('Сброс AUTO_INCREMENT: Успех.', 'INFO');
} else {
$this->_logSwitchEvent('ОШИБКА БД: Не удалось выполнить ALTER TABLE AUTO_INCREMENT.', 'ERROR');
$error_count++;
}
} else {
$this->_logSwitchEvent("Очистка БД: Переключение версии не обнаружено ({$version_name}). Пропуск очистки.", 'INFO');
}
$final_result = ($error_count === 0);
$this->_logSwitchEvent("=== Процесс завершен. Результат: " . ($final_result ? 'УСПЕХ' : 'СБОЙ') . " (Ошибок: {$error_count}). ===", $final_result ? 'INFO' : 'ERROR');
return $final_result;
}
/**
* Метод отображения дополнительных настроек
*
*/
function settingsCase()
{
global $AVE_Template;
// 1. Читаем ТЕКУЩЕЕ (старое) значение прямо из файла config.inc.php.
// Если файл пуст, мы предполагаем, что используется версия по умолчанию "из коробки" (Safe/TRUE),
// так как файлы Safe-версии уже должны быть на месте после установки.
$old_query_setting = true;
$old_config_content = @file_get_contents(BASE_DIR . '/config/config.inc.php');
if ($old_config_content) {
// НАДЕЖНОЕ РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ: Ищет true, false, '1', '0' (в кавычках или без)
if (preg_match("/define\('REQUEST_USE_VERSION',\s*(true|false|[']?\d+[']?)\s*\);/i", $old_config_content, $matches)) {
$val = strtolower(trim($matches[1], "'"));
if ($val === 'true' || $val === '1') {
$old_query_setting = true; // Safe Version
} else {
$old_query_setting = false; // Original Version
}
}
}
// Сохраняем настройки
if (isset($_REQUEST['more']))
{
// >>> ЗАПУСКАЕМ БУФЕРИЗАЦИЮ ВЫВОДА для чистого JSON-ответа (AJAX)
if (isAjax()) {
ob_start();
}
// --- ИНИЦИАЛИЗАЦИЯ ДЛЯ ОБРАБОТКИ НЕ-AJAX ЗАПРОСОВ ---
// Получаем текущее значение константы из глобального пространства.
// Это необходимо для того, чтобы при клике "Сохранить" (не-AJAX) без изменения чекбокса
// значение REQUEST_USE_VERSION не сбрасывалось и не циклилось.
$current_constant_value = defined('REQUEST_USE_VERSION') ? (REQUEST_USE_VERSION ? '1' : '0') : '0';
$request_use_version_value = $current_constant_value;
// ----------------------------------------------------
$set = '<?php' . "\r\n\r\n";
foreach($_REQUEST['GLOB'] as $key => $type)
{
foreach($type as $k => $v)
{
// ИЗВЛЕКАЕМ НОВОЕ ЗНАЧЕНИЕ ДЛЯ ПЕРЕКЛЮЧЕНИЯ ФАЙЛОВ ИЗ ФОРМЫ
if ($k == 'REQUEST_USE_VERSION') {
// Значение из формы всегда приоритетнее, даже если оно '0' (отмечено 'Нет')
$request_use_version_value = $v;
}
switch ($GLOBALS['CMS_CONFIG'][$key][$k]['TYPE'])
{
case 'bool' :
$v = $v ? 'true' : 'false';
break;
case 'integer' :
$v = intval($v);
break;
case 'string' :
case 'dropdown' :
$v = "'" . add_slashes($v) . "'";
break;
default :
$v = "'" . add_slashes($v) . "'";
break;
}
$set .= "\t" . "// " . $GLOBALS['CMS_CONFIG'][$key][$k]['DESCR'] . "\r\n";
$set .= "\t" . "define('" . $k . "', " . $v . ");\r\n\r\n";
}
}
$set .= '?>';
$result = file_put_contents(BASE_DIR . '/config/config.inc.php', $set);
if ($result > 0)
{
$new_query_setting = (bool)$request_use_version_value;
// 2. Определяем, произошло ли фактическое переключение версий
$is_a_version_switch = ($new_query_setting !== $old_query_setting);
// 3. Вызываем функцию, передавая НОВОЕ значение и ФЛАГ очистки
$switch_success = $this->_switchQueryFiles($new_query_setting, $is_a_version_switch);
if (!$switch_success) {
reportLog('ВНИМАНИЕ: Конфигурация сохранена, но переключение файлов/очистка БД при вызове AJAX не удалось.');
}
$message = $AVE_Template->get_config_vars('SETTINGS_SAVED');
$header = $AVE_Template->get_config_vars('SETTINGS_SUCCESS');
$theme = 'accept';
reportLog($AVE_Template->get_config_vars('SETTINGS_SAVE_DOP'));
}
else
{
$message = $AVE_Template->get_config_vars('SETTINGS_SAVED_ERR');
$header = $AVE_Template->get_config_vars('SETTINGS_ERROR');
$theme = 'error';
}
if (isAjax())
{
// ОЧИЩАЕМ ВЕСЬ ВЫВОД ПЕРЕД JSON
ob_end_clean();
echo json_encode(array(
'message' => $message,
'header' => $header,
'theme' => $theme)
);
}
else
{
// 1. Принудительно очищаем кэш PHP-файлов для главного конфига (если доступно)
// Это обходной путь, который может понадобиться, если сервер использует Opcache
if (function_exists('opcache_invalidate')) {
@opcache_invalidate(BASE_DIR . '/config/config.inc.php', true);
}
// 2. Добавляем "соль" (cache buster) и принудительно сбрасываем состояние
$cache_bust = microtime(true);
$redirect_url = 'Location:index.php?do=settings&sub=case&cp=' . SESSION . '&t=' . $cache_bust . '#settings';
// 3. Добавляем заголовки, запрещающие кэширование прокси/сервером
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
$AVE_Template->assign('message', $message);
header($redirect_url);
}
exit;
}
else
{
$AVE_Template->assign('CMS_CONFIG', $GLOBALS['CMS_CONFIG']);
$AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_case.tpl'));
}
}
/**
* Метод записи настроек
*
*/
function settingsSave()
{
global $AVE_DB, $AVE_Template;
// ДОБАВЛЕНО: Принудительно загружаем ключ шифрования.
get_smtp_encryption_key();
// ----------------------------------------------------
// 1. ЛОГИКА ГЕНЕРАЦИИ УНИКАЛЬНОГО КЛЮЧА
// ----------------------------------------------------
if (isset($_REQUEST['mail_type']) && $_REQUEST['mail_type'] === 'smtp' && !file_exists(BASE_DIR . '/inc/smtp_key.php')) {
$new_key = create_smtp_key_file();
if (empty($new_key)) {
$message = 'Ошибка: Не удалось создать файл ключа для SMTP-пароля. Проверьте права записи в папке inc/.';
$header = $AVE_Template->get_config_vars('SETTINGS_ERROR');
$theme = 'error';
if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] == '1') {
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
} else {
$AVE_Template->assign('message', $message);
header('Location:index.php?do=settings&cp=' . SESSION);
}
exit;
}
}
// ----------------------------------------------------
// 2. ОБРАБОТКА И ШИФРОВАНИЕ SMTP ПАРОЛЯ (С ИГНОРОМ ****)
// ----------------------------------------------------
$smtp_pass_encrypted = null; // Используем null, чтобы пропустить поле в SQL, если оно пустое или ****
if (isset($_REQUEST['mail_smtp_pass'])) {
$new_smtp_pass_raw = trim($_REQUEST['mail_smtp_pass']);
// ИСПРАВЛЕНО: Если пароль не пуст И не равен маске
if (!empty($new_smtp_pass_raw) && $new_smtp_pass_raw !== '****') {
// ПАРОЛЬ БЫЛ ВВЕДЕН ИЛИ ИЗМЕНЕН: Шифруем новый пароль
if (isset($_REQUEST['mail_type']) && $_REQUEST['mail_type'] === 'smtp') {
$smtp_pass_encrypted = encrypt_smtp_pass($new_smtp_pass_raw);
} else {
$smtp_pass_encrypted = $new_smtp_pass_raw;
}
}
// Если $new_smtp_pass_raw === '****' ИЛИ ПУСТОЙ, поле mail_smtp_pass не будет добавлено в SQL.
}
// ----------------------------------------------------
// 3. ФОРМИРОВАНИЕ УСЛОВНЫХ И ОБЯЗАТЕЛЬНЫХ ПОЛЕЙ
// ----------------------------------------------------
$mandatory_fields = array(
"mail_smtp_login" => addslashes($_REQUEST['mail_smtp_login']),
"mail_smtp_encrypt" => addslashes($_REQUEST['mail_smtp_encrypt']),
"mail_sendmail_path" => addslashes($_REQUEST['mail_sendmail_path']),
"mail_from_name" => addslashes($_REQUEST['mail_from_name']),
"mail_from" => addslashes($_REQUEST['mail_from']),
"page_not_found_id" => addslashes($_REQUEST['page_not_found_id']),
"mail_port" => addslashes($_REQUEST['mail_port']),
"mail_host" => addslashes($_REQUEST['mail_host']),
"default_country" => addslashes($_REQUEST['default_country']),
"mail_type" => addslashes($_REQUEST['mail_type']),
"mail_content_type" => addslashes($_REQUEST['mail_content_type']),
"mail_word_wrap" => (int)$_REQUEST['mail_word_wrap'],
"mail_new_user" => addslashes($_REQUEST['mail_new_user']),
"mail_signature" => addslashes($_REQUEST['mail_signature']),
"message_forbidden" => addslashes($_REQUEST['message_forbidden']),
"hidden_text" => addslashes($_REQUEST['hidden_text']),
"date_format" => addslashes($_REQUEST['date_format']),
"time_format" => addslashes($_REQUEST['time_format']),
"use_doctime" => intval($_REQUEST['use_doctime'])
);
// ДОБАВЛЯЕМ ПАРОЛЬ ТОЛЬКО ЕСЛИ ОН БЫЛ ВВЕДЕН ИЛИ ИЗМЕНЕН
if ($smtp_pass_encrypted !== null) {
$mandatory_fields["mail_smtp_pass"] = addslashes($smtp_pass_encrypted);
}
// Поля, которые обновляются ТОЛЬКО, если они были отправлены формой
$conditional_keys = array(
'site_name', 'navi_box', 'start_label', 'end_label', 'separator_label',
'next_label', 'prev_label', 'total_label', 'link_box', 'total_box',
'active_box', 'separator_box', 'bread_box', 'bread_show_main', 'bread_show_host',
'bread_sepparator', 'bread_sepparator_use', 'bread_link_box', 'bread_link_template',
'bread_self_box', 'bread_link_box_last'
);
$set_clauses = array();
// 1. Формируем обязательные поля
foreach ($mandatory_fields as $key => $value) {
$set_clauses[] = "{$key} = '{$value}'";
}
// 2. Формируем условные поля
foreach ($conditional_keys as $key) {
if (isset($_REQUEST[$key])) {
$value = $_REQUEST[$key];
if (strpos($key, 'bread_') === 0 && (strpos($key, 'show') !== false || strpos($key, 'use') !== false || strpos($key, 'last') !== false)) {
$set_clauses[] = "{$key} = '" . ($value != 0 ? 1 : 0) . "'";
} else {
$set_clauses[] = "{$key} = '" . addslashes($value) . "'";
}
}
}
// Объединяем все части через запятую для SQL
$set_string = implode(",\r\n", $set_clauses);
// ----------------------------------------------------
// 4. ВЫПОЛНЕНИЕ SQL-ЗАПРОСА
// ----------------------------------------------------
$sql = $AVE_DB->Query("
UPDATE
" . PREFIX . "_settings
SET
" . $set_string . "
WHERE
Id = 1
");
if ($sql->_result === false)
{
$message = $AVE_Template->get_config_vars('SETTINGS_SAVED_ERR');
$header = $AVE_Template->get_config_vars('SETTINGS_ERROR');
$theme = 'error';
}
else
{
$this->clearSettingsCache();
$message = $AVE_Template->get_config_vars('SETTINGS_SAVED');
$header = $AVE_Template->get_config_vars('SETTINGS_SUCCESS');
$theme = 'accept';
reportLog($AVE_Template->get_config_vars('SETTINGS_SAVE_MAIN'));
}
if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] == '1')
{
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
}
else
{
$AVE_Template->assign('message', $message);
header('Location:index.php?do=settings&cp=' . SESSION);
}
exit;
}
/**
* Метод отображения списка стран
*
*/
function settingsCountriesList()
{
global $AVE_DB, $AVE_Template;
$sql = $AVE_DB->Query("
SELECT SQL_CALC_FOUND_ROWS *
FROM
" . PREFIX . "_countries
ORDER BY country_status ASC, country_name ASC
LIMIT " . (get_current_page() * $this->_limit - $this->_limit) . "," . $this->_limit
);
$countries = array();
while ($row = $sql->FetchAssocArray())
array_push($countries, $row);
$num = $AVE_DB->Query("SELECT FOUND_ROWS()")->GetCell();
if ($num > $this->_limit)
{
$page_nav = "<a href=\"index.php?do=settings&sub=countries&page={s}&cp=" . SESSION . "\">{t}</a>";
$page_nav = get_pagination(ceil($num / $this->_limit), 'page', $page_nav);
$AVE_Template->assign('page_nav', $page_nav);
}
$AVE_Template->assign('countries', $countries);
$AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_countries.tpl'));
}
/**
* Метод записи параметров стран
*
*/
function settingsCountriesSave()
{
global $AVE_DB, $AVE_Template;
foreach ($_POST['country_name'] as $id => $country_name)
{
$AVE_DB->Query("
UPDATE " . PREFIX . "_countries
SET
country_name = '" . $country_name . "',
country_status = '" . $_POST['country_status'][$id] . "',
country_eu = '" . $_POST['country_eu'][$id] . "'
WHERE
Id = '" . $id . "'
");
}
reportLog($AVE_Template->get_config_vars('SETTINGS_SAVE_COUNTRY'));
}
/**
* Метод отображения списка языков
*
*/
function settingsLanguageList()
{
global $AVE_DB, $AVE_Template;
$sql = $AVE_DB->Query("
SELECT
*
FROM
" . PREFIX . "_settings_lang
ORDER BY lang_default DESC, lang_status ASC, lang_key ASC
");
$language = array();
while ($row = $sql->FetchAssocArray())
array_push($language, $row);
$AVE_Template->assign('language', $language);
$AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_lang.tpl'));
}
/**
* Метод Редактирования параметров языков
*
*/
function settingsLanguageEdit()
{
global $AVE_DB, $AVE_Template;
if (isset($_REQUEST["Id"]))
{
$items = $AVE_DB->Query("
SELECT
*
FROM
" . PREFIX . "_settings_lang
WHERE
Id = '" . $_REQUEST["Id"] . "'
")->FetchRow();
$AVE_Template->assign('items', $items);
}
$AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_lang_edit.tpl'));
}
function settingsLanguageEditSave()
{
global $AVE_DB, $AVE_Template;
if (! empty($_REQUEST["Id"]))
{
$AVE_DB->Query("
UPDATE
" . PREFIX . "_settings_lang
SET
lang_key = '" .$_REQUEST['lang_key']. "',
lang_alias_pref = '" .$_REQUEST['lang_alias_pref']. "',
lang_name = '" .$_REQUEST['lang_name']. "'
WHERE
Id = '" . $_REQUEST["Id"] . "'
");
}
else
{
$AVE_DB->Query("
INSERT INTO
" . PREFIX . "_settings_lang
SET
lang_key = '" .$_REQUEST['lang_key']. "',
lang_name = '" .$_REQUEST['lang_name']. "',
lang_alias_pref = '" .$_REQUEST['lang_alias_pref']. "',
lang_default = '0',
lang_status = '0'
");
}
$AVE_DB->clearCache('langs');
echo "<script>window.opener.location.reload(); window.close();</script>";
}
function settingsPaginationsList()
{
global $AVE_DB, $AVE_Template;
$sql = "
SELECT
id,
pagination_name
FROM
" . PREFIX . "_paginations
";
$query = $AVE_DB->Query($sql);
$items = array();
while ($row = $query->FetchRow())
array_push($items, $row);
$AVE_Template->assign('items', $items);
$AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_pagination.tpl'));
}
function settingsPaginationsNew()
{
global $AVE_DB, $AVE_Template;
$pagination = new stdClass();
$AVE_Template->assign('pagination', $pagination);
$AVE_Template->assign('content', $AVE_Template->fetch('settings/pagination_edit.tpl'));
}
function settingsPaginationsEdit()
{
global $AVE_DB, $AVE_Template;
$sql = "
SELECT
*
FROM
" . PREFIX . "_paginations
WHERE
id = '" . $_REQUEST['id'] . "'
";
$pagination = $AVE_DB->Query($sql)->FetchRow();
$AVE_Template->assign('pagination', $pagination);
$AVE_Template->assign('content', $AVE_Template->fetch('settings/pagination_edit.tpl'));
}
function settingsPaginationsSave()
{
global $AVE_DB, $AVE_Template;
// Если пришел ID
if (isset($_REQUEST['id']) && $_REQUEST['id'] > 0)
{
$sql = "
UPDATE
" . PREFIX . "_paginations
SET
pagination_name = '" . $_REQUEST['pagination_name'] . "',
pagination_box = '" . $_REQUEST['pagination_box'] . "',
pagination_start_label = '" . $_REQUEST['pagination_start_label'] . "',
pagination_end_label = '" . $_REQUEST['pagination_end_label'] . "',
pagination_separator_box = '" . $_REQUEST['pagination_separator_box'] . "',
pagination_separator_label = '" . $_REQUEST['pagination_separator_label'] . "',
pagination_next_label = '" . $_REQUEST['pagination_next_label'] . "',
pagination_prev_label = '" . $_REQUEST['pagination_prev_label'] . "',
pagination_link_box = '" . $_REQUEST['pagination_link_box'] . "',
pagination_active_link_box = '" . $_REQUEST['pagination_active_link_box'] . "',
pagination_link_template = '" . $_REQUEST['pagination_link_template'] . "',
pagination_link_active_template = '" . $_REQUEST['pagination_link_active_template'] . "'
WHERE
id = '" . $_REQUEST['id'] . "'
";
$query = $AVE_DB->Query($sql);
if ($query === false)
{
$message = $AVE_Template->get_config_vars('PAGINATION_SAVED_ERR');
$header = $AVE_Template->get_config_vars('PAGINATION_ERROR');
$theme = 'error';
}
else
{
AVE_Paginations::clearCache();
$message = $AVE_Template->get_config_vars('PAGINATION_SAVED');
$header = $AVE_Template->get_config_vars('PAGINATION_SUCCESS');
$theme = 'accept';
}
if (isAjax())
{
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
}
else
{
header('Location:index.php?do=settings&action=paginations&cp=' . SESSION);
}
exit;
}
// Если не пришел ID
else
{
$sql = "
INSERT INTO
" . PREFIX . "_paginations
SET
pagination_name = '" . $_REQUEST['pagination_name'] . "',
pagination_box = '" . $_REQUEST['pagination_box'] . "',
pagination_start_label = '" . $_REQUEST['pagination_start_label'] . "',
pagination_end_label = '" . $_REQUEST['pagination_end_label'] . "',
pagination_separator_box = '" . $_REQUEST['pagination_separator_box'] . "',
pagination_separator_label = '" . $_REQUEST['pagination_separator_label'] . "',
pagination_next_label = '" . $_REQUEST['pagination_next_label'] . "',
pagination_prev_label = '" . $_REQUEST['pagination_prev_label'] . "',
pagination_link_box = '" . $_REQUEST['pagination_link_box'] . "',
pagination_active_link_box = '" . $_REQUEST['pagination_active_link_box'] . "',
pagination_link_template = '" . $_REQUEST['pagination_link_template'] . "',
pagination_link_active_template = '" . $_REQUEST['pagination_link_active_template'] . "'
";
}
$query = $AVE_DB->Query($sql);
header('Location:index.php?do=settings&action=paginations&cp=' . SESSION);
exit;
}
function settingsPaginationsDel()
{
global $AVE_DB, $AVE_Template;
if (isset($_REQUEST['id']) && $_REQUEST['id'] > 1)
{
$sql = "
DELETE
FROM
" . PREFIX . "_paginations
WHERE
id = '" . $_REQUEST['id'] . "'
";
$AVE_DB->Query($sql);
AVE_Paginations::clearCache();
}
header('Location:index.php?do=settings&action=paginations&cp=' . SESSION);
exit;
}
/**
* Функция делает рекурсивный обход вложенных папок, и добавляет их в архив
*
* @param string $src_dir папка которую хотим заархивировать
* @param string $zip Куда кладем и как называем файл архива
* @return ZIP
*/
function ZipDirectory($src_dir, $zip, $dir_in_archive = '')
{
$dirHandle = opendir($src_dir);
while (false !== ($file = readdir($dirHandle)))
{
if (($file != '.') && ($file != '..'))
{
if (! is_dir($src_dir . $file))
{
$zip->addFile($src_dir . $file, $dir_in_archive.$file);
}
else
{
$zip->addEmptyDir($dir_in_archive.$file);
$zip = ZipDirectory($src_dir . $file . DIRECTORY_SEPARATOR, $zip, $dir_in_archive . $file . DIRECTORY_SEPARATOR);
}
}
}
return $zip;
}
/**
* Функция проверяет, возможно ли создать zip-архив, запускает
* ZipDirectory и закрывает файл при завершении обхода папок.
*
* @param string $src_dir папка которую хотим заархивировать
* @param string $archive_path Куда кладем и как называем файл архива
* @return bool true|false
*/
function ZipFull($src_dir, $archive_path)
{
$zip = new ZipArchive();
if ($zip->open($archive_path, ZIPARCHIVE::CREATE) !== true)
{
return false;
}
$zip = ZipDirectory($src_dir,$zip);
$zip->close();
return true;
}
/**
* Функция очищает кеш системных настроек
*
*/
function clearSettingsCache()
{
$cache_dir = BASE_DIR . '/tmp/cache/sql/settings/';
return rrmdir($cache_dir);
}
/**
* Функция редактирования robots.txt
*
*/
function editRobots()
{
global $AVE_DB, $AVE_Template;
$file_name = 'robots.txt';
$_REQUEST['sub'] = (! isset($_REQUEST['sub']))
? ''
: $_REQUEST['sub'];
switch ($_REQUEST['sub'])
{
case 'save':
$file = BASE_DIR . '/' . $file_name;
$template = stripcslashes($_REQUEST['code_text']);
$result = file_put_contents($file, trim($template));
if ($result === false)
{
$message = $AVE_Template->get_config_vars('SETTINGS_SAVED_ERR_FILE');
$header = $AVE_Template->get_config_vars('SETTINGS_ERROR');
$theme = 'error';
}
else
{
$message = $AVE_Template->get_config_vars('SETTINGS_SAVED_FILE');
$header = $AVE_Template->get_config_vars('SETTINGS_SUCCESS');
$theme = 'accept';
}
if (isAjax())
{
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
}
else
{
$AVE_Template->assign('message', $message);
header('Location:index.php?do=settings&cp=' . SESSION);
}
exit;
default:
$file = BASE_DIR . '/' . $file_name;
$template = file_get_contents($file);
$formaction = "index.php?do=settings&action=robots&sub=save&cp=" . SESSION;
$AVE_Template->assign('file_name', $file_name);
$AVE_Template->assign('formaction', $formaction);
$AVE_Template->assign('template', $template);
break;
}
$AVE_Template->assign('content', $AVE_Template->fetch('settings/edit_file.tpl'));
}
/**
* Функция редактирования func.custom.php
*
*/
function editCustom()
{
global $AVE_Template;
$file_name = 'func.custom.php';
$_REQUEST['sub'] = (! isset($_REQUEST['sub']))
? ''
: $_REQUEST['sub'];
switch ($_REQUEST['sub'])
{
case 'save':
$file = BASE_DIR . '/functions/' . $file_name;
$template = stripcslashes($_REQUEST['code_text']);
$result = file_put_contents($file, trim($template));
if ($result === false)
{
$message = $AVE_Template->get_config_vars('SETTINGS_SAVED_ERR_FILE');
$header = $AVE_Template->get_config_vars('SETTINGS_ERROR');
$theme = 'error';
}
else
{
$message = $AVE_Template->get_config_vars('SETTINGS_SAVED_FILE');
$header = $AVE_Template->get_config_vars('SETTINGS_SUCCESS');
$theme = 'accept';
}
if (isAjax())
{
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
}
else
{
$AVE_Template->assign('message', $message);
header('Location:index.php?do=settings&cp=' . SESSION);
}
exit;
default:
$file = BASE_DIR . '/functions/' . $file_name;
$template = file_get_contents($file);
$formaction = "index.php?do=settings&action=custom&sub=save&cp=" . SESSION;
$AVE_Template->assign('file_name', $file_name);
$AVE_Template->assign('formaction', $formaction);
$AVE_Template->assign('template', $template);
break;
}
$AVE_Template->assign('content', $AVE_Template->fetch('settings/edit_file.tpl'));
}
function showCache ()
{
global $AVE_Template;
$AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_cache.tpl'));
}
function showCacheSize ()
{
global $AVE_Template;
switch ($_REQUEST['source'])
{
case 'smarty':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/smarty'));
break;
case 'block':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/sql/block'));
break;
case 'documents':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/sql/documents'));
break;
case 'compiled':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/sql/compile'));
break;
case 'langs':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/sql/langs'));
break;
case 'modules':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/sql/modules'));
break;
case 'navigations':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/sql/navigations'));
break;
case 'paginations':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/sql/paginations'));
break;
case 'requests':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/sql/requests'));
break;
case 'rubrics':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/sql/rubrics'));
break;
case 'sessions':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/session'));
break;
case 'sysblocks':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/sql/sysblocks'));
break;
case 'settings':
$size = format_size(get_dir_size(BASE_DIR . '/tmp/cache/sql/settings'));
break;
}
$return = [
'size' => $size,
'message' => $AVE_Template->get_config_vars('SETTINGS_SUCCESS'),
'theme' => 'accept'
];
_json($return, true);
}
function clearCache ()
{
global $AVE_Template;
switch ($_REQUEST['source'])
{
case 'smarty':
$cache_dir = BASE_DIR . '/tmp/cache/smarty';
break;
case 'block':
$cache_dir = BASE_DIR . '/tmp/cache/sql/block';
break;
case 'documents':
$cache_dir = BASE_DIR . '/tmp/cache/sql/documents';
break;
case 'compiled':
$cache_dir = BASE_DIR . '/tmp/cache/sql/compile';
break;
case 'langs':
$cache_dir = BASE_DIR . '/tmp/cache/sql/langs';
break;
case 'modules':
$cache_dir = BASE_DIR . '/tmp/cache/sql/modules';
break;
case 'navigations':
$cache_dir = BASE_DIR . '/tmp/cache/sql/navigations';
break;
case 'paginations':
$cache_dir = BASE_DIR . '/tmp/cache/sql/paginations';
break;
case 'requests':
$cache_dir = BASE_DIR . '/tmp/cache/sql/requests';
break;
case 'rubrics':
$cache_dir = BASE_DIR . '/tmp/cache/sql/rubrics';
break;
case 'sysblocks':
$cache_dir = BASE_DIR . '/tmp/cache/sql/sysblocks';
break;
case 'sessions':
$cache_dir = BASE_DIR . '/tmp/session';
break;
case 'settings':
$cache_dir = BASE_DIR . '/tmp/cache/sql/settings';
break;
}
$remove = rrmdir($cache_dir);
$return = [
'size' => format_size(get_dir_size($cache_dir)),
'header' => $remove ? $AVE_Template->get_config_vars('SETTINGS_CACHE_SUCCESS') : $AVE_Template->get_config_vars('SETTINGS_CACHE_ERROR'),
'message' => $remove ? $AVE_Template->get_config_vars('SETTINGS_CACHE_SUCCESS_T') : $AVE_Template->get_config_vars('SETTINGS_CACHE_ERROR_T'),
'theme' => $remove ? 'accept' : 'error'
];
_json($return, true);
}
}
?>