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_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 .= '' . PHP_EOL;
+ $out .= self::getDocumentInfo();
+ $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 .= '
+
+
+ - Timers
+ - Blocks
+ - Content
+ - Debug
+ - Document
+
+ ';
+ $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 .= ' ' . PHP_EOL;
+ $out .= 'Blocks:';
+ $out .= self::getStatistic('blocks');
+ $out .= ' ';
+
+ $out .= PHP_EOL;
+ $out .= ' ' . PHP_EOL;
+ $out .= ' ' . htmlspecialchars(self::$_document_content) . ' ';
+ $out .= ' ';
+
+ $out .= PHP_EOL;
+ $out .= ' ' . PHP_EOL;
+ $out .= implode('', self::$_debug);
+ $out .= ' ';
+
+ $out .= PHP_EOL;
+ $out .= ' ' . PHP_EOL;
+ $out .= self::getDocumentInfo();
+ $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 . ''.'php ');
+ $GLOBALS['block_generate']['DOCUMENT']['EVALCONTENT'] = Debug::endTime('EVALCONTENT');
+
$render = ob_get_clean();
unset ($content);
@@ -155,23 +164,8 @@
exit;
}
- //-- Тут заменяем [tag:rubheader]
- //-- на собранный $GLOBALS["user_header"]
- $rubheader = (empty($GLOBALS['user_header'])
- ? ''
- : implode(chr(10), $GLOBALS['user_header']));
-
- //-- Тут заменяем [tag:rubfooter]
- //-- на собранный $GLOBALS["user_footer"]
- $rubfooter = (empty($GLOBALS['user_footer'])
- ? ''
- : implode(chr(10), $GLOBALS['user_footer']));
-
- $render = str_replace(['[tag:rubheader]', '[tag:rubfooter]'], [$rubheader, $rubfooter], $render);
-
- unset ($rubheader, $rubfooter);
-
$GLOBALS['block_generate']['DOCUMENT']['CONTENT'] = Debug::endTime('CONTENT');
+ $GLOBALS['block_generate']['INIT']['CODEEND'] = Debug::endTime('CODEEND');
//-- Вывод конечного результата
output_compress($render);
|