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 = 'Запрашиваемый модуль не найден.'; /** * Получение основных настроек сисблока * * @param string $param параметр настройки, если не указан - все параметры * @return mixed */ function _sysBlock($id, $param = '') { global $AVE_DB; static $sys_block = null; if ($sys_block === null) { $sys_block = $AVE_DB->Query(" SELECT * FROM " . PREFIX . "_sysblocks WHERE " . (is_numeric($id) ? 'id' : 'sysblock_alias') . " = '" . $id . "' ")->FetchAssocArray(); } if ($param == '') return $sys_block; return isset($sys_block[$param]) ? $sys_block[$param] : null; } function _getMainTemplate($rubric_id, $template_id) { global $AVE_DB; $return = null; if (is_numeric($template_id)) { $cache = 'template_' . $template_id; $cache_file = BASE_DIR . '/tmp/cache/templates/' . $cache . '.inc'; // Если включен DEV MODE, то отключаем кеширование if (defined('DEV_MODE') AND DEV_MODE) $cache_file = null; if (! file_exists(dirname($cache_file))) mkdir(dirname($cache_file), 0766, true); if (file_exists($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; } /** * Метод, предназначенный для формирования хэша страницы * * @return string */ function _get_cache_hash() { $hash = 'g-' . UGROUP; $hash .= 'r-' . RUB_ID; $hash .= 'u-' . get_redirect_link(); $hash .= 't-' . $this->curentdoc->rubric_tmpl_id; return md5($hash); } /** * Метод, предназначенный для проверки существования документа в БД * * @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; } function _main_content ($main_content, $id, $rubTmpl) { global $AVE_DB, $AVE_Template; // Проверяем теги полей в шаблоне рубрики на условие != '' $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]+)]/', create_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]+)]/', create_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('/\[tag:watermark:\w*\]/', '', $main_content); $main_content = preg_replace('/\[tag:fld:\d*\]/', '', $main_content); $main_content = preg_replace('/\[tag:doc:\w*\]/', '', $main_content); $main_content = preg_replace('/\[tag:langfile:\w*\]/', '', $main_content); // парсим теги в шаблоне рубрики $main_content = preg_replace_callback( '/\[tag:date:([a-zA-Z0-9-. \/]+)\]/', create_function('$m','return translate_date(date($m[1], '.$this->curentdoc->document_published.')); '), $main_content ); $main_content = str_replace('[tag:docdate]', pretty_date(strftime(DATE_FORMAT, $this->curentdoc->document_published)), $main_content); $main_content = str_replace('[tag:doctime]', pretty_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); if (CACHE_DOC_TPL && empty($_POST)) { $cache_id = (int)$this->curentdoc->Id; $cache_id = 'compiled/' . (floor($cache_id / 1000)) . '/' . $cache_id; $cache_file = $this->_get_cache_hash(); $cache_dir = BASE_DIR . '/tmp/cache/sql/' . (trim($cache_id) > '' ? trim($cache_id) . '/' : substr($cache_file, 0, 2) . '/' . substr($cache_file, 2, 2) . '/' . substr($cache_file, 4, 2) . '/'); // кэширование разрешено // сохраняем скомпилированный шаблон в кэш if (CACHE_DOC_FILE) { if (! is_dir($cache_dir)) mkdir($cache_dir, 0766, true); file_put_contents($cache_dir . $cache_file, $main_content); } // кэширование разрешено // сохраняем скомпилированный шаблон в кэш $AVE_DB->Query(" INSERT INTO " . PREFIX . "_rubric_template_cache SET hash = '" . $cache_file . "', rub_id = '" . RUB_ID . "', rub_tmpl_id = '" . $this->curentdoc->rubric_tmpl_id . "', grp_id = '" . UGROUP . "', doc_id = '" . $id . "', compiled = '" . addslashes($main_content) . "' "); unset ($cache_id, $cache_file, $cache_dir); } return $main_content; } /** * Метод, предназначенный для обработки системных тегов модулей. Здесь подключаются только те файлы модулей, * системные теги которых обнаружены в шаблоне при парсинге. Также формирует массив всех установленных модулей * в системе, предварительно проверяя их доступность. * * @param string $template текст шаблона с тегами * @return string текст шаблона с обработанными тегами модулей */ function coreModuleTagParse($template) { global $AVE_DB, $AVE_Template, $AVE_Module; $pattern = array(); // Массив системных тегов $replace = array(); // Массив функций, на которые будут заменены системные теги 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'] . '"'; } } } } // Выполняем замену систеного тега на 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; } } // Выполняем замену систеного тега на php код и возвращаем результат return preg_replace($pattern, $replace, $template); } } /** * Метод, предназанченный для сборки всей страницы в единое целое. * * @param int $id идентификатор документа * @param int $rub_id идентификатор рубрики */ function coreSiteFetch($id, $rub_id = '') { global $AVE_DB; $main_content = ''; // Если происходит вызов модуля, получаем соответствующие мета-теги и получаем шаблон модуля if (isset($_REQUEST['module']) && ! empty($_REQUEST['module'])) { $out = $this->_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 (! $this->_sysBlock($_REQUEST['sysblock'], 'sysblock_external')) { header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true); exit; } // проверяем разрешение на обращение только по Ajax if ($this->_sysBlock($_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(); // Определяем рубрику define('RUB_ID', ! empty ($rub_id) ? $rub_id : $this->curentdoc->rubric_id); // Проверяем разрешение на внешнее обращение 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(); // Определяем права доступа к документам рубрики define('RUB_ID', ! empty ($rub_id) ? $rub_id : $this->curentdoc->rubric_id); $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 (CACHE_DOC_TPL && empty ($_POST)) { // Кэширование разрешено // Извлекаем скомпилированный шаблон документа из кэша // Если там пусто, пробуем достать из бд $cache_id = (int)$this->curentdoc->Id; $cache_id = 'compiled/' . (floor($cache_id / 1000)) . '/' . $cache_id; $cache_file = $this->_get_cache_hash(); $cache_dir = BASE_DIR . '/tmp/cache/sql/' . (trim($cache_id) > '' ? trim($cache_id) . '/' : substr($cache_file, 0, 2) . '/' . substr($cache_file, 2, 2) . '/' . substr($cache_file, 4, 2) . '/'); if (CACHE_DOC_FILE && file_exists($cache_dir . $cache_file)) { $main_content = file_get_contents($cache_dir . $cache_file); } else { $main_content = $AVE_DB->Query(" SELECT compiled FROM " . PREFIX . "_rubric_template_cache WHERE hash = '" . $cache_file . "' LIMIT 1 ")->GetCell(); } unset($cache_dir, $cache_file, $cache_id); } 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($main_content, $id, $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 = array( '[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($replace); } // Парсим поля запроса $out = preg_replace_callback( '/\[tag:rfld:([a-zA-Z0-9-_]+)]\[(more|esc|img|[0-9-]+)]/', create_function( '$m', 'return request_get_document_field($m[1], ' . $id . ', $m[2], ' . (defined('RUB_ID') ? RUB_ID : 0) . ');' ), $out ); // Удаляем ошибочные теги полей документа в шаблоне рубрики $out = preg_replace('/\[tag:rfld:\d*\]/', '', $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}+)\]/', 'parse_sysblock', $out); // Парсим теги модулей $out = $this->coreModuleTagParse($out); // Если в запросе пришел параметр module, т.е. вызов модуля, // проверяем установлен и активен ли модуль if (isset($_REQUEST['module']) && ! (isset($this->install_modules[$_REQUEST['module']]) && '1' == $this->install_modules[$_REQUEST['module']]['ModuleStatus']) ) { // Выводим сообщение о том что такого модуля нет display_notice($this->_module_error); } // Парсим теги системы внутренних запросов $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) ? 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+)(|:\[(.*?)\])\]/', create_function( '$m', 'return showteaser($m[1], $m[2]);' ), $out ); // Парсим аватар автора документа if (defined('RUB_ID')) $out = preg_replace_callback( '/\[tag:docauthoravatar:(\d+)\]/', create_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); unset ($search, $replace); //Убираем данные // Парсим теги для combine.php $out = preg_replace_callback('/\[tag:(css|js):([^ :\/]+):?(\S+)*\]/', array($this, '_parse_combine'), $out); // ЧПУ $out = str_ireplace('"//"','"/"', str_ireplace('///','/', rewrite_link($out))); unset($main_content); // Выводим собранный документ echo $out; } /** * Метод, предназначенный для формирования ЧПУ, а также для поиска документа и разбора * дополнительных параметров в URL * * @param string $get_url Строка символов * */ function coreUrlParse($get_url = '') { global $AVE_DB; // Если нужны параметры 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)); // Сохранение старого урла для првоерки использования суффикса $test_url = $get_url; if (mb_substr($get_url, - strlen(URL_SUFF)) == URL_SUFF) { $get_url = mb_substr($get_url, 0, - strlen(URL_SUFF)); } // Разбиваем строку параметров на отдельные части $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', create_function( '$matches', '$_GET[$matches[1]] = $matches[2]; $_REQUEST[$matches[1]] = $matches[2];' ), $pages ); } // В противном случае формируем окончательную ссылку для документа else { $get_url = implode('/', $get_url); } //-- Экранируем поступающий URL $get_url = $AVE_DB->ClearUrl($get_url); //-- Проверяем есть ли данный URL в таблице алиасов модулей $sql = " SELECT module_name, module_action, module_link FROM " . PREFIX . "_modules_aliases WHERE module_url = '" . str_ireplace("'", "\'", $get_url) . "' "; $query = $AVE_DB->Query($sql)->FetchRow(); if ($query) { //-- Передаем глобальные перемененные $_GET['module'] = $_REQUEST['module'] = $query->module_name; $_GET['action'] = $_REQUEST['action'] = $query->module_action; $get_url = ABS_PATH . $query->module_link; } // проверка на наличие id в запросе if (! empty($_REQUEST['id'])) { $get_url = $AVE_DB->Query(" SELECT document_alias FROM " . PREFIX . "_documents WHERE Id = '" . (int)$_REQUEST['id'] . "' ")->GetCell(); } // Выполняем запрос к БД на получение всей необходимой // информации о документе $document_id = (! empty($_REQUEST['id']) ? intval($_REQUEST['id']) : 1); // Забираем нужные данные $sql = " SELECT doc.*, rubric_permission, rubric_template, rubric_meta_gen, rubric_template_id, rub.rubric_header_template, rub.rubric_footer_template, rub.rubric_start_code, other.template FROM " . PREFIX . "_documents AS doc JOIN " . PREFIX . "_rubrics AS rub ON rub.Id = doc.rubric_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 = '" . UGROUP . "' AND " . (! empty ($get_url) && ! isset($_REQUEST['module']) ? "document_alias = '" . str_ireplace("'", "\'", $get_url) . "'" : (! empty($_REQUEST['id']) ? "doc.Id =" . intval($_REQUEST['id']) : "doc.Id = 1")) . " LIMIT 1 "; $hash_url = md5($get_url); $query = $AVE_DB->Query($sql, CACHE_DOC_SQL, 'url_' . $hash_url); if ($this->curentdoc = $query->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); } // Глобальные переменные $_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; // Перенаправление на адреса с суффиксом if ( $test_url !== $get_url . URL_SUFF && ! $pages && $test_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); exit(); } else { header('Location:' . ABS_PATH . $get_url . URL_SUFF); exit(); } } } else { $sql = " SELECT a.document_alias 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)->GetCell(); $redirect_alias = ABS_PATH . $redirect_alias . URL_SUFF; $redirect_alias = str_replace('//', '/', $redirect_alias); if (! empty($redirect_alias)) { header('HTTP/1.1 301 Moved Permanently'); header('Location:' . $redirect_alias); exit(); } if (! (! empty($_REQUEST['sysblock']) || ! empty($_REQUEST['module']) || ! empty($_REQUEST['request']))) $_GET['id'] = $_REQUEST['id'] = PAGE_NOT_FOUND_ID; } unset ($sql, $query); } } ?>