HTTP Error 404: Page not found'; /** * Сообщение об ошибке, если для рубрики не найден шаблон * * @public string */ public $_rubric_template_empty = '

Ошибка


Не задан шаблон рубрики.'; /** * Сообщение об ошибке, если документ запрещен к показу * * @public string */ public $_doc_not_published = 'Запрашиваемый документ запрещен к публикации.'; /** * Сообщение об ошибке, если модуль не может быть загружен * * @public string */ public $_module_error = 'Запрашиваемый модуль не может быть загружен.'; /** * Сообщение об ошибке, если модуль, указанный в шаблоне, не установлен в системе * * @public string */ public $_module_not_found = 'Запрашиваемый модуль не найден.'; function _getRequestModule ($name = null) { foreach ($this->install_modules as $k => $v) if ($v['ModuleSysName'] == $name && $v['ModuleStatus'] == 1) return true; return false; } /** * Получаем шаблон документа * * @param $rubric_id * @param $template_id * * @return bool|null|string */ function _getMainTemplate($rubric_id, $template_id) { global $AVE_DB; $return = null; if (is_numeric($template_id)) { $cache_file = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/include/templates/' . $template_id . '/template.inc'; // Если включен DEV MODE, то отключаем кеширование if (defined('DEV_MODE') AND DEV_MODE) $cache_file = null; if (! is_dir(dirname($cache_file))) @mkdir(dirname($cache_file), 0766, true); // Если файл есть и он не пустой используем его if (file_exists($cache_file) && filesize($cache_file)) { $return = file_get_contents($cache_file); } // Иначе лезем в БД и достаем шаблон else { $return = $AVE_DB->Query(" SELECT template_text FROM " . PREFIX . "_templates WHERE Id = '" . $template_id . "' LIMIT 1 ")->GetCell(); $return = stripslashes($return); // Сохраняем в файл if ($cache_file) file_put_contents($cache_file, $return); } } return $return; } /** * Получение основных настроек сисблока * * @param string $param параметр настройки, если не указан - все параметры * @return mixed */ function _requestGet($id, $param = '') { global $AVE_DB; static $request = null; if ($request === null) { $request = $AVE_DB->Query(" SELECT * FROM " . PREFIX . "_request WHERE " . (is_numeric($id) ? 'Id' : 'request_alias') . " = '" . $id . "' ")->FetchAssocArray(); } if ($param == '') return $request; return isset($request[$param]) ? $request[$param] : null; } /** * Метод, предназначенный для получения шаблонов * * @param int $rubric_id идентификатор рубрики * @param string $template шаблон * @param string $fetched шаблон модуля * @return string */ function _coreDocumentTemplateGet($rubric_id = null, $template = null, $fetched = null, $template_id = null) { global $AVE_DB; // Если выводится только содержимое модуля или это новое окно (например страница для печати), // просто возвращаем содержимое. if (defined('ONLYCONTENT') || (isset ($_REQUEST['pop']) && $_REQUEST['pop'] == 1)) { $out = '[tag:maincontent]'; } else { // В противном случае, если в качестве аргумента передан шаблон модуля, возвращаем его. if (! empty($fetched)) { $out = $fetched; } else { // В противном случае, если в качестве аргумента передан общий шаблон, возвращаем его if (! empty($template)) { $out = $template; } else // В противном случае, если аргументы не определены, тогда проверяем { // Если для текущего документа в свойстве класса $this->curentdoc определен шаблон, тогда возвращаем его if (! empty ($this->curentdoc->template_text)) { $out = stripslashes($this->curentdoc->template_text); unset($this->curentdoc->template_text); } else { // В противном случае, если не указан идентификатор рубрики if (empty ($rubric_id)) { // Получаем id документа из запроса $_REQUEST['id'] = (isset ($_REQUEST['id']) && is_numeric($_REQUEST['id'])) ? $_REQUEST['id'] : 1; // Выполняем запрос к БД на получение id рубрики на основании id документа $rubric_id = $AVE_DB->Query(" SELECT rubric_id FROM " . PREFIX . "_documents WHERE Id = '" . $_REQUEST['id'] . "' LIMIT 1 ")->GetCell(); // Если id рубрики не найден, возвращаем пустую строку if (! $rubric_id) return ''; } // Выполняем запрос к БД на получение основного шаблона, а также шаблона рубрики $tpl = $this->_getMainTemplate($rubric_id, $template_id); // Если запрос выполнился с нулевым результатом, возвращаем пустую строку $out = $tpl ? stripslashes($tpl) : ''; } } } } // получаем из шаблона системный тег, определяющий название темы дизайна $match = array(); preg_match('/\[tag:theme:(\w+)]/', $out, $match); define('THEME_FOLDER', empty ($match[1]) ? DEFAULT_THEME_FOLDER : $match[1]); $out = preg_replace('/\[tag:theme:(.*?)]/', '', $out); // Если пришел вызов на активацию языковых файлов $out = preg_replace_callback( '/\[tag:language]/', function () { global $AVE_Template; $lang_file = BASE_DIR . '/templates/' . THEME_FOLDER . '/lang/' . $_SESSION['user_language'] . '.txt'; $AVE_Template->config_load($lang_file); $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); }, $out ); return $out; } /** * Метод, предназначенный для получения шаблона модуля * * @return string */ function _coreModuleTemplateGet() { global $AVE_DB; if (isset($_REQUEST['module']) && ! preg_match('/^[A-Za-z0-9-_]{1,20}$/i', $_REQUEST['module'])) return ''; // Если папка, с запрашиваемым модулем не существует, выполняем редирект // на главную страницу и отображаем сообщение с ошибкой if (! is_dir(BASE_DIR . '/modules/' . $_REQUEST['module'])) { echo ''; $out = $this->_module_not_found; } // В противном случае else { // Выполняем запрос к БД на получение списка общих шаблонов имеющиюся в системе // и шаблоне, который установлен для данного модуля // Например, в системе есть шаблоны Template_1 и Template_2, а для модуля установлен Template_3 $out = $AVE_DB->Query(" SELECT tmpl.template_text FROM " . PREFIX . "_templates AS tmpl LEFT JOIN " . PREFIX . "_module AS mdl ON tmpl.Id = mdl.ModuleTemplate WHERE ModuleSysName = '" . $_REQUEST['module'] . "' ")->GetCell(); // Если шаблон, установленный для модуля не найден в системе, принудительно устанавливаем для него // первый шаблон (id=1) if (empty ($out)) { $out = $AVE_DB->Query(" SELECT template_text FROM " . PREFIX . "_templates WHERE Id = '1' LIMIT 1 ")->GetCell(); } } // Возвращаем информацию о полученном шаблоне return stripslashes($out); } /** * Метод, предназначенный для получения прав доступа к документам рубрики * * @param int $rubrik_id идентификатор рубрики */ function _coreRubricPermissionFetch($rubrik_id = '') { global $AVE_DB; unset ($_SESSION[$rubrik_id . '_docread']); // Если для документа уже получены права доступа, тогда if (!empty ($this->curentdoc->rubric_permission)) { // Формируем массив с правами доступа $rubric_permissions = explode('|', $this->curentdoc->rubric_permission); // Циклически обрабатываем сформированный массив и создаем в сессии соответсвующие переменные foreach ($rubric_permissions as $rubric_permission) { if (!empty ($rubric_permission)) { $_SESSION[$rubrik_id . '_' . $rubric_permission] = 1; } } } // В противном случае else { // Выполняем запрос к БД на получение списка прав для данного документа $sql = $AVE_DB->Query(" SELECT rubric_permission FROM " . PREFIX . "_rubric_permissions WHERE rubric_id = '" . $rubrik_id . "' AND user_group_id = '" . UGROUP . "' "); // Обрабатываем полученные данные и создаем в сессии соответсвующие переменные while ($row = $sql->FetchRow()) { $row->rubric_permission = explode('|', $row->rubric_permission); foreach ($row->rubric_permission as $rubric_permission) { if (! empty($rubric_permission)) { $_SESSION[$rubrik_id . '_' . $rubric_permission] = 1; } } } } } /** * Метод, предназначенный для обработки события 404 Not Found, т.е. когда страница не найдена. * * @return unknown */ function _coreErrorPage404() { global $AVE_DB; // Выполняем запрос к БД на проверку существования страницы, которая содержит информацию о том, что // запрашиваемая страница не найдена $available = $AVE_DB->Query(" SELECT COUNT(*) FROM " . PREFIX . "_documents WHERE Id = '" . PAGE_NOT_FOUND_ID . "' LIMIT 1 ")->GetCell(); // Если такая страница в БД существует, выполняем переход на страницу с ошибкой if ($available) { header('Location:' . ABS_PATH . 'index.php?id=' . PAGE_NOT_FOUND_ID); } // Если не существует, тогда просто выводим текст, определенный в свойстве _doc_not_found else { echo $this->_doc_not_found; } exit; } /** * Метод, предназначенный для проверки существования документа в БД * * @param int $document_id - id документа * @param int $user_group - группа пользователя * @return boolean */ function _coreCurrentDocumentFetch($document_id = 1, $user_group = 2) { global $AVE_DB; // Выполняем составной запрос к БД на получение информации о запрашиваемом документе $this->curentdoc = $AVE_DB->Query(" SELECT doc.*, rubric_permission, rubric_template, rubric_header_template, rubric_footer_template, rubric_meta_gen, template_text, other.template FROM " . PREFIX . "_documents AS doc JOIN " . PREFIX . "_rubrics AS rub ON rub.Id = doc.rubric_id JOIN " . PREFIX . "_templates AS tpl ON tpl.Id = rubric_template_id JOIN " . PREFIX . "_rubric_permissions AS prm ON doc.rubric_id = prm.rubric_id LEFT JOIN " . PREFIX . "_rubric_templates AS other ON doc.rubric_id = other.rubric_id AND doc.rubric_tmpl_id = other.id WHERE user_group_id = '" . $user_group . "' AND doc.Id = '" . $document_id . "' LIMIT 1 ")->FetchRow(); if ($this->curentdoc->rubric_tmpl_id != 0) { $this->curentdoc->rubric_template = (($this->curentdoc->template != '') ? $this->curentdoc->template : $this->curentdoc->rubric_template); unset($this->curentdoc->template); } // Возвращаем 1, если документ найден, либо 0 в противном случае return (isset($this->curentdoc->Id) && $this->curentdoc->Id == $document_id); } /** * Метод, предназначенный для получения содержимого страницы с 404 ошибкой * * * @param int $page_not_found_id * @param int $user_group * @return int/boolean */ function _corePageNotFoundFetch($page_not_found_id = 2, $user_group = 2) { global $AVE_DB; // Выполняем запрос к БД на получение полной информации о странице с 404 ошибкой, включая // права доступа, шаблон рубрики и основной шаблон сайта $this->curentdoc = $AVE_DB->Query(" SELECT doc.*, rubric_permission, rubric_template, rubric_header_template, rubric_footer_template, rubric_meta_gen, template_text FROM " . PREFIX . "_documents AS doc JOIN " . PREFIX . "_rubrics AS rub ON rub.Id = doc.rubric_id JOIN " . PREFIX . "_templates AS tpl ON tpl.Id = rubric_template_id JOIN " . PREFIX . "_rubric_permissions AS prm ON doc.rubric_id = prm.rubric_id WHERE user_group_id = '" . $user_group . "' AND doc.Id = '" . $page_not_found_id . "' LIMIT 1 ")->FetchRow(); return (isset($this->curentdoc->Id) && $this->curentdoc->Id == $page_not_found_id); } /** * Метод, предназначенный для получения МЕТА-тегов для различных модулей. * ToDo * @return boolean */ function _coreModuleMetatagsFetch() { global $AVE_DB; // Если в запросе не пришел параметр module, заврешаем работу if (! isset($_REQUEST['module'])) return false; $this->curentdoc = $AVE_DB->Query(" SELECT 1 AS Id, 0 AS document_published, document_meta_robots, document_meta_keywords, document_meta_description, document_title FROM " . PREFIX . "_documents WHERE Id = 1 ")->FetchRow(); return (isset($this->curentdoc->Id) && $this->curentdoc->Id == 1); } /** * Метод, предназначенный для определения статуса документа (доступен ли он к публикации). * * @return int/boolean */ function _coreDocumentIsPublished() { //Контроль даты: Использовать/Не использовать if (get_settings('use_doctime') != 0) { if (!empty ($this->curentdoc) // документ есть && $this->curentdoc->Id != PAGE_NOT_FOUND_ID // документ не сообщение ошибки 404 && $this->curentdoc->document_deleted == 1 // пометка удаления ) { // Если пользователь авторизован в Панели управления или имеет полные права на просмотр документа, тогда if (isset ($_SESSION['adminpanel']) || isset ($_SESSION['alles'])) { // Отображаем информационное окно с сообщением, определенным в свойстве _doc_not_published display_notice($this->_doc_not_published); } else // В противном случае фиксируем ошибку { $this->curentdoc = false; } } } else { if (! empty($this->curentdoc) // документ есть && $this->curentdoc->Id != PAGE_NOT_FOUND_ID // документ не сообщение ошибки 404 && $this->curentdoc->document_deleted == 1 // пометка удаления ) { // Если пользователь авторизован в Панели управления или имеет полные права на просмотр документа, тогда if (isset ($_SESSION['adminpanel']) || isset ($_SESSION['alles'])) { // Отображаем информационное окно с сообщением, определенным в свойстве _doc_not_published display_notice($this->_doc_not_published); } else // В противном случае фиксируем ошибку { $this->curentdoc = false; } } } return (! empty($this->curentdoc)); } /** * Метод парсинга тега [tag:(css|js):files] * для вывода css/js-файлов в шаблоне через combine.php * * @param array $tag параметры тега * @return string что выводить в шаблоне */ function _parse_combine($tag) { // тип тега (css|js) $type = $tag[1]; // имена файлов $files = explode(',',$tag[2]); // определяем путь. если указан - то считаем от корня, если нет, то в /[tag:mediapath]/css|js/ if ($tag[3]) { $path = '/' . trim($tag[3],'/') . '/'; } else { $path = '/templates/' . THEME_FOLDER . '/' . $type . '/'; } // уровень вложенности $level = substr_count($path,'/') - 1; // копируем combine.php, если он поменялся или отсутствует $dest_stat = stat(BASE_DIR . $path . 'combine.php'); $source_stat = stat(BASE_DIR . '/lib/combine/combine.php'); if (! file_exists(BASE_DIR . $path . 'combine.php') || $source_stat[9] > $dest_stat[9]) { @copy(BASE_DIR . '/lib/combine/combine.php', BASE_DIR . $path . 'combine.php'); } // удаляем из списка отсутствующие файлы foreach($files as $key=>$file) { if (! file_exists(BASE_DIR . $path . $file)) unset($files[$key]); } if ($files) { $combine = $path . 'combine.php?level=' . $level . '&' . $type . '=' . implode(',', $files); $combine = @str_replace('//','/',$combine); } return $combine; } /** * @param $main_content * @param $id * @param $rubTmpl * * @return mixed|null|string|string[] */ function _main_content ($rubTmpl) { Debug::startTime('MAINCONTENT'); // Проверяем теги полей в шаблоне рубрики на условие != '' if (defined('USE_GET_FIELDS') && USE_GET_FIELDS) { $main_content = preg_replace("/\[tag:if_notempty:fld:([a-zA-Z0-9-_]+)\]/u", '<'.'?php if((htmlspecialchars(get_field(\'$1\'), ENT_QUOTES)) != \'\') { '.'?'.'>', $rubTmpl); $main_content = preg_replace("/\[tag:if_empty:fld:([a-zA-Z0-9-_]+)\]/u", '<'.'?php if((htmlspecialchars(get_field(\'$1\'), ENT_QUOTES)) == \'\') { '.'?'.'>', $main_content); } else { $main_content = preg_replace("/\[tag:if_notempty:fld:([a-zA-Z0-9-_]+)\]/u", '<'.'?php if((htmlspecialchars(document_get_field(\'$1\'), ENT_QUOTES)) != \'\') { '.'?'.'>', $rubTmpl); $main_content = preg_replace("/\[tag:if_empty:fld:([a-zA-Z0-9-_]+)\]/u", '<'.'?php if((htmlspecialchars(document_get_field(\'$1\'), ENT_QUOTES)) == \'\') { '.'?'.'>', $main_content); } $main_content = str_replace('[tag:if:else]', '', $main_content); $main_content = str_replace('[tag:/if]', '', $main_content); // Парсим элементы полей $main_content = preg_replace_callback( '/\[tag:fld:([a-zA-Z0-9-_]+)\]\[([0-9]+)]\[([0-9]+)]/', function($m) { return get_field_element($m[1], $m[2], $m[3], $this->curentdoc->Id); }, $main_content ); // Парсим теги полей документа в шаблоне рубрики $main_content = preg_replace_callback('/\[tag:fld:([a-zA-Z0-9-_]+)(|[:(\d)])+?\]/', 'document_get_field', $main_content); // Повторно парсим элементы полей $main_content = preg_replace_callback( '/\[tag:fld:([a-zA-Z0-9-_]+)\]\[([0-9]+)]\[([0-9]+)]/', function($m) { return get_field_element($m[1], $m[2], $m[3], $this->curentdoc->Id); }, $main_content ); // Повторно парсим теги полей документа в шаблоне рубрики $main_content = preg_replace_callback('/\[tag:fld:([a-zA-Z0-9-_]+)(|[:(\d)])+?\]/', 'document_get_field', $main_content); // Watermarks $main_content = preg_replace_callback('/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/', 'watermarks', $main_content); // Thumbnail $main_content = preg_replace_callback('/\[tag:([r|c|f|t|s]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $main_content); // Возвращаем поле из БД документа $main_content = preg_replace_callback('/\[tag:doc:([a-zA-Z0-9-_]+)\]/u', function ($match) { return isset($this->curentdoc->{$match[1]}) ? $this->curentdoc->{$match[1]} : null; }, $main_content ); // Если пришел вызов на активацию языковых файлов $main_content = preg_replace_callback( '/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u', function ($match) { global $AVE_Template; return $AVE_Template->get_config_vars($match[1]); }, $main_content ); // парсим теги в шаблоне рубрики $main_content = preg_replace_callback( '/\[tag:date:([a-zA-Z0-9-. \/]+)\]/', function ($match) { return translate_date(date($match[1], $this->curentdoc->document_published)); }, $main_content ); // GetField $main_content = preg_replace_callback( '/\[tag:get:([a-zA-Z0-9-_]+)(|:([0-9]+))+?\]/', function ($match) { return get_field($match[1], $match[3]); }, $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); $main_content = str_replace('[tag:humandate]', human_date($this->curentdoc->document_published), $main_content); $main_content = str_replace('[tag:docauthorid]', $this->curentdoc->document_author_id, $main_content); if (preg_match('[tag:docauthor]', $main_content)) $main_content = str_replace('[tag:docauthor]', get_username_by_id($this->curentdoc->document_author_id), $main_content); // Удаляем ошибочные теги полей документа в шаблоне рубрики $main_content = preg_replace('/\[tag:watermark:\w*\]/', '', $main_content); $main_content = preg_replace('/\[tag:fld:\w*\]/', '', $main_content); $main_content = preg_replace('/\[tag:doc:\w*\]/', '', $main_content); $main_content = preg_replace('/\[tag:langfile:\w*\]/', '', $main_content); //-- Кеширование скомпилированного документа $this->setCompileDocument($main_content); $GLOBALS['block_generate']['DOCUMENT']['MAINCONTENT'] = Debug::endTime('MAINCONTENT'); return $main_content; } /** * Метод, предназначенный для формирования хэша страницы * * @return string */ function _get_cache_hash () { $hash = 'g-' . UGROUP; // Группа пользователей $hash .= 'r-' . RUB_ID; // ID Рубрики $hash .= 't-' . $this->curentdoc->rubric_tmpl_id; // Шаблон рубрики //$hash .= 'u-' . get_redirect_link(); // ToDo return md5($hash); } /** * Получаем ID для кеша документа * * @return array|bool */ function _get_cache_id () { $cache = []; $cache['id'] = (int)$this->curentdoc->Id; if (! $cache['id']) return false; $cache['id'] = (int)$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['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; } /** * Создаем компилированный документ * * @param $main_content * * @return bool */ function setCompileDocument ($main_content) { $cache = $this->_get_cache_id(); if (! $cache) return false; //-- Удаляем файл, если существует if (file_exists($cache['dir'] . $cache['file'])) unlink($cache['dir'] . $cache['file']); // Если включен DEV MODE, то отключаем кеширование запросов if (defined('DEV_MODE') AND DEV_MODE) return false; //-- Кэширование разрешено if (defined('CACHE_DOC_TPL') && CACHE_DOC_TPL) { //-- Если нет папки, создаем if (! is_dir($cache['dir'])) @mkdir($cache['dir'], 0766, true); //-- Сохраняем скомпилированный шаблон в кэш file_put_contents($cache['dir'] . $cache['file'], $main_content); } return true; } /** * Получаем скомпилированный документ * * @return bool|string */ function getCompileDocument () { $cache = $this->_get_cache_id(); if (! $cache) return false; $content = false; //-- Если нет папки, создаем if (! is_dir($cache['dir'])) @mkdir($cache['dir'], 0766, true); //-- Получаем сразу поля get_document_fields((int)$this->curentdoc->Id); // Наличие файла if (file_exists($cache['dir'] . $cache['file'])) { // Получаем время создания файла $file_time = filemtime($cache['dir'] . $cache['file']); // Получаем время для проверки $cache_time = $this->curentdoc->rubric_changed; if (! $cache_time || $cache_time > $file_time) { unlink ($cache['dir'] . $cache['file']); } else if (defined('CACHE_DOC_TPL') && CACHE_DOC_TPL) // Извлекаем скомпилированный шаблон документа из кэша $content = file_get_contents($cache['dir'] . $cache['file']); } else { $content = false; } return $content; } 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; } /** * Метод, предназначенный для обработки системных тегов модулей. Здесь подключаются только те файлы модулей, * системные теги которых обнаружены в шаблоне при парсинге. Также формирует массив всех установленных модулей * в системе, предварительно проверяя их доступность. * * @param string $template текст шаблона с тегами * @return string текст шаблона с обработанными тегами модулей */ function coreModuleTagParse($template) { global $AVE_DB, $AVE_Template, $AVE_Module; Debug::startTime('MODULES_PARSE'); $pattern = []; // Массив системных тегов $replace = []; // Массив функций, на которые будут заменены системные теги if (null !== $AVE_Module->moduleListGet()) $this->install_modules = $AVE_Module->moduleListGet(); // Если уже имеются данные об установленных модулях if (null !== $this->install_modules) { // Циклически обрабатываем каждый модуль foreach ($this->install_modules as $row) { if ($row['ModuleStatus'] != 1) continue; // Если в запросе пришел вызов модуля или у модуля есть функция вызываемая тегом, // который присутствует в шаблоне if ( (isset($_REQUEST['module']) && $_REQUEST['module'] == $row['ModuleSysName']) || ( 1 == $row['ModuleIsFunction'] && (isset($row['ModuleAveTag']) && !empty($row['ModuleAveTag'])) && 1 == @preg_match($row['ModuleAveTag'], $template) ) ) { // Проверяем, существует ли для данного модуля функция. Если да, // получаем php код функции. if (function_exists($row['ModuleFunction'])) { $pattern[] = $row['ModuleAveTag']; $replace[] = $row['ModulePHPTag']; } else // В противном случае { // Проверяем, существует ли для данного модуля файл module.php в его персональной директории $mod_file = BASE_DIR . '/modules/' . $row['ModuleSysName'] . '/module.php'; if (is_file($mod_file) && include_once($mod_file)) { // Если файл модуля найден, тогда if ($row['ModuleAveTag']) { $pattern[] = $row['ModuleAveTag']; // Получаем его системный тег // Проверяем, существует ли для данного модуля функция. Если да, // получаем php код функции, в противном случае формируем сообщение с ошибкой $replace[] = function_exists($row['ModuleFunction']) ? $row['ModulePHPTag'] : ($this->_module_error . ' "' . $row['ModuleName'] . '"'); } } // Если файла module.php не существует, формируем сообщение с ошибкой elseif ($row['ModuleAveTag']) { $pattern[] = $row['ModuleAveTag']; $replace[] = $this->_module_error . ' "' . $row['ModuleName'] . '"'; } } } } $GLOBALS['block_generate']['DOCUMENT']['MODULES'] = Debug::endTime('MODULES_PARSE'); // Выполняем замену систеного тега на php код и возвращаем результат return preg_replace($pattern, $replace, $template); } else // В противном случае, если список модулей пустой { $this->install_modules = array(); // Выполняем запрос к БД на получение информации о всех модулях, которые установлены в системе // (именно установлены, а не просто существуют в виде папок) $sql = $AVE_DB->Query(" SELECT * FROM " . PREFIX. "_module WHERE ModuleStatus = '1' "); // Циклически обрабатываем полученные данные while ($row = $sql->FetchRow()) { // Если в запросе пришел параметр module и для данного названия модуля существует // директория или данный модуль имеет функцию и его системный тег указан в каком-либо шаблоне, тогда if ((isset($_REQUEST['module']) && $_REQUEST['module'] == $row->ModuleSysName) || (1 == $row->ModuleIsFunction && ! empty($row->ModuleAveTag) && 1 == preg_match($row->ModuleAveTag, $template))) { // Проверяем, существует ли для данного модуля файл module.php в его персональной директории $mod_file = BASE_DIR . '/modules/' . $row->ModuleSysName . '/module.php'; if (is_file($mod_file) && include_once($mod_file)) { // Если файл модуля найден, тогда if (! empty($row->ModuleAveTag)) { $pattern[] = $row->ModuleAveTag; // Получаем его системный тег // Проверяем, существует ли для данного модуля функция. Если да, // получаем php код функции, в противном случае формируем сообщение с ошибкой $replace[] = function_exists($row->ModuleFunction) ? $row->ModulePHPTag : ($this->_module_error . ' "' . $row->ModuleSysName . '"'); } // Сохряняем информацию о модуле $this->install_modules[$row->ModuleSysName] = $row; } elseif ($row->ModuleAveTag) // Если файла module.php не существует, формируем сообщение с ошибкой { $pattern[] = $row->ModuleAveTag; $replace[] = $this->_module_error . ' "' . $row->ModuleSysName . '"'; } } else { // Если у модуля нет функции или тег модуля не используется - просто помещаем в массив информацию о модуле $this->install_modules[$row->ModuleSysName] = $row; } } $GLOBALS['block_generate']['DOCUMENT']['MODULES'] = Debug::endTime('MODULES_PARSE'); // Выполняем замену систеного тега на php код и возвращаем результат return preg_replace($pattern, $replace, $template); } } /** * Метод, предназанченный для сборки всей страницы в единое целое. * * @param int $id идентификатор документа * @param int $rub_id идентификатор рубрики */ function coreSiteFetch ($id, $rub_id = '') { global $AVE_DB, $AVE_Module; Debug::startTime('DOC_' . $id); $cacheCompile = false; // Определяем рубрику define('RUB_ID', ! empty ($rub_id) ? $rub_id : $this->curentdoc->rubric_id); $main_content = ''; if ((defined('CACHE_DOC_FULL') && CACHE_DOC_FULL) && isAjax() == false) { if ($out = $this->getCompileContent()) { 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()); } // Если происходит вызов системного блока elseif (isset($_REQUEST['sysblock']) && ! empty($_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 { $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(); // Проверяем разрешение на внешнее обращение if (! $this->_requestGet($_REQUEST['request'], 'request_external')) $this->_coreErrorPage404(); // Проверяем разрешение на обращение только по Ajax if ($this->_requestGet($_REQUEST['request'], 'request_ajax')) { if (isAjax()) $out = request_parse($_REQUEST['request']); else $this->_coreErrorPage404(); } 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(); $this->_coreRubricPermissionFetch(RUB_ID); // Выполняем Код рубрики До загрузки документа ob_start(); eval(' ?>' . $this->curentdoc->rubric_start_code . '_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 . "' "); } 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 . "' "); $_SESSION['doc_view'][$id] = time(); } $curdate = mktime(0, 0, 0, date('m'), date('d'), date('Y')); 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()) { $AVE_DB->Query(" INSERT INTO " . PREFIX . "_view_count ( document_id, day_id, count ) VALUES ( '" . $id . "', '".$curdate."', '1' ) "); } $_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 (! empty ($this->curentdoc->rubric_template)) { $rubTmpl = $this->curentdoc->rubric_template; } else { // Если документу задан другой шаблон из данной рубрики, то берем его 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); // Собираем шаблон рубрики if (empty($rubTmpl)) // Если не задан шаблон рубрики, выводим сообщение $main_content = $this->_rubric_template_empty; else // Обрабатываем основные поля рубрики $main_content = $this->_main_content($rubTmpl); } } $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:rubfooter]' => $this->curentdoc->rubric_footer_template ]; $out = str_replace(array_keys($replace), array_values($replace), $out); unset ($replace); } // Парсим поля запроса $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('/\[tag:rfld:\w*\]/', '', $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); } // Парсим теги визуальных блоков $out = preg_replace_callback('/\[tag:block:([A-Za-z0-9-_]{1,20}+)\]/', 'parse_block', $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_callback('/\[tag:teaser:(\d+)(|:\[(.*?)\])\]/', function ($m) { return showteaser($m[1], $m[2]); }, $out ); // Парсим теги модулей $out = $this->coreModuleTagParse($out); // Если в запросе пришел параметр module, т.е. вызов модуля, // проверяем установлен и активен ли модуль if (isset($_REQUEST['module']) && ! $this->_getRequestModule($_REQUEST['module'])) display_notice($this->_module_error . ' "' . $_REQUEST['module'] . '"'); // Выводим сообщение о том что такого модуля нет // Парсим теги системы внутренних запросов $out = preg_replace_callback('/\[tag:request:([A-Za-z0-9-_]{1,20}+)\]/', 'request_parse', $out); // Парсим теги навигации $out = preg_replace_callback('/\[tag:navigation:([A-Za-z0-9-_]{1,20}+):?([0-9,]*)\]/', 'parse_navigation', $out); // Парсим теги скрытого текста $out = parse_hide($out); // Если в запросе пришел параметр sysblock, т.е. вызов сис блока, // парсим контент if (isset($_REQUEST['sysblock']) && $_REQUEST['sysblock'] != '') { $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 : '') ); } // Если в запросе пришел параметр request, т.е. вызов запроса, // парсим контент elseif (isset($_REQUEST['request']) && $_REQUEST['request'] != '') { $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 { // В противном случае // парсим остальные теги основного шаблона $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); } // Иначе 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); } // Убираем пустые теги $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:doc:([a-zA-Z0-9-_]+)\]/u', function ($match) { return isset($this->curentdoc->{$match[1]}) ? $this->curentdoc->{$match[1]} : null; }, $out ); // Если пришел вызов на активацию языковых файлов $out = preg_replace_callback( '/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u', function ($match) { global $AVE_Template; return $AVE_Template->get_config_vars($match[1]); }, $out ); // Убираем пустые теги $out = preg_replace('/\[tag:doc:\d*\]/', '', $out); $out = preg_replace('/\[tag:langfile:\d*\]/', '', $out); // Убираем дубликат $search[] = '[tag:maincontent]'; $replace[] = ''; // Парсим линк на версию для печати $search[] = '[tag:printlink]'; $replace[] = get_print_link(); // Парсим тег версии системы $search[] = '[tag:version]'; $replace[] = APP_NAME . ' v' . APP_VERSION ; // Парсим тег кол-ва просмотра данного документа $search[] = '[tag:docviews]'; $replace[] = isset ($this->curentdoc->document_count_view) ? $this->curentdoc->document_count_view : ''; // Парсим тизер документа $out = preg_replace_callback('/\[tag:teaser:(\d+)(|:\[(.*?)\])\]/', function ($m) { return showteaser($m[1], $m[2]); }, $out ); // Парсим аватар автора документа 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-_]+)\]/', 'curentdoc->document_lang == "$1") { ?>', $out); } else { $out = preg_replace('/\[tag:lang:([a-zA-Z0-9-_]+)\]/', '', $out); } $out = str_replace('[tag:/lang]', '', $out); // Парсим хлебные крошки if (preg_match('/\[tag:breadcrumb]/u', $out)) { $out = preg_replace_callback('/\[tag:breadcrumb\]/', 'get_breadcrumb', $out); } // Парсим остальные теги основного шаблона $out = str_replace($search, $replace, $out); // Парсим теги для combine.php $out = preg_replace_callback('/\[tag:(css|js):([^ :\/]+):?(\S+)*\]/', array($this, '_parse_combine'), $out); // ЧПУ $out = str_ireplace('"//"','"/"', str_ireplace('///','/', rewrite_link($out))); unset ($search, $replace, $main_content); //Убираем данные $GLOBALS['block_generate']['DOCUMENT']['FETCH'] = Debug::endTime('DOC_' . $id); if ($cacheCompile == false) { $this->setCompileContent($out); } } // Выводим собранный документ echo $out; } /** * Метод, предназначенный для формирования ЧПУ, а также для поиска документа и разбора * дополнительных параметров в URL * * @param string $get_url Строка символов * */ function coreUrlParse($get_url = '') { global $AVE_DB; Debug::startTime('URL_PARSE'); $document_id = null; $cache_time = 0; //-- Если нужны параметры GET, можно отключить $get_url = (strpos($get_url, ABS_PATH . '?') === 0 ? '' : $get_url); if (substr($get_url, 0, strlen(ABS_PATH . 'index.php')) != ABS_PATH . 'index.php' AND strpos($get_url, '?') !== false) $get_url = substr($get_url, 0, strpos($get_url, '?')); $get_url = rawurldecode($get_url); $get_url = mb_substr($get_url, strlen(ABS_PATH)); //-- Сохранение старого урла для првоерки использования суффикса $check_url = $get_url; if (mb_substr($get_url, - strlen(URL_SUFF)) == URL_SUFF) { $get_url = mb_substr($get_url, 0, - strlen(URL_SUFF)); } //-- Ложный URL $fake_url = false; //-- Разбиваем строку параметров на отдельные части $get_url = explode('/', $get_url); if (isset ($get_url['index'])) { unset ($get_url['index']); } if (isset ($get_url['print'])) { $_GET['print'] = $_REQUEST['print'] = 1; unset ($get_url['print']); } //-- Определяем, используется ли у нас разделение документа по страницам $pages = preg_grep('/^(a|art)?page-\d+$/i', $get_url); if (! empty ($pages)) { $get_url = implode('/', array_diff($get_url, $pages)); $pages = implode('/', $pages); preg_replace_callback('/(page|apage|artpage)-(\d+)/i', function ($matches) { $_GET[$matches[1]] = $matches[2]; $_REQUEST[$matches[1]] = $matches[2]; }, $pages); } //-- В противном случае формируем окончательную ссылку для документа else { $get_url = implode('/', $get_url); } //-- Страница тегов preg_match('/^tags(|(\/.*))+$/is', $get_url, $match); //-- Если есть совпадение с tag if ($match) { //-- Смотрим условие if (isset($match[2])) { //-- Отрезаем лишнее $matches = trim($match[2], '/'); //-- Разбиваем $matches = explode('/', $matches); //-- Берем первое значение $matches = urldecode(array_shift($matches)); //-- Если значение не равно пусто if ($matches != '') { //-- Передаем в _GET условие tag $_GET['tag'] = $_REQUEST['tag'] = $matches; //-- Парсим query strings parse_str($_SERVER['QUERY_STRING'], $query_string); //-- Назначаем условие $query_string['tag'] = $matches; //-- Пересобираем QUERY_STRING $_SERVER['QUERY_STRING'] = http_build_query($query_string); //-- Назначаем URL $get_url = 'tags'; //-- Инициализируем ложный URL $fake_url = true; } } } //-- Экранируем поступающий URL $get_url = $AVE_DB->ClearUrl($get_url); //-- Заглушка для главной страницы if ($get_url == '') $get_url = '/'; //-- Проверяем есть ли данный URL в таблице алиасов модулей $sql = " SELECT document_id, module_name, module_action, module_link FROM " . PREFIX . "_modules_aliases WHERE module_url = '" . str_ireplace("'", "\'", $get_url) . "' # MODULE LINK "; $module = $AVE_DB->Query($sql)->FetchAssocArray(); //-- Если модуль есть, переназначаем URL и переменные if ($module) { //-- Передаем глобальные перемененные $_GET['module'] = $_REQUEST['module'] = $module['module_name']; $_GET['action'] = $_REQUEST['action'] = $module['module_action']; $get_url = ABS_PATH . $module['module_link']; //-- Если есть document_id, назначем его if ($module['document_id']) $document_id = $_REQUEST['id'] = (int)$module['document_id']; else $document_id = $_REQUEST['id'] = 1; } //-- УБираем лишнее unset ($sql, $module); //-- Если пришел $_REQUEST['id'] документа, получаем URL для проверки if (! empty($_REQUEST['id']) && is_numeric($_REQUEST['id'])) { $sql = " SELECT document_alias FROM " . PREFIX . "_documents WHERE Id = '" . intval($_REQUEST['id']) . "' # FIND DOCID "; $document_id = intval($_REQUEST['id']); $get_url = $AVE_DB->Query($sql)->GetCell(); } // Иначе пробуем получить ID по URL else { $sql = " SELECT Id FROM " . PREFIX . "_documents WHERE document_alias = '" . str_ireplace("'", "\'", $get_url) . "' # FIND DOCURL "; $document_id = intval($AVE_DB->Query($sql)->GetCell()); } //-- УБираем лишнее unset ($sql); //-- Выполняем запрос к БД на получение всей необходимой //-- информации о документе $this->curentdoc = getDocument($document_id); if (defined('CACHE_DOC_FILE') && CACHE_DOC_FILE) $cache_time = -1; // Если данные документа получены if ($this->curentdoc) { // Получить шаблон рубрики $sql = " SELECT STRAIGHT_JOIN prm.rubric_permission, rub.rubric_template, rub.rubric_meta_gen, rub.rubric_template_id, rub.rubric_header_template, rub.rubric_footer_template, rub.rubric_start_code, rub.rubric_changed, rub.rubric_changed_fields, other.template FROM " . PREFIX . "_rubrics AS rub LEFT JOIN " . PREFIX . "_rubric_permissions AS prm ON rub.Id = prm.rubric_id LEFT JOIN " . PREFIX . "_rubric_templates AS other ON (rub.Id = other.rubric_id AND other.id = '" . $this->curentdoc->rubric_tmpl_id . "') WHERE prm.user_group_id = '" . UGROUP . "' AND rub.Id = '" . $this->curentdoc->rubric_id . "' # FETCH RUB = " . $this->curentdoc->rubric_id . " "; $query = $AVE_DB->Query($sql, $cache_time, 'rub_' . $this->curentdoc->rubric_id, true, '.rubric')->FetchRow(); $this->curentdoc = (object) array_merge((array) $query, (array) $this->curentdoc); if ($this->curentdoc->rubric_tmpl_id != 0) { $this->curentdoc->rubric_template = (($this->curentdoc->template != '') ? $this->curentdoc->template : $this->curentdoc->rubric_template); unset ($this->curentdoc->template); } //-- Переназначем глобальные переменные $_GET['id'] = $_REQUEST['id'] = $this->curentdoc->Id; $_GET['doc'] = $_REQUEST['doc'] = $this->curentdoc->document_alias; //-- Назначаем язык пользователю, в завивисомтси от языка документа if ($this->curentdoc->Id != PAGE_NOT_FOUND_ID OR $this->curentdoc->document_lang == '--') $_SESSION['user_language'] = $this->curentdoc->document_lang; //-- Если есть ложный URL указываем его if ($fake_url) { $check_url = preg_replace('/\/(a|art)?page-\d+/i', '', $check_url); $_GET['doc'] = $_REQUEST['doc'] = $check_url; $this->curentdoc->document_alias = $check_url; $get_url = $check_url; } $GLOBALS['block_generate']['DOCUMENT']['URL_PARSE'] = Debug::endTime('URL_PARSE'); //-- Перенаправление на адреса с суффиксом if ( $check_url !== $get_url . URL_SUFF && ! $pages && $check_url && ! $_REQUEST['print'] && ! $_REQUEST['module'] && ! $_REQUEST['tag'] && REWRITE_MODE ) { header('HTTP/1.1 301 Moved Permanently'); if ($this->curentdoc->Id == 1) header('Location:' . ABS_PATH); else header('Location:' . ABS_PATH . $get_url . URL_SUFF); exit; } } // Иначе ищем URL в редиректах else { $sql = " SELECT # REDIRECT = $get_url a.document_alias, h.document_alias_header FROM ".PREFIX."_document_alias_history AS h, ".PREFIX."_documents AS a WHERE h.document_id = a.Id AND h.document_alias = '" . $get_url . "' "; $redirect_alias = $AVE_DB->Query($sql)->FetchRow(); $GLOBALS['block_generate']['DOCUMENT']['URL_PARSE'] = Debug::endTime('URL_PARSE'); if ($redirect_alias->document_alias && ! empty($redirect_alias->document_alias)) { $redirect_alias = ABS_PATH . $redirect_alias->document_alias . URL_SUFF; $redirect_alias = str_replace('//', '/', $redirect_alias); header('Location:' . $redirect_alias, true, $redirect_alias->document_alias_header); exit; } if (! (! empty($_REQUEST['sysblock']) || ! empty($_REQUEST['module']) || ! empty($_REQUEST['request']))) $_GET['id'] = $_REQUEST['id'] = PAGE_NOT_FOUND_ID; } unset ($sql, $query); } } ?>