1175 lines
38 KiB
PHP
1175 lines
38 KiB
PHP
<?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);
|
||
}
|
||
}
|
||
?>
|