From 304c1c5cb1a0c33b7b41895872ac3b8509c04d93 Mon Sep 17 00:00:00 2001 From: "M@dD3n" Date: Wed, 3 Aug 2022 17:58:25 +0300 Subject: [PATCH] New functional (beta) --- admin/lang/ru/settings.txt | 8 +- admin/templates/settings/settings_cache.tpl | 11 + class/class.core.php | 1000 +++++++++++-------- class/class.database.php | 9 +- class/class.debug.php | 119 ++- class/class.navigation.php | 4 +- class/class.request.php | 9 +- class/class.settings.php | 8 + class/class.sysblocks.php | 6 +- functions/func.parserequest.php | 181 +++- inc/config.php | 18 +- inc/init.php | 10 +- index.php | 28 +- 13 files changed, 952 insertions(+), 459 deletions(-) diff --git a/admin/lang/ru/settings.txt b/admin/lang/ru/settings.txt index 2177fdd..bee7f45 100644 --- a/admin/lang/ru/settings.txt +++ b/admin/lang/ru/settings.txt @@ -10,12 +10,12 @@ SETTINGS_NO = "Нет" SETTINGS_BUTTON_SAVE = "Сохранить изменения" SETTINGS_BUTTON_SAVE_AJAX = "Применить (CTRL+S)" SETTINGS_OR = "или" -SETTINGS_MAIN_TITLE = "Управление общими настройками системы" +SETTINGS_MAIN_TITLE = "Общие настройки системы" SETTINGS_CASE_TITLE = "Дополнительные настройки" SETTINGS_MAIN = "Общие настройки системы" SETTINGS_SAVED = "Настройки системы успешно сохранены" SETTINGS_SAVED_ERR = "Не удалось сохранить настройки.
Попробуйте еще раз." -SETTINGS_SAVE_INFO = "В данном разделе вы можете отредактировать глобальные параметры системы. Пожалуйста, будьте предельно внимательны и помните, что Неверные параметры могут сделать систему неработоспособной." +SETTINGS_SAVE_INFO = "В данном разделе вы можете отредактировать глобальные параметры системы. Пожалуйста, будьте предельно внимательны и помните, что неверные параметры могут сделать систему неработоспособной." SETTINGS_SAVE_CONFIRM = "Вы уверены, что хотите сохранить параметры системы?" SETTINGS_SITE_NAME = "Название cайта:" SETTINGS_SITE_COUNTRY = "Страна сайта:" @@ -183,4 +183,6 @@ SETTINGS_CACHE_T_RUBRICS = "Данные рубрик" SETTINGS_CACHE_T_NAVI = "Данные навигации" SETTINGS_CACHE_T_MODULES = "Данные модулей" SETTINGS_CACHE_T_QUERIES = "Данные запросов" -SETTINGS_CACHE_T_DOCS = "Данные документов" \ No newline at end of file +SETTINGS_CACHE_T_DOCS = "Данные документов" + +SETTINGS_CACHE_T_COMPILED = "Данные скомпилированных документов" \ No newline at end of file diff --git a/admin/templates/settings/settings_cache.tpl b/admin/templates/settings/settings_cache.tpl index 5984733..366734c 100644 --- a/admin/templates/settings/settings_cache.tpl +++ b/admin/templates/settings/settings_cache.tpl @@ -80,6 +80,17 @@ {#SETTINGS_CACHE_CLEAR#} + + + {#SETTINGS_CACHE_T_COMPILED#} + + + {#SETTINGS_CACHE_SHOW#} + + + {#SETTINGS_CACHE_CLEAR#} + + {#SETTINGS_CACHE_T_QUERIES#} diff --git a/class/class.core.php b/class/class.core.php index 7b5ddc1..3a3cf66 100755 --- a/class/class.core.php +++ b/class/class.core.php @@ -659,6 +659,8 @@ */ function _main_content ($rubTmpl) { + Debug::startTime('MAINCONTENT'); + // Проверяем теги полей в шаблоне рубрики на условие != '' if (defined('USE_GET_FIELDS') && USE_GET_FIELDS) { @@ -748,6 +750,14 @@ $main_content ); + // GetDocumentsField + $main_content = preg_replace_callback( + '/\[tag:docs:([0-9]+)(|:([a-zA-Z0-9-_]+))+?\]/', + function ($match) { + return get_document($match[1], $match[3]); + }, + $main_content + ); $main_content = str_replace('[tag:docdate]', translate_date(strftime(DATE_FORMAT, $this->curentdoc->document_published)), $main_content); $main_content = str_replace('[tag:doctime]', translate_date(strftime(TIME_FORMAT, $this->curentdoc->document_published)), $main_content); @@ -766,6 +776,8 @@ //-- Кеширование скомпилированного документа $this->setCompileDocument($main_content); + $GLOBALS['block_generate']['DOCUMENT']['MAINCONTENT'] = Debug::endTime('MAINCONTENT'); + return $main_content; } @@ -801,15 +813,22 @@ return false; $cache['id'] = (int)$cache['id']; - $cache['id'] = 'documents/' . (floor($cache['id'] / 1000)) . '/' . $cache['id']; + $cache['dir'] = 'documents/' . (floor($cache['id'] / 1000)) . '/' . $cache['id']; + + $cache['compile_id'] = 'compile/' . (floor($cache['id'] / 1000)) . '/' . $cache['id']; $cache['file'] = $this->_get_cache_hash() . '.compiled'; + $cache['compile_file'] = $this->_get_cache_hash() . '.php'; if (! $cache['file']) return false; - $cache['dir'] = BASE_DIR . '/tmp/cache/sql/' . (trim($cache['id']) > '' - ? trim($cache['id']) . '/' + $cache['dir'] = BASE_DIR . '/tmp/cache/sql/' . (trim($cache['dir']) > '' + ? trim($cache['dir']) . '/' + : substr($cache['file'], 0, 2) . '/' . substr($cache['file'], 2, 2) . '/' . substr($cache['file'], 4, 2) . '/'); + + $cache['compile_dir'] = BASE_DIR . '/tmp/cache/sql/' . (trim($cache['compile_id']) > '' + ? trim($cache['compile_id']) . '/' : substr($cache['file'], 0, 2) . '/' . substr($cache['file'], 2, 2) . '/' . substr($cache['file'], 4, 2) . '/'); return $cache; @@ -900,6 +919,108 @@ } + function checkAcceptCache () + { + $isAjax = isAjax(); + $page = get_current_page(); + $array = ['module', 'sysblock', 'request', 'page', 'apage', 'artpage']; + + foreach ($array AS $k => $v) + { + if (in_array($v, $_REQUEST)) + return false; + } + + if ( ($isAjax == true) || ($page != 1) ) + return false; + + return true; + } + + + function setCompileContent ($content) + { + $cache = $this->_get_cache_id(); + + if (! $cache) + return false; + + //-- Удаляем файл, если существует + if (file_exists($cache['compile_dir'] . $cache['file'])) + unlink($cache['compile_dir'] . $cache['file']); + + if ($this->checkAcceptCache() == false) + return false; + + // Если включен DEV MODE, то отключаем кеширование запросов + if (defined('DEV_MODE') AND DEV_MODE) + return false; + + if (UGROUP == 1 && (defined('CACHE_DOC_FULL_ADMIN') && CACHE_DOC_FULL_ADMIN == false)) + return false; + + //-- Кэширование разрешено + if (defined('CACHE_DOC_FULL') && CACHE_DOC_FULL) + { + //-- Если нет папки, создаем + if (! is_dir($cache['compile_dir'])) + @mkdir($cache['compile_dir'], 0766, true); + + //-- Сохраняем скомпилированный шаблон в кэш + file_put_contents($cache['compile_dir'] . $cache['compile_file'], $content); + + $GLOBALS['block_generate']['COMPILE']['SET'] = true; + } + + return true; + } + + + function getCompileContent () + { + if ($this->checkAcceptCache() == false) + return false; + + $cache = $this->_get_cache_id(); + + if (! $cache) + return false; + + $content = false; + + //-- Если нет папки, создаем + if (! is_dir($cache['compile_dir'])) + @mkdir($cache['compile_dir'], 0766, true); + + // Наличие файла + if (file_exists($cache['compile_dir'] . $cache['compile_file'])) + { + // Получаем время создания файла + $file_time = filemtime($cache['compile_dir'] . $cache['compile_file']); + + // Получаем время для проверки + $cache_time = $this->curentdoc->rubric_changed; + + if (! $cache_time || $cache_time > $file_time) + { + unlink ($cache['compile_dir'] . $cache['compile_file']); + } + else if (defined('CACHE_DOC_FULL') && CACHE_DOC_FULL) + { + $content = file_get_contents($cache['compile_dir'] . $cache['compile_file']); + + $GLOBALS['block_generate']['COMPILE']['GET'] = true; + } + } + else + { + $content = false; + } + + return $content; + } + + /** * Метод, предназначенный для обработки системных тегов модулей. Здесь подключаются только те файлы модулей, * системные теги которых обнаружены в шаблоне при парсинге. Также формирует массив всех установленных модулей @@ -1048,391 +1169,368 @@ * @param int $id идентификатор документа * @param int $rub_id идентификатор рубрики */ - function coreSiteFetch($id, $rub_id = '') + function coreSiteFetch ($id, $rub_id = '') { - global $AVE_DB; + global $AVE_DB, $AVE_Module; Debug::startTime('DOC_' . $id); - $main_content = ''; + $cacheCompile = false; + + // Определяем рубрику + define('RUB_ID', ! empty ($rub_id) + ? $rub_id + : $this->curentdoc->rubric_id); - // Если происходит вызов модуля, получаем соответствующие мета-теги и получаем шаблон модуля - if (isset($_REQUEST['module']) && ! empty($_REQUEST['module'])) - { - $out = $this->_coreModuleMetatagsFetch(); - $out = $this->_coreDocumentTemplateGet('', '', $this->_coreModuleTemplateGet()); - } - // Если происходит вызов системного блока - elseif (isset($_REQUEST['sysblock']) && ! empty($_REQUEST['sysblock'])) + $main_content = ''; + + if ((defined('CACHE_DOC_FULL') && CACHE_DOC_FULL) && isAjax() == false) { - if (! is_numeric($_REQUEST['sysblock']) && preg_match('/^[A-Za-z0-9-_]{1,20}$/i', $_REQUEST['sysblock']) !== 1) + if ($out = $this->getCompileContent()) { - header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true); - exit; + foreach ($AVE_Module->moduleListGet() as $row) + { + // Проверяем, существует ли для данного модуля файл module.php в его персональной директории + $mod_file = BASE_DIR . '/modules/' . $row['ModuleSysName'] . '/module.php'; + + if (is_file($mod_file)) + include_once($mod_file); + } + + $this->_coreRubricPermissionFetch(RUB_ID); + + // Выполняем Код рубрики До загрузки документа + ob_start(); + eval(' ?>' . $this->curentdoc->rubric_start_code . '_coreModuleMetatagsFetch(); + $out = $this->_coreDocumentTemplateGet('', '', $this->_coreModuleTemplateGet()); } - - // проверяем разрешение на обращение только по Ajax - if (_getSysBlock($_REQUEST['sysblock'], 'sysblock_ajax')) + // Если происходит вызов системного блока + elseif (isset($_REQUEST['sysblock']) && ! empty($_REQUEST['sysblock'])) { - if (isAjax()) - $out = parse_sysblock($_REQUEST['sysblock']); + if (! is_numeric($_REQUEST['sysblock']) && preg_match('/^[A-Za-z0-9-_]{1,20}$/i', $_REQUEST['sysblock']) !== 1) + { + header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true); + exit; + } + + // проверяем разрешение на внешнее обращение + if (! _getSysBlock($_REQUEST['sysblock'], 'sysblock_external')) + { + header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true); + exit; + } + + // проверяем разрешение на обращение только по Ajax + if (_getSysBlock($_REQUEST['sysblock'], 'sysblock_ajax')) + { + if (isAjax()) + $out = parse_sysblock($_REQUEST['sysblock']); + else + $this->_coreErrorPage404(); + } else - $this->_coreErrorPage404(); + { + $out = parse_sysblock($_REQUEST['sysblock']); + } } - else + // Если происходит вызов запроса + elseif (isset($_REQUEST['request']) && ! empty($_REQUEST['request'])) { - $out = parse_sysblock($_REQUEST['sysblock']); - } - } - // Если происходит вызов запроса - elseif (isset($_REQUEST['request']) && ! empty($_REQUEST['request'])) - { - if (! is_numeric($_REQUEST['request']) && preg_match('/^[A-Za-z0-9-_]{1,20}$/i', $_REQUEST['request']) !== 1) - $this->_coreErrorPage404(); - - // Определяем рубрику - define('RUB_ID', ! empty ($rub_id) - ? $rub_id - : $this->curentdoc->rubric_id); + if (! is_numeric($_REQUEST['request']) && preg_match('/^[A-Za-z0-9-_]{1,20}$/i', $_REQUEST['request']) !== 1) + $this->_coreErrorPage404(); - // Проверяем разрешение на внешнее обращение - if (! $this->_requestGet($_REQUEST['request'], 'request_external')) - $this->_coreErrorPage404(); + // Проверяем разрешение на внешнее обращение + if (! $this->_requestGet($_REQUEST['request'], 'request_external')) + $this->_coreErrorPage404(); - // Проверяем разрешение на обращение только по Ajax - if ($this->_requestGet($_REQUEST['request'], 'request_ajax')) - { - if (isAjax()) - $out = request_parse($_REQUEST['request']); + // Проверяем разрешение на обращение только по Ajax + if ($this->_requestGet($_REQUEST['request'], 'request_ajax')) + { + if (isAjax()) + $out = request_parse($_REQUEST['request']); + else + $this->_coreErrorPage404(); + } else - $this->_coreErrorPage404(); + { + $out = request_parse($_REQUEST['request']); + } } + // В противном случае начинаем вывод документа else { - $out = request_parse($_REQUEST['request']); - } - } - // В противном случае начинаем вывод документа - else - { - if (! isset($this->curentdoc->Id) && ! $this->_coreCurrentDocumentFetch($id, UGROUP)) - { - // Определяем документ с 404 ошибкой в случае, если документ не найден - if ($this->_corePageNotFoundFetch(PAGE_NOT_FOUND_ID, UGROUP)) - $_REQUEST['id'] = $_GET['id'] = $id = PAGE_NOT_FOUND_ID; - } - - // проверяем параметры публикации документа - if (! $this->_coreDocumentIsPublished()) - $this->_coreErrorPage404(); + if (! isset($this->curentdoc->Id) && ! $this->_coreCurrentDocumentFetch($id, UGROUP)) + { + // Определяем документ с 404 ошибкой в случае, если документ не найден + if ($this->_corePageNotFoundFetch(PAGE_NOT_FOUND_ID, UGROUP)) + $_REQUEST['id'] = $_GET['id'] = $id = PAGE_NOT_FOUND_ID; + } - // Определяем права доступа к документам рубрики - define('RUB_ID', ! empty ($rub_id) - ? $rub_id - : $this->curentdoc->rubric_id); + // проверяем параметры публикации документа + if (! $this->_coreDocumentIsPublished()) + $this->_coreErrorPage404(); - $this->_coreRubricPermissionFetch(RUB_ID); + $this->_coreRubricPermissionFetch(RUB_ID); - // Выполняем Код рубрики До загрузки документа - ob_start(); - eval(' ?>' . $this->curentdoc->rubric_start_code . '' . $this->curentdoc->rubric_start_code . '_coreDocumentTemplateGet(RUB_ID, null, null, $this->curentdoc->rubric_template_id); + // Получаем шаблон + $out = $this->_coreDocumentTemplateGet(RUB_ID, null, null, $this->curentdoc->rubric_template_id); - if (! ((isset ($_SESSION[RUB_ID . '_docread']) && $_SESSION[RUB_ID . '_docread'] == 1) - || (isset ($_SESSION[RUB_ID . '_alles']) && $_SESSION[RUB_ID . '_alles'] == 1)) ) - { // читать запрещено - извлекаем ругательство и отдаём вместо контента - $main_content = get_settings('message_forbidden'); - } - else - { - if (isset ($_REQUEST['print']) && $_REQUEST['print'] == 1) - { // Увеличиваем счетчик версий для печати - $AVE_DB->Query(" - UPDATE - " . PREFIX . "_documents - SET - document_count_print = document_count_print + 1 - WHERE - Id = '" . $id . "' - "); + if (! ((isset ($_SESSION[RUB_ID . '_docread']) && $_SESSION[RUB_ID . '_docread'] == 1) + || (isset ($_SESSION[RUB_ID . '_alles']) && $_SESSION[RUB_ID . '_alles'] == 1)) ) + { // читать запрещено - извлекаем ругательство и отдаём вместо контента + $main_content = get_settings('message_forbidden'); } else { - if (! isset ($_SESSION['doc_view'][$id])) - { // Увеличиваем счетчик просмотров (1 раз в пределах сессии) + if (isset ($_REQUEST['print']) && $_REQUEST['print'] == 1) + { // Увеличиваем счетчик версий для печати $AVE_DB->Query(" UPDATE " . PREFIX . "_documents SET - document_count_view = document_count_view + 1 + document_count_print = document_count_print + 1 WHERE Id = '" . $id . "' "); - - $_SESSION['doc_view'][$id] = time(); } + else + { + if (! isset ($_SESSION['doc_view'][$id])) + { // Увеличиваем счетчик просмотров (1 раз в пределах сессии) + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_documents + SET + document_count_view = document_count_view + 1 + WHERE + Id = '" . $id . "' + "); - $curdate = mktime(0, 0, 0, date('m'), date('d'), date('Y')); + $_SESSION['doc_view'][$id] = time(); + } - if (! isset($_SESSION['doc_view_dayly['.$curdate.'][' . $id . ']'])) - { - // и подневный счетчик просмотров тоже увеличиваем $curdate = mktime(0, 0, 0, date('m'), date('d'), date('Y')); - $AVE_DB->Query(" - UPDATE - " . PREFIX . "_view_count - SET - count = count + 1 - WHERE - document_id = '" . $id . "' AND - day_id = '".$curdate."' - "); - - if (! $AVE_DB->getAffectedRows()) + if (! isset($_SESSION['doc_view_dayly['.$curdate.'][' . $id . ']'])) { + // и подневный счетчик просмотров тоже увеличиваем + $curdate = mktime(0, 0, 0, date('m'), date('d'), date('Y')); + $AVE_DB->Query(" - INSERT INTO " . PREFIX . "_view_count ( - document_id, - day_id, - count - ) - VALUES ( - '" . $id . "', '".$curdate."', '1' - ) + UPDATE + " . PREFIX . "_view_count + SET + count = count + 1 + WHERE + document_id = '" . $id . "' AND + day_id = '".$curdate."' "); - } - $_SESSION['doc_view_dayly['.$curdate.'][' . $id . ']'] = time(); - } - } - - // Извлекаем скомпилированный шаблон документа из кэша - if (defined('CACHE_DOC_TPL') && CACHE_DOC_TPL) // && empty ($_POST) - $main_content = $this->getCompileDocument(); - else - // Кэширование запрещено - $main_content = false; + if (! $AVE_DB->getAffectedRows()) + { + $AVE_DB->Query(" + INSERT INTO " . PREFIX . "_view_count ( + document_id, + day_id, + count + ) + VALUES ( + '" . $id . "', '".$curdate."', '1' + ) + "); + } - // Собираем контент - // Если в кеше нет контента, то - if (empty($main_content)) - { - // Кэш пустой или отключен, извлекаем и компилируем шаблон - if (! empty ($this->curentdoc->rubric_template)) - { - $rubTmpl = $this->curentdoc->rubric_template; + $_SESSION['doc_view_dayly['.$curdate.'][' . $id . ']'] = time(); + } } + + // Извлекаем скомпилированный шаблон документа из кэша + if (defined('CACHE_DOC_TPL') && CACHE_DOC_TPL) // && empty ($_POST) + $main_content = $this->getCompileDocument(); else + // Кэширование запрещено + $main_content = false; + + // Собираем контент + // Если в кеше нет контента, то + if (empty($main_content)) { - // Если документу задан другой шаблон из данной рубрики, то берем его - if ($this->curentdoc->rubric_tmpl_id != 0) + // Кэш пустой или отключен, извлекаем и компилируем шаблон + if (! empty ($this->curentdoc->rubric_template)) { - $rubTmpl = $AVE_DB->Query(" - SELECT - template - FROM - " . PREFIX . "_rubric_templates - WHERE - id = '" . $this->curentdoc->rubric_tmpl_id . "' - AND - rubric_id = '" . RUB_ID . "' - LIMIT 1 - ")->GetCell(); + $rubTmpl = $this->curentdoc->rubric_template; } - // Иначе берем стандартный шаблон рубрики else { - $rubTmpl = $AVE_DB->Query(" - SELECT - rubric_template - FROM - " . PREFIX . "_rubrics - WHERE - Id = '" . RUB_ID . "' - LIMIT 1 - ")->GetCell(); + // Если документу задан другой шаблон из данной рубрики, то берем его + if ($this->curentdoc->rubric_tmpl_id != 0) + { + $rubTmpl = $AVE_DB->Query(" + SELECT + template + FROM + " . PREFIX . "_rubric_templates + WHERE + id = '" . $this->curentdoc->rubric_tmpl_id . "' + AND + rubric_id = '" . RUB_ID . "' + LIMIT 1 + ")->GetCell(); + } + // Иначе берем стандартный шаблон рубрики + else + { + $rubTmpl = $AVE_DB->Query(" + SELECT + rubric_template + FROM + " . PREFIX . "_rubrics + WHERE + Id = '" . RUB_ID . "' + LIMIT 1 + ")->GetCell(); + } } - } - $rubTmpl = trim($rubTmpl); + $rubTmpl = trim($rubTmpl); - // Собираем шаблон рубрики - if (empty($rubTmpl)) - // Если не задан шаблон рубрики, выводим сообщение - $main_content = $this->_rubric_template_empty; - else - // Обрабатываем основные поля рубрики - $main_content = $this->_main_content($rubTmpl); + // Собираем шаблон рубрики + if (empty($rubTmpl)) + // Если не задан шаблон рубрики, выводим сообщение + $main_content = $this->_rubric_template_empty; + else + // Обрабатываем основные поля рубрики + $main_content = $this->_main_content($rubTmpl); + } } - } - $out = str_replace('[tag:maincontent]', $main_content, $out); + $out = str_replace('[tag:maincontent]', $main_content, $out); - unset ($this->curentdoc->rubric_template, $this->curentdoc->template); - } - //-- Конец вывода документа - - //Работа с условиями - /* - $out = preg_replace('/\[tag:if_exp:?(.*)\]/u', '', $out); - $out = str_replace('[tag:if_exp_else]', '', $out); - $out = str_replace('[tag:/if_exp]', '', $out); - - */ - - // Тут мы вводим в хеадер и футер иньекцию скриптов. - if (defined('RUB_ID')) - { - $replace = [ - '[tag:rubheader]' => $this->curentdoc->rubric_header_template . '[tag:rubheader]', - '[tag:rubfooter]' => $this->curentdoc->rubric_footer_template . '[tag:rubfooter]' - ]; - - $out = str_replace(array_keys($replace), array_values($replace), $out); + unset ($this->curentdoc->rubric_template, $this->curentdoc->template); + } + //-- Конец вывода документа + + //Работа с условиями + /* + $out = preg_replace('/\[tag:if_exp:?(.*)\]/u', '', $out); + $out = str_replace('[tag:if_exp_else]', '', $out); + $out = str_replace('[tag:/if_exp]', '', $out); - unset ($replace); - } + */ - // Парсим поля запроса - $out = preg_replace_callback('/\[tag:rfld:([a-zA-Z0-9-_]+)]\[(more|esc|img|[0-9-]+)]/', - function ($m) use ($id) + // Тут мы вводим в хеадер и футер иньекцию скриптов. + if (defined('RUB_ID')) { - return request_get_document_field($m[1], $id, $m[2], (defined('RUB_ID') ? RUB_ID : 0)); - }, - $out - ); + $replace = [ + '[tag:rubheader]' => $this->curentdoc->rubric_header_template, + '[tag:rubfooter]' => $this->curentdoc->rubric_footer_template + ]; - // Удаляем ошибочные теги полей документа в шаблоне рубрики - $out = preg_replace('/\[tag:rfld:\w*\]/', '', $out); + $out = str_replace(array_keys($replace), array_values($replace), $out); - // Если в GET запросе пришел параметр print, т.е. страница для печати, - // парсим контент, который обрамлен тегами только для печати - if (isset ($_REQUEST['print']) && $_REQUEST['print'] == 1) - { - $out = str_replace(array('[tag:if_print]', '[/tag:if_print]'), '', $out); - $out = preg_replace('/\[tag:if_notprint\](.*?)\[\/tag:if_notprint\]/si', '', $out); - } - else - { - // В противном случае наоборот, парсим только тот контент, который предназначен НЕ для печати - $out = preg_replace('/\[tag:if_print\](.*?)\[\/tag:if_print\]/si', '', $out); - $out = str_replace(array('[tag:if_notprint]', '[/tag:if_notprint]'), '', $out); + unset ($replace); } - // Парсим теги визуальных блоков - $out = preg_replace_callback('/\[tag:block:([A-Za-z0-9-_]{1,20}+)\]/', 'parse_block', $out); + // Парсим поля запроса + $out = preg_replace_callback('/\[tag:rfld:([a-zA-Z0-9-_]+)]\[(more|esc|img|[0-9-]+)]/', + function ($m) use ($id) + { + return request_get_document_field($m[1], $id, $m[2], (defined('RUB_ID') ? RUB_ID : 0)); + }, + $out + ); - // Парсим теги системных блоков - $out = preg_replace_callback('/\[tag:sysblock:([A-Za-z0-9-_]{1,20}+)(|:\{(.*?)\})\]/', - function ($m) - { - return parse_sysblock($m[1], $m[2]); - }, - $out); + // Удаляем ошибочные теги полей документа в шаблоне рубрики + $out = preg_replace('/\[tag:rfld:\w*\]/', '', $out); - // Парсим тизер документа - $out = preg_replace_callback('/\[tag:teaser:(\d+)(|:\[(.*?)\])\]/', - function ($m) + // Если в GET запросе пришел параметр print, т.е. страница для печати, + // парсим контент, который обрамлен тегами только для печати + if (isset ($_REQUEST['print']) && $_REQUEST['print'] == 1) { - return showteaser($m[1], $m[2]); - }, - $out - ); + $out = str_replace(array('[tag:if_print]', '[/tag:if_print]'), '', $out); + $out = preg_replace('/\[tag:if_notprint\](.*?)\[\/tag:if_notprint\]/si', '', $out); + } + else + { + // В противном случае наоборот, парсим только тот контент, который предназначен НЕ для печати + $out = preg_replace('/\[tag:if_print\](.*?)\[\/tag:if_print\]/si', '', $out); + $out = str_replace(array('[tag:if_notprint]', '[/tag:if_notprint]'), '', $out); + } - // Парсим теги модулей - $out = $this->coreModuleTagParse($out); + // Парсим теги визуальных блоков + $out = preg_replace_callback('/\[tag:block:([A-Za-z0-9-_]{1,20}+)\]/', 'parse_block', $out); - // Если в запросе пришел параметр module, т.е. вызов модуля, - // проверяем установлен и активен ли модуль - if (isset($_REQUEST['module']) && ! $this->_getRequestModule($_REQUEST['module'])) - display_notice($this->_module_error . ' "' . $_REQUEST['module'] . '"'); // Выводим сообщение о том что такого модуля нет + // Парсим теги системных блоков + $out = preg_replace_callback('/\[tag:sysblock:([A-Za-z0-9-_]{1,20}+)(|:\{(.*?)\})\]/', + function ($m) + { + return parse_sysblock($m[1], $m[2]); + }, + $out); - // Парсим теги системы внутренних запросов - $out = preg_replace_callback('/\[tag:request:([A-Za-z0-9-_]{1,20}+)\]/', 'request_parse', $out); + // Парсим тизер документа + $out = preg_replace_callback('/\[tag:teaser:(\d+)(|:\[(.*?)\])\]/', + function ($m) + { + return showteaser($m[1], $m[2]); + }, + $out + ); - // Парсим теги навигации - $out = preg_replace_callback('/\[tag:navigation:([A-Za-z0-9-_]{1,20}+):?([0-9,]*)\]/', 'parse_navigation', $out); + // Парсим теги модулей + $out = $this->coreModuleTagParse($out); - // Парсим теги скрытого текста - $out = parse_hide($out); + // Если в запросе пришел параметр module, т.е. вызов модуля, + // проверяем установлен и активен ли модуль + if (isset($_REQUEST['module']) && ! $this->_getRequestModule($_REQUEST['module'])) + display_notice($this->_module_error . ' "' . $_REQUEST['module'] . '"'); // Выводим сообщение о том что такого модуля нет - // Если в запросе пришел параметр sysblock, т.е. вызов сис блока, - // парсим контент - if (isset($_REQUEST['sysblock']) && $_REQUEST['sysblock'] != '') - { - $search = array( - '[tag:mediapath]', - '[tag:path]', - '[tag:sitename]', - '[tag:home]', - '[tag:docid]', - '[tag:docparent]' - ); + // Парсим теги системы внутренних запросов + $out = preg_replace_callback('/\[tag:request:([A-Za-z0-9-_]{1,20}+)\]/', 'request_parse', $out); - $replace = array( - ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', - ABS_PATH, - htmlspecialchars(get_settings('site_name'), ENT_QUOTES), - get_home_link(), - (isset ($this->curentdoc->Id) ? $this->curentdoc->Id : ''), - (isset ($this->curentdoc->document_parent) ? $this->curentdoc->document_parent : '') - ); - } - // Если в запросе пришел параметр request, т.е. вызов запроса, - // парсим контент - elseif (isset($_REQUEST['request']) && $_REQUEST['request'] != '') - { - $search = array( - '[tag:mediapath]', - '[tag:path]', - '[tag:sitename]', - '[tag:home]', - '[tag:docid]', - '[tag:docparent]' - ); + // Парсим теги навигации + $out = preg_replace_callback('/\[tag:navigation:([A-Za-z0-9-_]{1,20}+):?([0-9,]*)\]/', 'parse_navigation', $out); - $replace = array( - ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', - ABS_PATH, - htmlspecialchars(get_settings('site_name'), ENT_QUOTES), - get_home_link(), - (isset ($this->curentdoc->Id) ? $this->curentdoc->Id : ''), - (isset ($this->curentdoc->document_parent) ? $this->curentdoc->document_parent : '') - ); - } - else + // Парсим теги скрытого текста + $out = parse_hide($out); + + // Если в запросе пришел параметр sysblock, т.е. вызов сис блока, + // парсим контент + if (isset($_REQUEST['sysblock']) && $_REQUEST['sysblock'] != '') { - // В противном случае - // парсим остальные теги основного шаблона $search = array( '[tag:mediapath]', '[tag:path]', '[tag:sitename]', - '[tag:alias]', - '[tag:domain]', '[tag:home]', - '[tag:robots]', - '[tag:canonical]', '[tag:docid]', '[tag:docparent]' ); @@ -1441,161 +1539,215 @@ ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', ABS_PATH, htmlspecialchars(get_settings('site_name'), ENT_QUOTES), - (isset($_REQUEST['id'])) ? isset ($this->curentdoc->document_alias) ? $this->curentdoc->document_alias : '' : '', - getSiteUrl(), get_home_link(), - (isset($this->curentdoc->document_meta_robots) ? $this->curentdoc->document_meta_robots : ''), - canonical(isset ($this->curentdoc->document_alias) ? ABS_PATH . $this->curentdoc->document_alias : ''), - (isset($this->curentdoc->Id) ? $this->curentdoc->Id : ''), - (isset($this->curentdoc->document_parent) ? $this->curentdoc->document_parent : '') + (isset ($this->curentdoc->Id) ? $this->curentdoc->Id : ''), + (isset ($this->curentdoc->document_parent) ? $this->curentdoc->document_parent : '') ); } - - // Если пришел контент из модуля - if (defined('MODULE_CONTENT')) - { - // парсинг тегов при выводе из модуля - $search[] = '[tag:maincontent]'; - $replace[] = MODULE_CONTENT; - $search[] = '[tag:title]'; - $replace[] = htmlspecialchars(defined('MODULE_TITLE') ? MODULE_TITLE : '', ENT_QUOTES); - $search[] = '[tag:description]'; - $replace[] = htmlspecialchars(defined('MODULE_DESCRIPTION') ? MODULE_DESCRIPTION : '', ENT_QUOTES); - $search[] = '[tag:keywords]'; - $replace[] = htmlspecialchars(defined('MODULE_KEYWORDS') ? MODULE_KEYWORDS : '', ENT_QUOTES); - } - // Или из системного блока - elseif (isset($_REQUEST['sysblock'])) - { - // Убираем пустые теги в сис блоке - $main_content = preg_replace('/\[tag:(.+?)\]/', '', $main_content); - $main_content = preg_replace('/\[mod_(.+?)\]/', '', $main_content); - } - // Или из запроса - elseif (isset($_REQUEST['request'])) + // Если в запросе пришел параметр request, т.е. вызов запроса, + // парсим контент + elseif (isset($_REQUEST['request']) && $_REQUEST['request'] != '') { - // Убираем пустые теги в запросе - $main_content = preg_replace('/\[tag:(.+?)\]/', '', $main_content); - $main_content = preg_replace('/\[mod_(.+?)\]/', '', $main_content); + $search = array( + '[tag:mediapath]', + '[tag:path]', + '[tag:sitename]', + '[tag:home]', + '[tag:docid]', + '[tag:docparent]' + ); + + $replace = array( + ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', + ABS_PATH, + htmlspecialchars(get_settings('site_name'), ENT_QUOTES), + get_home_link(), + (isset ($this->curentdoc->Id) ? $this->curentdoc->Id : ''), + (isset ($this->curentdoc->document_parent) ? $this->curentdoc->document_parent : '') + ); } - // Иначе else { - // Если стоит вкл на генерацию keywords, description - if ($this->curentdoc->rubric_meta_gen) - { - // Генерируем keywords, description на основе - // данных документа, если позволяет рубрика - require_once(dirname(__FILE__).'/class.meta.php'); - $meta = new Meta(); - $res = $meta->generateMeta($main_content); - } + // В противном случае + // парсим остальные теги основного шаблона + $search = array( + '[tag:mediapath]', + '[tag:path]', + '[tag:sitename]', + '[tag:alias]', + '[tag:domain]', + '[tag:home]', + '[tag:robots]', + '[tag:canonical]', + '[tag:docid]', + '[tag:docparent]' + ); + + $replace = array( + ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', + ABS_PATH, + htmlspecialchars(get_settings('site_name'), ENT_QUOTES), + (isset($_REQUEST['id'])) ? isset ($this->curentdoc->document_alias) ? $this->curentdoc->document_alias : '' : '', + getSiteUrl(), + get_home_link(), + (isset($this->curentdoc->document_meta_robots) ? $this->curentdoc->document_meta_robots : ''), + canonical(isset ($this->curentdoc->document_alias) ? getSiteUrl() . str_replace('//', '/', ABS_PATH . $this->curentdoc->document_alias) : ''), + (isset($this->curentdoc->Id) ? $this->curentdoc->Id : ''), + (isset($this->curentdoc->document_parent) ? $this->curentdoc->document_parent : '') + ); + } - // Убираем пустые теги + // Если пришел контент из модуля + if (defined('MODULE_CONTENT')) + { + // парсинг тегов при выводе из модуля + $search[] = '[tag:maincontent]'; + $replace[] = MODULE_CONTENT; + $search[] = '[tag:title]'; + $replace[] = htmlspecialchars(defined('MODULE_TITLE') ? MODULE_TITLE : '', ENT_QUOTES); + $search[] = '[tag:description]'; + $replace[] = htmlspecialchars(defined('MODULE_DESCRIPTION') ? MODULE_DESCRIPTION : '', ENT_QUOTES); + $search[] = '[tag:keywords]'; + $replace[] = htmlspecialchars(defined('MODULE_KEYWORDS') ? MODULE_KEYWORDS : '', ENT_QUOTES); + } + // Или из системного блока + elseif (isset($_REQUEST['sysblock'])) + { + // Убираем пустые теги в сис блоке + $main_content = preg_replace('/\[tag:(.+?)\]/', '', $main_content); + $main_content = preg_replace('/\[mod_(.+?)\]/', '', $main_content); + } + // Или из запроса + elseif (isset($_REQUEST['request'])) + { + // Убираем пустые теги в запросе $main_content = preg_replace('/\[tag:(.+?)\]/', '', $main_content); $main_content = preg_replace('/\[mod_(.+?)\]/', '', $main_content); - - // Парсим keywords, description, title - $search[] = '[tag:keywords]'; - $replace[] = stripslashes(htmlspecialchars((! empty ($this->curentdoc->rubric_meta_gen) ? $res['keywords'] : $this->curentdoc->document_meta_keywords), ENT_QUOTES)); - $search[] = '[tag:description]'; - $replace[] = stripslashes(htmlspecialchars((! empty ($this->curentdoc->rubric_meta_gen) ? $res['description'] : $this->curentdoc->document_meta_description), ENT_QUOTES)); - $search[] = '[tag:title]'; - $replace[] = stripslashes(htmlspecialchars_decode(pretty_chars($this->curentdoc->document_title))); } + // Иначе + else + { + // Если стоит вкл на генерацию keywords, description + if ($this->curentdoc->rubric_meta_gen) + { + // Генерируем keywords, description на основе + // данных документа, если позволяет рубрика + require_once(dirname(__FILE__).'/class.meta.php'); + $meta = new Meta(); + $res = $meta->generateMeta($main_content); + } - // Возвращаем поле из БД документа - $out = preg_replace_callback('/\[tag:doc:([a-zA-Z0-9-_]+)\]/u', - function ($match) - { - return isset($this->curentdoc->{$match[1]}) - ? $this->curentdoc->{$match[1]} - : null; - }, - $out - ); + // Убираем пустые теги + $main_content = preg_replace('/\[tag:(.+?)\]/', '', $main_content); + $main_content = preg_replace('/\[mod_(.+?)\]/', '', $main_content); + + // Парсим keywords, description, title + $search[] = '[tag:keywords]'; + $replace[] = stripslashes(htmlspecialchars((! empty ($this->curentdoc->rubric_meta_gen) ? $res['keywords'] : $this->curentdoc->document_meta_keywords), ENT_QUOTES)); + $search[] = '[tag:description]'; + $replace[] = stripslashes(htmlspecialchars((! empty ($this->curentdoc->rubric_meta_gen) ? $res['description'] : $this->curentdoc->document_meta_description), ENT_QUOTES)); + $search[] = '[tag:title]'; + $replace[] = stripslashes(htmlspecialchars_decode(pretty_chars($this->curentdoc->document_title))); + } - // Если пришел вызов на активацию языковых файлов - $out = preg_replace_callback( - '/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u', - function ($match) - { - global $AVE_Template; + // Возвращаем поле из БД документа + $out = preg_replace_callback('/\[tag:doc:([a-zA-Z0-9-_]+)\]/u', + function ($match) + { + return isset($this->curentdoc->{$match[1]}) + ? $this->curentdoc->{$match[1]} + : null; + }, + $out + ); - return $AVE_Template->get_config_vars($match[1]); - }, - $out - ); + // Если пришел вызов на активацию языковых файлов + $out = preg_replace_callback( + '/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u', + function ($match) + { + global $AVE_Template; - // Убираем пустые теги - $out = preg_replace('/\[tag:doc:\d*\]/', '', $out); - $out = preg_replace('/\[tag:langfile:\d*\]/', '', $out); + return $AVE_Template->get_config_vars($match[1]); + }, + $out + ); - // Убираем дубликат - $search[] = '[tag:maincontent]'; - $replace[] = ''; + // Убираем пустые теги + $out = preg_replace('/\[tag:doc:\d*\]/', '', $out); + $out = preg_replace('/\[tag:langfile:\d*\]/', '', $out); - // Парсим линк на версию для печати - $search[] = '[tag:printlink]'; - $replace[] = get_print_link(); + // Убираем дубликат + $search[] = '[tag:maincontent]'; + $replace[] = ''; - // Парсим тег версии системы - $search[] = '[tag:version]'; - $replace[] = APP_NAME . ' v' . APP_VERSION ; + // Парсим линк на версию для печати + $search[] = '[tag:printlink]'; + $replace[] = get_print_link(); - // Парсим тег кол-ва просмотра данного документа - $search[] = '[tag:docviews]'; - $replace[] = isset ($this->curentdoc->document_count_view) ? $this->curentdoc->document_count_view : ''; + // Парсим тег версии системы + $search[] = '[tag:version]'; + $replace[] = APP_NAME . ' v' . APP_VERSION ; - // Парсим тизер документа - $out = preg_replace_callback('/\[tag:teaser:(\d+)(|:\[(.*?)\])\]/', - function ($m) - { - return showteaser($m[1], $m[2]); - }, - $out - ); + // Парсим тег кол-ва просмотра данного документа + $search[] = '[tag:docviews]'; + $replace[] = isset ($this->curentdoc->document_count_view) ? $this->curentdoc->document_count_view : ''; - // Парсим аватар автора документа - if (defined('RUB_ID')) - $out = preg_replace_callback('/\[tag:docauthoravatar:(\d+)\]/', + // Парсим тизер документа + $out = preg_replace_callback('/\[tag:teaser:(\d+)(|:\[(.*?)\])\]/', function ($m) { - return getAvatar(intval($this->curentdoc->document_author_id), $m[1]); + return showteaser($m[1], $m[2]); }, $out ); - // Парсим теги языковых условий - if (defined('RUB_ID')) - { - $out = preg_replace('/\[tag:lang:([a-zA-Z0-9-_]+)\]/', 'curentdoc->document_lang == "$1") { ?>', $out); - } - else + // Парсим аватар автора документа + if (defined('RUB_ID')) + $out = preg_replace_callback('/\[tag:docauthoravatar:(\d+)\]/', + function ($m) + { + return getAvatar(intval($this->curentdoc->document_author_id), $m[1]); + }, + $out + ); + + // Парсим теги языковых условий + if (defined('RUB_ID')) { - $out = preg_replace('/\[tag:lang:([a-zA-Z0-9-_]+)\]/', '', $out); + $out = preg_replace('/\[tag:lang:([a-zA-Z0-9-_]+)\]/', 'curentdoc->document_lang == "$1") { ?>', $out); } + else + { + $out = preg_replace('/\[tag:lang:([a-zA-Z0-9-_]+)\]/', '', $out); + } - $out = str_replace('[tag:/lang]', '', $out); + $out = str_replace('[tag:/lang]', '', $out); - // Парсим хлебные крошки - if (preg_match('/\[tag:breadcrumb]/u', $out)) - { - $out = preg_replace_callback('/\[tag:breadcrumb\]/', 'get_breadcrumb', $out); - } + // Парсим хлебные крошки + if (preg_match('/\[tag:breadcrumb]/u', $out)) + { + $out = preg_replace_callback('/\[tag:breadcrumb\]/', 'get_breadcrumb', $out); + } + + // Парсим остальные теги основного шаблона + $out = str_replace($search, $replace, $out); - // Парсим остальные теги основного шаблона - $out = str_replace($search, $replace, $out); + // Парсим теги для combine.php + $out = preg_replace_callback('/\[tag:(css|js):([^ :\/]+):?(\S+)*\]/', array($this, '_parse_combine'), $out); - // Парсим теги для combine.php - $out = preg_replace_callback('/\[tag:(css|js):([^ :\/]+):?(\S+)*\]/', array($this, '_parse_combine'), $out); + // ЧПУ + $out = str_ireplace('"//"','"/"', str_ireplace('///','/', rewrite_link($out))); - // ЧПУ - $out = str_ireplace('"//"','"/"', str_ireplace('///','/', rewrite_link($out))); + unset ($search, $replace, $main_content); //Убираем данные - unset ($search, $replace, $main_content); //Убираем данные + $GLOBALS['block_generate']['DOCUMENT']['FETCH'] = Debug::endTime('DOC_' . $id); - $GLOBALS['block_generate']['DOCUMENT']['FETCH'] = Debug::endTime('DOC_' . $id); + if ($cacheCompile == false) + { + $this->setCompileContent($out); + } + } // Выводим собранный документ echo $out; diff --git a/class/class.database.php b/class/class.database.php index 9113a1e..89f42a4 100755 --- a/class/class.database.php +++ b/class/class.database.php @@ -1369,7 +1369,7 @@ * @param $cache_id * @return bool */ - public function cacheId($cache_id) + public function cacheId ($cache_id) { //-- Если это документ, то меняем расположение if (substr($cache_id, 0, 3) == 'doc') { @@ -1431,6 +1431,12 @@ return $cache_id = 'navigations/' . $cache_id[1]; } + //-- Если это скомпилированный документ, то меняем расположение + if (substr($cache_id, 0, 3) == 'cmp') { + $cache_id = (int) str_replace('cmp_', '', $cache_id); + return $cache_id = 'compile/' . (floor($cache_id / 1000)) . '/' . $cache_id; + } + if (substr_count($cache_id, '__') > 0) { return str_replace('__', '/', $cache_id); } @@ -1551,6 +1557,7 @@ $this->clearCache('fld_' . $doc_id); // Поля $this->clearCache('cmd_' . $doc_id); // Компиляция $this->clearCache('rqe_' . $doc_id); // Элемент запроса + $this->clearCache('cmp_' . $doc_id); // Скомпилированный документ } diff --git a/class/class.debug.php b/class/class.debug.php index 148d053..4942231 100644 --- a/class/class.debug.php +++ b/class/class.debug.php @@ -26,6 +26,8 @@ protected static $_debug = []; + public static $_document_content = ''; + public function __construct() { @@ -946,7 +948,7 @@ * * @return false|null|string|string[] */ - public static function _stat_get($type = 'get') + public static function _stat_get (string $type = 'get') { ob_start(); @@ -975,16 +977,57 @@ $stat = htmlspecialchars($stat); $stat = preg_replace('/(=>)/', '$1', $stat); $stat = '
'. $stat .'
'; + ob_end_clean(); return $stat; } + public static function getDocumentInfo () + { + global $AVE_Template; + + $_arr = [ + 'DOC' => '/admin/index.php?do=docs&action=edit&Id=', + 'RUBRIC' => '/admin/index.php?do=rubs&action=edit&Id=', + 'BLOCKS' => '/admin/index.php?do=blocks&action=edit&id=', + 'SYSBLOCK' => '/admin/index.php?do=sysblocks&action=edit&id=', + 'REQUESTS' => '/admin/index.php?do=request&action=edit&Id=', + 'NAVIAGTIONS' => '/admin/index.php?do=navigation&action=templates&navigation_id=' + ]; + + $doc = get_document($_REQUEST['id']); + + $_edit = []; + + $_edit['DOC'][$doc['Id']] = $_arr['DOC'] . $doc['Id']; + $_edit['RUBRIC'][$doc['rubric_id']] = $_arr['RUBRIC'] . $doc['rubric_id']; + + foreach ($GLOBALS['block_generate'] AS $k => $v) + { + if (! in_array($k, array_keys($_arr))) { + continue; + } + + foreach ($v as $key => $value) { + $_edit[$k][$key] = $_arr[$k] . $key; + } + } + + $AVE_Template->assign('edit', $_edit); + $AVE_Template->assign('session', session_id()); + + $return = $AVE_Template->fetch(BASE_DIR . '/lib/debug/debug.tpl'); + + return $return; + } + + /** * @return string */ - public static function displayInfo () + public static function displayInfo (): string { global $AVE_DB; @@ -1014,6 +1057,7 @@
  • MySQL
  • Trace
  • Debug
  • +
  • Edit
  • '; $out .= PHP_EOL; @@ -1113,6 +1157,77 @@ $out .= implode('', self::$_debug); $out .= ''; + $out .= PHP_EOL; + $out .= ''; + + $out .= PHP_EOL; + $out .= ''; + + return $out; + } + + /** + * @return string + */ + public static function displayInfoLight (): string + { + global $AVE_DB; + + $out = PHP_EOL; + $out .= ''; + $out .= PHP_EOL; + $out .= ''; + $out .= PHP_EOL; + $out .= ''; + $out .= PHP_EOL; + $out .= '
    '; + $out .= PHP_EOL; + $out .= ' +
    + + '; + $out .= PHP_EOL; + $out .= '
    ' . PHP_EOL; + $out .= 'Time generation: ' . self::getStatistic('time') . ' sec'; + $out .= '
    '; + $out .= 'Memory usage: ' . self::getStatistic('memory'); + $out .= '
    '; + $out .= 'Memory peak usage: ' . self::getStatistic('peak'); + $out .= '
    '; + $out .= 'Real SQL Queries: ' . $AVE_DB->DBProfilesGet('count') . ' for ' . $AVE_DB->DBProfilesGet('time') . ' sec'; + $out .= '
    '; + $out .= 'All SQL Queries: ' . count($AVE_DB->_query_list); + $out .= '
    '; + + $out .= PHP_EOL; + $out .= ''; + + $out .= PHP_EOL; + $out .= ''; + + $out .= PHP_EOL; + $out .= ''; + + $out .= PHP_EOL; + $out .= ''; + $out .= PHP_EOL; $out .= '
    '; diff --git a/class/class.navigation.php b/class/class.navigation.php index 9dfe5b1..73d2b04 100755 --- a/class/class.navigation.php +++ b/class/class.navigation.php @@ -199,13 +199,15 @@ " . PREFIX . "_navigation WHERE navigation_id = '" . $navigation_id . "' + OR + alias = '" . $navigation_id . "' ")->FetchRow(); // Формируем список групп пользователей $row->user_group = explode(',', $row->user_group); // Формируем ряд переменных для использования в шаблоне и отображаем форм с данными для редактирования - $AVE_Template->assign('nid', $navigation_id); + $AVE_Template->assign('nid', $row->navigation_id); $AVE_Template->assign('navigation', $row); $AVE_Template->assign('groups', $AVE_User->userGroupListGet()); $AVE_Template->assign('form_action', 'index.php?do=navigation&action=templates&sub=save&navigation_id=' . $navigation_id . '&cp=' . SESSION); diff --git a/class/class.request.php b/class/class.request.php index a9dfbd3..01e6bd5 100644 --- a/class/class.request.php +++ b/class/class.request.php @@ -336,6 +336,8 @@ " . PREFIX . "_request WHERE Id = '" . $request_id . "' + OR + request_alias = '" . $request_id . "' "); if ($sql->_result->num_rows == 0) @@ -361,10 +363,13 @@ array_push($paginations, $pages); // Передаем данные в шаблон и отображаем страницу с редактированием запроса + if (! isset($_REQUEST['rubric_id'])) + $_REQUEST['rubric_id'] = $row->rubric_id; + $AVE_Template->assign('row', $row); - $AVE_Template->assign('rid', $request_id); + $AVE_Template->assign('rid', $row->Id); $AVE_Template->assign('paginations', $paginations); - $AVE_Template->assign('formaction', 'index.php?do=request&action=edit&sub=save&Id=' . $request_id . '&cp=' . SESSION); + $AVE_Template->assign('formaction', 'index.php?do=request&action=edit&sub=save&Id=' . $row->Id . '&cp=' . SESSION); $AVE_Template->assign('content', $AVE_Template->fetch('request/form.tpl')); break; diff --git a/class/class.settings.php b/class/class.settings.php index 6140ed4..2e88e73 100755 --- a/class/class.settings.php +++ b/class/class.settings.php @@ -777,6 +777,10 @@ $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; @@ -842,6 +846,10 @@ $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; diff --git a/class/class.sysblocks.php b/class/class.sysblocks.php index 798e67b..dad5e76 100644 --- a/class/class.sysblocks.php +++ b/class/class.sysblocks.php @@ -378,7 +378,7 @@ { global $AVE_DB, $AVE_Template; - $sysblock_id = (int)$_REQUEST['id']; + $sysblock_id = $_REQUEST['id']; $sql = " SELECT @@ -387,11 +387,13 @@ " . PREFIX . "_sysblocks WHERE id = '" . $sysblock_id . "' + OR + sysblock_alias = '" . $sysblock_id . "' "; $row = $AVE_DB->Query($sql)->FetchAssocArray(); - $AVE_Template->assign('sid', $sysblock_id); + $AVE_Template->assign('sid', $row['id']); $AVE_Template->assign('groups', self::getGroups()); if ((isset($_REQUEST['sysblock_visual']) && $_REQUEST['sysblock_visual'] == 1) || $row['sysblock_visual'] == 1) diff --git a/functions/func.parserequest.php b/functions/func.parserequest.php index 704c3b5..8bf0404 100755 --- a/functions/func.parserequest.php +++ b/functions/func.parserequest.php @@ -874,7 +874,7 @@ " . (isset($params['USER_FROM']) ? $params['USER_FROM'] : '') . " " . PREFIX . "_documents AS a " . implode(' ', $request_join) . " - " . (isset($params['USER_JOIN']) ? $params['USER_JOIN'] : '') . " + " . (isset($params['USER_JOIN']) ? $params['USER_FROM'] : '') . " WHERE " . $request_where_str . " GROUP BY a.Id @@ -1198,6 +1198,185 @@ } + + function parse_request ($id, $params = []) + { + global $AVE_Core; + + // Получаем информацию о запросе + $request = request_get_settings($id); + + // Фиксируем время начала генерации запроса + Debug::startTime('request_' . $id); + + // Элементы запроса + $rows = $params['ROWS']; + + //-- Обрабатываем шаблоны элементов + $items = ''; + + //-- Счетчик + $x = 0; + + //-- Общее число элементов + $items_count = $num_items= count($rows); + + global $req_item_num, $use_cache, $request_id, $request_changed, $request_changed_elements; + + $use_cache = $request->request_cache_elements; + + $request_id = $request->Id; + + $request_changed = $request->request_changed; + $request_changed_elements = $request->request_changed_elements; + + $limit = (isset($params['LIMIT']) && is_numeric($params['LIMIT']) && $params['LIMIT'] > '') + ? (int)$params['LIMIT'] + : (int)$request->request_items_per_page; + + // Кол-во страниц + $num_pages = ($limit > 0) + ? ceil($num_items / $limit) + : 0; + + Debug::startTime('ELEMENTS_ALL'); + + foreach ($rows AS $row) + { + $x++; + $last_item = ($x == $items_count ? true : false); + $item_num = $x; + $req_item_num = $item_num; + + Debug::startTime('ELEMENT_' . $item_num); + + $item = showrequestelement($row, $request->request_template_item); + + $GLOBALS['block_generate']['REQUESTS'][$id]['ELEMENTS'][$item_num] = Debug::endTime('ELEMENT_' . $item_num); + + $item = str_replace('[tag:item_num]', $item_num, $item); + $item = '<'.'?php $item_num='.var_export($item_num,1).'; $last_item='.var_export($last_item,1).'?'.'>'.$item; + $item = '<'.'?php $req_item_id = ' . $row . '; ?>' . $item; + $item = str_replace('[tag:if_first]', '<'.'?php if(isset($item_num) && $item_num===1) { ?'.'>', $item); + $item = str_replace('[tag:if_not_first]', '<'.'?php if(isset($item_num) && $item_num!==1) { ?'.'>', $item); + $item = str_replace('[tag:if_last]', '<'.'?php if(isset($last_item) && $last_item) { ?'.'>', $item); + $item = str_replace('[tag:if_not_last]', '<'.'?php if(isset($item_num) && !$last_item) { ?'.'>', $item); + $item = preg_replace('/\[tag:if_every:([0-9-]+)\]/u', '<'.'?php if(isset($item_num) && !($item_num % $1)){ '.'?'.'>', $item); + $item = preg_replace('/\[tag:if_not_every:([0-9-]+)\]/u', '<'.'?php if(isset($item_num) && ($item_num % $1)){ '.'?'.'>', $item); + $item = str_replace('[tag:/if]', '<'.'?php } ?>', $item); + $item = str_replace('[tag:if_else]', '<'.'?php }else{ ?>', $item); + $items .= $item; + + Registry::remove('documents', $row); + Registry::remove('fields', $row); + Registry::remove('fields_param', $row); + } + + $GLOBALS['block_generate']['REQUESTS'][$id]['ELEMENTS']['ALL'] = Debug::endTime('ELEMENTS_ALL'); + + // Приступаем к обработке шаблона + $main_template = $request->request_template_main; + + // ============ Обрабатываем теги запроса ============ // + + //-- Парсим теги визуальных блоков + $main_template = preg_replace_callback('/\[tag:block:([A-Za-z0-9-_]{1,20}+)\]/', 'parse_block', $main_template); + + //-- Парсим теги системных блоков + $main_template = preg_replace_callback('/\[tag:sysblock:([A-Za-z0-9-_]{1,20}+)\]/', 'parse_sysblock', $main_template); + + //-- Дата + $main_template = preg_replace_callback('/\[tag:date:([a-zA-Z0-9-. \/]+)\]/', + function ($match) use ($AVE_Core) + { + return translate_date(date($match[1], $AVE_Core->curentdoc->document_published)); + }, + $main_template + ); + + $str_replace = [ + //-- ID Документа + '[tag:docid]' => $AVE_Core->curentdoc->Id, + //-- ID Автора + '[tag:docauthorid]' => $AVE_Core->curentdoc->document_author_id, + //-- Имя автора + '[tag:docauthor]' => get_username_by_id($AVE_Core->curentdoc->document_author_id), + //-- Время - 1 день назад + '[tag:humandate]' => human_date($AVE_Core->curentdoc->document_published), + //-- Дата создания + '[tag:docdate]' => pretty_date(strftime(DATE_FORMAT, $AVE_Core->curentdoc->document_published)), + //-- Время создания + '[tag:doctime]' => pretty_date(strftime(TIME_FORMAT, $AVE_Core->curentdoc->document_published)), + //-- Домен + '[tag:domain]' => getSiteUrl(), + //-- Заменяем тег пагинации на пагинацию + '[tag:pages]' => $pagination, + //-- Общее число элементов запроса + '[tag:doctotal]' => $num_items, + //-- Показано элементов запроса на странице + '[tag:doconpage]' => $x, + //-- Номер страницы пагинации + '[tag:pages:curent]' => get_current_page('page'), + //-- Общее кол-во страниц пагинации + '[tag:pages:total]' => $num_pages, + //-- Title + '[tag:pagetitle]' => stripslashes(htmlspecialchars_decode($AVE_Core->curentdoc->document_title)), + //-- Alias + '[tag:alias]' => (isset($AVE_Core->curentdoc->document_alias) ? $AVE_Core->curentdoc->document_alias : '') + ]; + + $main_template = str_replace(array_keys($str_replace), array_values($str_replace), $main_template); + + //-- Возвращаем параметр документа из БД + $main_template = preg_replace_callback('/\[tag:doc:([a-zA-Z0-9-_]+)\]/u', + function ($match) use ($row) + { + return isset($row->{$match[1]}) + ? $row->{$match[1]} + : null; + }, + $main_template + ); + + //-- Если пришел вызов на активацию языковых файлов + $main_template = preg_replace_callback('/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u', + function ($match) + { + global $AVE_Template; + + return $AVE_Template->get_config_vars($match[1]); + }, + $main_template + ); + + //-- Вставляем элементы запроса + $return = str_replace('[tag:content]', $items, $main_template); + + unset ($items, $main_template, $str_replace, $pagination); + + //-- Парсим тег [hide] + $return = parse_hide($return); + + //-- Абсолютный путь + $return = str_replace('[tag:path]', ABS_PATH, $return); + + //-- Путь до папки шаблона + $return = str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', $return); + + //-- Парсим модули + $return = $AVE_Core->coreModuleTagParse($return); + + //-- Фиксируем время генерации запроса + $GLOBALS['block_generate']['REQUESTS'][$id]['TIME'] = Debug::endTime('request_' . $id); + + // Статистика + if ($request->request_show_statistic) + $return .= "

    Найдено: $num_items
    Показано: $items_count
    Время генерации: " . Debug::endTime('request_' . $id) . " сек
    Пиковое значение: ".number_format(memory_get_peak_usage()/1024, 0, ',', ' ') . ' Kb
    '; + + return $return; + } + + /** * Функция получения содержимого поля для обработки в шаблоне запроса *
    diff --git a/inc/config.php b/inc/config.php
    index f602e5c..fde79fd 100755
    --- a/inc/config.php
    +++ b/inc/config.php
    @@ -303,7 +303,7 @@
     		'DESCR'			=> 'Вывод общей статистики публичной части',
     		'DEFAULT'		=> 'off',
     		'TYPE'			=> 'dropdown',
    -		'VARIANT'		=> ['off', 'light', 'full']
    +		'VARIANT'		=> ['off', 'light', 'full', 'dev']
     	];
     
     	//-- Вывод общей статистики в административной части
    @@ -406,6 +406,22 @@
     		'VARIANT'		=> ''
     	];
     
    +	//-- Кэширование всей страницы
    +	$GLOBALS['CMS_CONFIG']['_CONST_CACHE']['CACHE_DOC_FULL'] = [
    +		'DESCR'			=> 'Кэширование всей страницы',
    +		'DEFAULT'		=> false,
    +		'TYPE'			=> 'bool',
    +		'VARIANT'		=> ''
    +	];
    +
    +	//-- Кэширование всей страницы (для админа)
    +	$GLOBALS['CMS_CONFIG']['_CONST_CACHE']['CACHE_DOC_FULL_ADMIN'] = [
    +		'DESCR'			=> 'Кэширование всей страницы (для админа)',
    +		'DEFAULT'		=> false,
    +		'TYPE'			=> 'bool',
    +		'VARIANT'		=> ''
    +	];
    +
     	//-- Кэширование информацию о документе и его полях
     	$GLOBALS['CMS_CONFIG']['_CONST_CACHE']['SITEMAP_CACHE_LIFETIME'] = [
     		'DESCR'			=> 'Время жизни кеша для карты сайта',
    diff --git a/inc/init.php b/inc/init.php
    index 105daeb..2610531 100644
    --- a/inc/init.php
    +++ b/inc/init.php
    @@ -76,6 +76,11 @@
     		}
     	}
     
    +	$_GET		= add_slashes($_GET);
    +	$_POST		= add_slashes($_POST);
    +	$_REQUEST	= array_merge($_POST, $_GET);
    +	$_COOKIE	= add_slashes($_COOKIE);
    +
     	unsetGlobals();
     
     	if (isset($HTTP_POST_VARS))
    @@ -108,11 +113,6 @@
     		return $array;
     	}
     
    -	$_GET		= add_slashes($_GET);
    -	$_POST		= add_slashes($_POST);
    -	$_REQUEST	= array_merge($_POST, $_GET);
    -	$_COOKIE	= add_slashes($_COOKIE);
    -
     	function isSSL()
     	{
     		if (isset($_SERVER['HTTPS']))
    diff --git a/index.php b/index.php
    index e1da623..6625e1c 100755
    --- a/index.php
    +++ b/index.php
    @@ -35,7 +35,7 @@
     	//-- Подключаем файл определения мобильных устройств
     	//-- далее пользуемся $MobileDetect
     	require_once (BASE_DIR . '/lib/mobile_detect/Mobile_Detect.php');
    -	$MobileDetect = new Mobile_Detect;
    +	$MDetect = new Mobile_Detect;
     
     	$init_start = microtime();
     
    @@ -44,6 +44,8 @@
     
     	$GLOBALS['block_generate']['INIT']['END'] = number_format(microtime_diff($init_start, microtime()), 3, ',', ' ') . ' sec';
     
    +	Debug::startTime('CODEEND');
    +
     	//-- Проверяем нет ли в запросе папки UPLOADS_DIR
     	//-- подключаем файл для работы thumbsnail
     	if (strpos ($_SERVER['REQUEST_URI'], ABS_PATH . UPLOAD_DIR . '/') === 0)
    @@ -98,6 +100,7 @@
     	}
     
     	//-- Собираем страницу
    +
     	$AVE_Core->coreSiteFetch(get_current_document_id());
     
     	Debug::startTime('CONTENT');
    @@ -109,8 +112,14 @@
     	else
     		ob_start();
     
    +	Debug::$_document_content = $content;
    +
    +	Debug::startTime('EVALCONTENT');
    +
     	eval (' '.'?>' . $content . '