Files
ave-cms/system/App/Common/RuntimeConstantSchema.php
T
2026-07-27 12:58:44 +03:00

134 lines
8.5 KiB
PHP

<?php
/*
|--------------------------------------------------------------------------------------
| AVE.cms
|--------------------------------------------------------------------------------------
| @package AVE.cms
| @file system/App/Common/RuntimeConstantSchema.php
| @author AVE.cms <support@ave-cms.ru>
| @copyright 2007-2026 (c) AVE.cms
| @link https://ave-cms.ru
| @version 3.3
*/
namespace App\Common;
defined('BASEPATH') || die('Direct access to this location is not allowed.');
/** Typed metadata and fallback values for native runtime constants. */
class RuntimeConstantSchema
{
protected static $schemas = array();
public static function all($resolveOptions = true)
{
$cacheKey = $resolveOptions ? 'resolved' : 'defaults';
if (isset(self::$schemas[$cacheKey])) {
return self::$schemas[$cacheKey];
}
$themes = $resolveOptions ? self::directoryOptions(BASEPATH . '/templates') : array('public');
$defaultTheme = in_array('public', $themes, true) ? 'public' : (isset($themes[0]) ? $themes[0] : 'public');
$codeMirrorThemes = $resolveOptions
? self::fileOptions(AdminLocation::path('assets/vendor/codemirror/theme'), 'css')
: array('dracula');
self::$schemas[$cacheKey] = array(
'REWRITE_MODE' => self::item('_CONST_URL', true, 'bool', 'Использовать человекопонятные URL.'),
'URL_SUFF' => self::item('_CONST_URL', '', 'string', 'Суффикс публичных URL, например .html.'),
'TRANSLIT_URL' => self::item('_CONST_URL', true, 'bool', 'Транслитерировать кириллицу в публичных URL.'),
'DEFAULT_THEME_FOLDER' => self::item('_CONST_THEMES', $defaultTheme, 'select', 'Тема публичной части.', $themes),
'CODEMIRROR_THEME' => self::item('_CONST_THEMES', 'dracula', 'select', 'Цветовая схема редактора кода.', $codeMirrorThemes),
'ATTACH_DIR' => self::item('_CONST_FOLDERS', 'attachments', 'path', 'Каталог вложений внутри tmp.'),
'UPLOAD_DIR' => self::item('_CONST_FOLDERS', 'uploads', 'path', 'Корневой каталог загружаемых файлов.'),
'THUMBNAIL_DIR' => self::item('_CONST_THUMBS', 'th', 'path', 'Имя каталога с производными изображениями.'),
'THUMBNAIL_SIZES' => self::item('_CONST_THUMBS', implode(',', self::thumbnailSizes()), 'tags', 'Белый список разрешённых режимов и размеров миниатюр.'),
'JPG_QUALITY' => self::item('_CONST_THUMBS', 90, 'int', 'Качество JPEG-миниатюр от 1 до 100.'),
'JPG_PROGRESSIVE' => self::item('_CONST_THUMBS', true, 'bool', 'Создавать progressive JPEG.'),
'THUMBNAIL_IPTC' => self::item('_CONST_THUMBS', false, 'bool', 'Переносить IPTC в JPEG-миниатюры.'),
'THUMBNAIL_CACHE_LIFETIME' => self::item('_CONST_THUMBS', 1209600, 'int', 'Срок браузерного кеша миниатюр в секундах.'),
'WATERMARKS_DIR' => self::item('_CONST_WATERMARKS', 'source', 'path', 'Каталог оригиналов для водяных знаков.'),
'WATERMARKS_FILE' => self::item('_CONST_WATERMARKS', 'watermark.png', 'path', 'Файл водяного знака.'),
'SESSION_SAVE_HANDLER' => self::item('_CONST_SESSIONS', 'mysql', 'select', 'Хранилище сессий.', array('mysql', 'files', 'memcached')),
'SESSION_LIFETIME' => self::item('_CONST_SESSIONS', 86400, 'int', 'Время жизни сессии в секундах.'),
'COOKIE_LIFETIME' => self::item('_CONST_SESSIONS', 1209600, 'int', 'Время жизни cookie автоматического входа в секундах.'),
'DEV_MODE' => self::item('_CONST_DEV', false, 'bool', 'Режим разработки без SQL-кеша.'),
'PROFILING' => self::item('_CONST_DEV', 'full', 'select', 'Режим публичной панели отладки.', array('off', 'light', 'full', 'dev')),
'SQL_PROFILING' => self::item('_CONST_DEV', true, 'bool', 'Собирать статистику SQL-запросов.'),
'PHP_DEBUGGING' => self::item('_CONST_DEV', false, 'bool', 'Собирать ошибки PHP средствами framework.'),
'PHP_DEBUGGING_FILE' => self::item('_CONST_DEV', false, 'bool', 'Записывать ошибки PHP в системный журнал.'),
'SEND_SQL_ERROR' => self::item('_CONST_DEV', false, 'bool', 'Отправлять письма об ошибках SQL.'),
'SQL_QUERY_SANITIZE' => self::item('_CONST_DEV', false, 'bool', 'Включить дополнительную проверку SQL.'),
'MEMORY_LIMIT_PANIC' => self::item('_CONST_DEV', '-1', 'select', 'Порог аварийной очистки памяти в мегабайтах.', array('-1', '6', '12', '28', '54', '100')),
'CACHE_DOC_TPL' => self::item('_CONST_CACHE', false, 'bool', 'Кешировать скомпилированные шаблоны документов.'),
'CACHE_DOC_FILE' => self::item('_CONST_CACHE', true, 'bool', 'Кешировать данные документа и его полей.'),
'CACHE_DOC_FULL' => self::item('_CONST_CACHE', false, 'bool', 'Кешировать полную публичную страницу.'),
'CACHE_DOC_FULL_ADMIN' => self::item('_CONST_CACHE', false, 'bool', 'Разрешить полный кеш для администратора.'),
'HTML_COMPRESSION' => self::item('_CONST_COMPRESSION', false, 'bool', 'Сжимать HTML перед отправкой.'),
'GZIP_COMPRESSION' => self::item('_CONST_COMPRESSION', false, 'bool', 'Сжимать HTTP-ответ gzip.'),
'OUTPUT_EXPIRE' => self::item('_CONST_COMPRESSION', false, 'bool', 'Отправлять заголовок срока кеширования страницы.'),
'OUTPUT_EXPIRE_OFFSET' => self::item('_CONST_COMPRESSION', 0, 'int', 'Срок клиентского кеша страницы в секундах.'),
'MEMCACHED_SERVER' => self::item('_CONST_MEMCACHED', '', 'string', 'Адрес сервера Memcached.'),
'MEMCACHED_PORT' => self::item('_CONST_MEMCACHED', '', 'string', 'Порт сервера Memcached.'),
'REQUEST_ETC' => self::item('_CONST_REQUEST', '...', 'string', 'Окончание обрезанного значения поля запроса.'),
'REQUEST_BREAK_WORDS' => self::item('_CONST_REQUEST', false, 'bool', 'Разрывать слова при обрезке полей запроса.'),
'REQUEST_STRIP_TAGS' => self::item('_CONST_REQUEST', '', 'tags', 'HTML-теги, сохраняемые при очистке полей запроса.'),
'USE_GET_FIELDS' => self::item('_CONST_OTHER', false, 'bool', 'Проверять пустоту по исходному значению поля.'),
'USE_STATIC_DATA' => self::item('_CONST_OTHER', true, 'bool', 'Хранить данные документов в памяти запроса.'),
'USE_ENCODE_SERIALIZE' => self::item('_CONST_OTHER', false, 'bool', 'Кодировать сериализованные кеш-данные.'),
'LOG_DAYS_LIMIT' => self::item('_CONST_OTHER', 282240, 'int', 'Срок хранения старых системных событий.'),
);
return self::$schemas[$cacheKey];
}
public static function defaults()
{
$defaults = array();
foreach (self::all(false) as $name => $definition) {
$defaults[$name] = $definition['default'];
}
return $defaults;
}
public static function thumbnailSizes()
{
return array('t128x128', 'f128x128', 'c320x320', 'f480x360', 't450x450');
}
protected static function item($group, $default, $type, $description, array $options = array())
{
return array(
'group_code' => $group,
'description' => $description,
'default' => $default,
'type' => $type,
'options' => $options,
);
}
protected static function directoryOptions($path)
{
$options = array();
foreach (glob(rtrim($path, '/') . '/*', GLOB_ONLYDIR) ?: array() as $directory) {
$options[] = basename($directory);
}
sort($options, SORT_NATURAL | SORT_FLAG_CASE);
return $options;
}
protected static function fileOptions($path, $extension)
{
$options = array('default');
foreach (glob(rtrim($path, '/') . '/*.' . $extension) ?: array() as $file) {
$options[] = pathinfo($file, PATHINFO_FILENAME);
}
$options = array_values(array_unique($options));
sort($options, SORT_NATURAL | SORT_FLAG_CASE);
return $options;
}
}