mirror of https://github.com/avecms/AVE.cms.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1329 lines
41 KiB
1329 lines
41 KiB
<?php |
|
|
|
/** |
|
* AVE.cms |
|
* |
|
* Класс, предназначенный для работы шаблонами и пунктами меню навигаций |
|
* |
|
* @package AVE.cms |
|
* @version 3.x |
|
* @filesource |
|
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru |
|
* |
|
*/ |
|
|
|
class AVE_Navigation |
|
{ |
|
|
|
/** |
|
* Свойства класса |
|
*/ |
|
|
|
|
|
/** |
|
* Внутренние методы класса |
|
*/ |
|
|
|
/** |
|
* Метод, предназначенный для удаления запрещённых символов |
|
* и преобразование специальных символов в HTML сущности |
|
* |
|
* @param string $text |
|
* @return string |
|
*/ |
|
function _replace_wildcode($text) |
|
{ |
|
//$text = html_entity_decode($text,ENT_QUOTES,'UTF-8'); |
|
//$text = preg_replace('/\s/i',' ',$text); |
|
//$text = str_replace(array('ô','ç','é','è','ä','à','â','ü','ñ'),array('o','c','e','e','a','a','a','u','n'), $text); |
|
//$text = htmlspecialchars($text, ENT_QUOTES, '"&><\''); |
|
return $text; |
|
} |
|
|
|
/** |
|
* Внутренние методы |
|
*/ |
|
|
|
/** |
|
* Проверка алиаса тега на валидность и уникальность |
|
*/ |
|
function navigationValidate ($alias = '', $id = 0) |
|
{ |
|
global $AVE_DB; |
|
|
|
//-- Соответствие требованиям |
|
if (empty ($alias) || preg_match('/^[A-Za-z0-9-_]{1,20}$/i', $alias) !== 1 || is_numeric($alias)) |
|
return 'syn'; |
|
|
|
//-- Уникальность |
|
return !(bool)$AVE_DB->Query(" |
|
SELECT 1 |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
alias = '" . $alias . "' |
|
AND |
|
navigation_id != '" . $id . "' |
|
")->GetCell(); |
|
} |
|
|
|
|
|
/** |
|
* Метод, предназначенный для вывода списка всех существующих меню навигаций в Паели управления |
|
* |
|
*/ |
|
function navigationList() |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
$navigations = array(); |
|
|
|
// Выполняем запрос к БД на получение списка всех меню навигаций |
|
$sql = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id, |
|
alias, |
|
title |
|
FROM |
|
" . PREFIX . "_navigation |
|
ORDER BY |
|
navigation_id ASC |
|
"); |
|
|
|
// Формируем данные в массив |
|
while ($row = $sql->FetchRow()) |
|
{ |
|
array_push($navigations, $row); |
|
} |
|
|
|
// Передаем данные в шаблон для вывода и отображаем страницу со списком меню |
|
$AVE_Template->assign('nid', 0); |
|
$AVE_Template->assign('navigations', $navigations); |
|
$AVE_Template->assign('content', $AVE_Template->fetch('navigation/list.tpl')); |
|
} |
|
|
|
|
|
|
|
/** |
|
* Метод, предназначенный для добавления нового меню |
|
* |
|
*/ |
|
function navigationNew() |
|
{ |
|
global $AVE_DB, $AVE_Template, $AVE_User; |
|
|
|
// Определяем действие пользователя |
|
switch($_REQUEST['sub']) |
|
{ |
|
// Если действие не определено, отображаем чистую форму для создания шаблона навигации |
|
case '': |
|
|
|
// Передаем данные в шаблон и отображаем страницу для добавления нового шаблона меню |
|
$AVE_Template->assign('groups', $AVE_User->userGroupListGet()); |
|
$AVE_Template->assign('form_action', 'index.php?do=navigation&action=new&sub=save&cp=' . SESSION); |
|
$AVE_Template->assign('content', $AVE_Template->fetch('navigation/template.tpl')); |
|
break; |
|
|
|
|
|
// Если пользователь нажал на кнопку Добавить (Сохранить) |
|
case 'save': |
|
|
|
// Определяем название меню навигации |
|
$navigation_title = (empty($_REQUEST['title'])) ? 'title' : $_REQUEST['title']; |
|
|
|
// Определяем шаблон оформления 1-го уровня ссылок |
|
// в меню. Если шаблон не указан пользователем,тогда |
|
// используем вариант "по умолчанию" |
|
$navigation_level1 = (empty($_REQUEST['level1'])) ? "<a target=\"[tag:target]\" href=\"[tag:link]\">[tag:linkname]</a>" : $_REQUEST['level1']; |
|
$navigation_level1_active = (empty($_REQUEST['level1_active'])) ? "<a target=\"[tag:target]\" href=\"[tag:link]\" class=\"first_active\">[tag:linkname]</a>" : $_REQUEST['level1_active']; |
|
|
|
// Выполняем запрос к БД на добавление нового меню |
|
$AVE_DB->Query(" |
|
INSERT INTO |
|
" . PREFIX . "_navigation |
|
SET |
|
navigation_id = '', |
|
alias = '" . $_REQUEST['alias'] . "', |
|
title = '" . $navigation_title . "', |
|
level1 = '" . $navigation_level1 . "', |
|
level1_active = '" . $navigation_level1_active . "', |
|
level2 = '" . $_REQUEST['level2'] . "', |
|
level2_active = '" . $_REQUEST['level2_active'] . "', |
|
level3 = '" . $_REQUEST['level3'] . "', |
|
level3_active = '" . $_REQUEST['level3_active'] . "', |
|
level1_begin = '" . $_REQUEST['level1_begin'] . "', |
|
level2_begin = '" . $_REQUEST['level2_begin'] . "', |
|
level3_begin = '" . $_REQUEST['level3_begin'] . "', |
|
level1_end = '" . $_REQUEST['level1_end'] . "', |
|
level2_end = '" . $_REQUEST['level2_end'] . "', |
|
level3_end = '" . $_REQUEST['level3_end'] . "', |
|
begin = '" . $_REQUEST['begin'] . "', |
|
end = '" . $_REQUEST['end'] . "', |
|
user_group = '" . (empty($_REQUEST['user_group']) ? '' : implode(',', $_REQUEST['user_group'])) . "', |
|
expand_ext = '" . $_REQUEST['expand_ext'] . "' |
|
"); |
|
|
|
$navigation_id = $AVE_DB->getLastInsertId(); |
|
|
|
// Сохраняем системное сообщение в журнал |
|
reportLog($AVE_Template->get_config_vars('NAVI_REPORT_NEW') . " (" . stripslashes($navigation_title) . ") (ID: $navigation_id)"); |
|
|
|
// Выполянем переход к списку меню навигаций |
|
header('Location:index.php?do=navigation&cp=' . SESSION); |
|
break; |
|
} |
|
} |
|
|
|
|
|
|
|
/** |
|
* Метод, предназначенный для редактирования шаблона навигации |
|
* |
|
* @param int $navigation_id идентификатор меню навигации |
|
*/ |
|
function navigationEdit($navigation_id) |
|
{ |
|
global $AVE_DB, $AVE_Template, $AVE_User; |
|
|
|
// Определяем действие пользователя |
|
switch ($_REQUEST['sub']) |
|
{ |
|
// Если действие не определено, отображаем форму с данными для редактирования |
|
case '': |
|
|
|
// Выполняем запрос к БД и получаем всю информацию о данном меню |
|
$row = $AVE_DB->Query(" |
|
SELECT |
|
* |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = '" . $navigation_id . "' |
|
")->FetchRow(); |
|
|
|
// Формируем список групп пользователей |
|
$row->user_group = explode(',', $row->user_group); |
|
|
|
// Формируем ряд переменных для использования в шаблоне и отображаем форм с данными для редактирования |
|
$AVE_Template->assign('nid', $navigation_id); |
|
$AVE_Template->assign('navigation', $row); |
|
$AVE_Template->assign('groups', $AVE_User->userGroupListGet()); |
|
$AVE_Template->assign('form_action', 'index.php?do=navigation&action=templates&sub=save&navigation_id=' . $navigation_id . '&cp=' . SESSION); |
|
$AVE_Template->assign('content', $AVE_Template->fetch('navigation/template.tpl')); |
|
break; |
|
|
|
// Если пользователь нажал на кнопку Сохранить изменения |
|
case 'save': |
|
|
|
// Выполняем запрос к БД и обновляем информацию в таблице для данного меню |
|
$sql = $AVE_DB->Query(" |
|
UPDATE " . PREFIX . "_navigation |
|
SET |
|
title = '" . $_REQUEST['title'] . "', |
|
alias = '" . $_REQUEST['alias'] . "', |
|
level1 = '" . $_REQUEST['level1'] . "', |
|
level1_active = '" . $_REQUEST['level1_active'] . "', |
|
level2 = '" . $_REQUEST['level2'] . "', |
|
level2_active = '" . $_REQUEST['level2_active'] . "', |
|
level3 = '" . $_REQUEST['level3'] . "', |
|
level3_active = '" . $_REQUEST['level3_active'] . "', |
|
level1_begin = '" . $_REQUEST['level1_begin'] . "', |
|
level2_begin = '" . $_REQUEST['level2_begin'] . "', |
|
level3_begin = '" . $_REQUEST['level3_begin'] . "', |
|
level1_end = '" . $_REQUEST['level1_end'] . "', |
|
level2_end = '" . $_REQUEST['level2_end'] . "', |
|
level3_end = '" . $_REQUEST['level3_end'] . "', |
|
begin = '" . $_REQUEST['begin'] . "', |
|
end = '" . $_REQUEST['end'] . "', |
|
user_group = '" . (empty($_REQUEST['user_group']) ? '' : implode(',', $_REQUEST['user_group'])) . "', |
|
expand_ext = '" . $_REQUEST['expand_ext'] . "' |
|
WHERE |
|
navigation_id = '" . $navigation_id . "' |
|
"); |
|
|
|
//-- Стираем кеш навигации |
|
$this->clearCache($navigation_id, $_REQUEST['alias']); |
|
$this->clearCacheId($navigation_id, $_REQUEST['alias']); |
|
$this->clearCacheNav($navigation_id, $_REQUEST['alias']); |
|
|
|
if ($sql === false) |
|
{ |
|
$message = $AVE_Template->get_config_vars('NAVI_REPORT_SAVED_ERR'); |
|
$header = $AVE_Template->get_config_vars('NAVI_REPORT_ERROR'); |
|
$theme = 'error'; |
|
} |
|
else |
|
{ |
|
$message = $AVE_Template->get_config_vars('NAVI_REPORT_SAVED'); |
|
$header = $AVE_Template->get_config_vars('NAVI_REPORT_SUCCESS'); |
|
$theme = 'accept'; |
|
reportLog($AVE_Template->get_config_vars('NAVI_REPORT_EDIT') . " (" . stripslashes($_REQUEST['title']) . ") (ID: $navigation_id)"); |
|
} |
|
|
|
if (isAjax()) |
|
{ |
|
echo json_encode( |
|
array( |
|
'message' => $message, |
|
'header' => $header, |
|
'theme' => $theme |
|
) |
|
); |
|
} |
|
else |
|
{ |
|
$AVE_Template->assign('message', $message); |
|
header('Location:index.php?do=navigation&cp=' . SESSION); |
|
} |
|
exit; |
|
} |
|
} |
|
|
|
|
|
|
|
/** |
|
* Метод, предназначенный для копирования шаблона меню |
|
* |
|
* @param int $navigation_id идентификатор меню навигации источника |
|
*/ |
|
function navigationCopy($navigation_id) |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
// Если в запросе указано числовое значение id меню |
|
if (is_numeric($navigation_id)) |
|
{ |
|
// Выполняем запрос к БД на получение информации о копируемом меню |
|
$row = $AVE_DB->Query(" |
|
SELECT * |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = '" . $navigation_id . "' |
|
")->FetchRow(); |
|
|
|
// Если данные получены, тогда |
|
if ($row) |
|
{ |
|
// Выполняем запрос к БД на добавление нового меню и сохраняем информацию с учетом данных, |
|
// полученных в предыдущем запросе к БД |
|
$AVE_DB->Query(" |
|
INSERT INTO |
|
" . PREFIX . "_navigation |
|
SET |
|
navigation_id = '', |
|
title = '" . addslashes((empty($_REQUEST['title']) ? $row->title : $_REQUEST['title'])) . "', |
|
alias = '', |
|
level1 = '" . addslashes($row->level1) . "', |
|
level1_active = '" . addslashes($row->level1_active) . "', |
|
level2 = '" . addslashes($row->level2) . "', |
|
level2_active = '" . addslashes($row->level2_active) . "', |
|
level3 = '" . addslashes($row->level3) . "', |
|
level3_active = '" . addslashes($row->level3_active) . "', |
|
level1_begin = '" . addslashes($row->level1_begin) . "', |
|
level2_begin = '" . addslashes($row->level2_begin) . "', |
|
level3_begin = '" . addslashes($row->level3_begin) . "', |
|
level1_end = '" . addslashes($row->level1_end) . "', |
|
level2_end = '" . addslashes($row->level2_end) . "', |
|
level3_end = '" . addslashes($row->level3_end) . "', |
|
begin = '" . addslashes($row->begin) . "', |
|
end = '" . addslashes($row->end) . "', |
|
user_group = '" . addslashes($row->user_group) . "', |
|
expand_ext = '" . $row->expand_ext . "' |
|
"); |
|
|
|
// Сохраняем системное сообщение в журнал |
|
reportLog($AVE_Template->get_config_vars('NAVI_REPORT_COPY') . " (" . (empty($_REQUEST['title']) ? $row->title : $_REQUEST['title']) . ") (ID: $navigation_id)"); |
|
} |
|
} |
|
|
|
// Выполянем переход к списку меню навигаций |
|
header('Location:index.php?do=navigation&cp=' . SESSION); |
|
} |
|
|
|
|
|
|
|
/** |
|
* Метод, предназначенный для удаления меню навигации и всех пунктов относящихся к нему |
|
* |
|
* @param int $navigation_id идентификатор меню навигации |
|
*/ |
|
function navigationDelete($navigation_id) |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
// Если id меню числовой и это не первое меню (id не 1) |
|
if (is_numeric($navigation_id) && $navigation_id != 1) |
|
{ |
|
|
|
$sql= $AVE_DB->Query(" |
|
SELECT * |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = '" . $navigation_id . "' |
|
")->FetchRow(); |
|
|
|
//-- Стираем кеш навигации |
|
$this->clearCache($navigation_id, $sql->alias); |
|
|
|
//-- Выполняем запрос к БД на удаление общей информации и шаблона оформления меню |
|
$AVE_DB->Query("DELETE FROM " . PREFIX . "_navigation WHERE navigation_id = '" . $navigation_id . "'"); |
|
//-- Выполняем запрос к БД на удаление всех пунктов для данного меню |
|
$AVE_DB->Query("DELETE FROM " . PREFIX . "_navigation_items WHERE navigation_id = '" . $navigation_id . "'"); |
|
|
|
//-- Сохраняем системное сообщение в журнал |
|
reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DEL') . " (" . stripslashes($sql->title) . ") (ID: $navigation_id)"); |
|
} |
|
|
|
//-- Выполянем переход к списку меню навигаций |
|
header('Location:index.php?do=navigation&cp=' . SESSION); |
|
} |
|
|
|
|
|
|
|
/** |
|
* Метод, предназначенный для получения списка всех пунктов у всех меню навигации |
|
* |
|
*/ |
|
function navigationAllItemList() |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
$navigations = array(); |
|
|
|
//-- Выполняем запрос к БД на получение id и названия меню навигации |
|
$sql = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id, |
|
title |
|
FROM |
|
" . PREFIX . "_navigation |
|
"); |
|
|
|
$items = null; |
|
|
|
//-- Циклически обрабатываем полученные данные |
|
while ($navigation = $sql->FetchRow()) |
|
{ |
|
//-- Выполняем запрос к БД на получение всех пунктов для каждого меню. |
|
$sql_items = $AVE_DB->Query(" |
|
SELECT |
|
* |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
navigation_id = " . (int)$navigation->navigation_id . " |
|
AND |
|
parent_id = 0 |
|
ORDER BY |
|
position ASC |
|
"); |
|
|
|
while ($row = $sql_items->FetchAssocArray()) |
|
{ |
|
//-- имя связанного документа |
|
if ($row['document_id'] > 0) |
|
{ |
|
$doc_info = get_document((int)$row['document_id']); |
|
$row['document_title'] = (($doc_info['document_breadcrum_title']) ? $doc_info['document_breadcrum_title'] : $doc_info['document_title']); |
|
} |
|
else |
|
{ |
|
$row['document_title'] = ''; |
|
} |
|
|
|
$row['children'] = $this->getChildrenById($row['navigation_item_id'], 0, true); |
|
|
|
if (! empty($item_id)) |
|
$items = $row; |
|
else |
|
$items[] = $row; |
|
} |
|
|
|
$navigation->navigation_items = $items; |
|
|
|
unset($items); |
|
|
|
array_push($navigations, $navigation); |
|
} |
|
|
|
//-- Передаем полученные данные в шаблон для вывода |
|
$AVE_Template->assign('navigations', $navigations); |
|
$AVE_Template->assign('select_tpl', 'navigation/select.tpl'); |
|
} |
|
|
|
|
|
/** |
|
* Метод, предназначенный для вывода пунктов меню навигации в Панели управления |
|
* |
|
* @param int $id идентификатор меню навигации |
|
*/ |
|
function navigationItemList($navigation_id) |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
$sql = $AVE_DB->Query(" |
|
SELECT |
|
* |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
navigation_id = " . (int)$navigation_id . " |
|
AND |
|
parent_id = 0 |
|
ORDER BY |
|
position ASC |
|
"); |
|
|
|
$items = array(); |
|
|
|
while ($row = $sql->FetchAssocArray()) |
|
{ |
|
// имя связанного документа |
|
if ($row['document_id'] > 0) |
|
{ |
|
$doc_info = get_document((int)$row['document_id']); |
|
$row['document_title'] = (($doc_info['document_breadcrum_title']) |
|
? $doc_info['document_breadcrum_title'] |
|
: $doc_info['document_title']); |
|
} |
|
else |
|
{ |
|
$row['document_title'] = ''; |
|
} |
|
|
|
$row['children'] = $this->getChildrenById($row['navigation_item_id'], 0, true); |
|
|
|
if (! empty($item_id)) |
|
$items = $row; |
|
else |
|
$items[] = $row; |
|
} |
|
|
|
$navigation = $AVE_DB->Query(" |
|
SELECT * |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = '" . $navigation_id . "' |
|
")->FetchRow(); |
|
|
|
$AVE_Template->assign('navigation', $navigation); |
|
$AVE_Template->assign('items', $items); |
|
$AVE_Template->assign('level', 1); |
|
|
|
$AVE_Template->assign('nestable_tpl', 'navigation/nestable.tpl'); |
|
$AVE_Template->assign('content', $AVE_Template->fetch('navigation/items.tpl')); |
|
} |
|
|
|
|
|
/** |
|
* Метод для рекурсивного получения |
|
* пунктов меню навигации в Панели управления |
|
*/ |
|
public function getChildrenById($navigation_item_id, $rec_status = 1, $recurse = false) |
|
{ |
|
global $AVE_DB; |
|
|
|
$sql = $AVE_DB->Query(" |
|
SELECT |
|
* |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
parent_id = " . $navigation_item_id . " |
|
ORDER BY |
|
position ASC |
|
"); |
|
|
|
$children = array(); |
|
|
|
while($row = $sql->FetchAssocArray()) |
|
{ |
|
if($recurse) |
|
{ |
|
// имя связанного документа |
|
if ($row['document_id'] > 0) |
|
{ |
|
$doc_info = get_document((int)$row['document_id']); |
|
$row['document_title'] = (($doc_info['document_breadcrum_title']) |
|
? $doc_info['document_breadcrum_title'] |
|
: $doc_info['document_title']); |
|
} |
|
else |
|
{ |
|
$row['document_title'] = ''; |
|
} |
|
|
|
$row['children'] = $this->getChildrenById($row['navigation_item_id'], $rec_status,$recurse); |
|
} |
|
|
|
$children[] = $row; |
|
} |
|
|
|
return ((count($children) > 0) |
|
? $children |
|
: false |
|
); |
|
} |
|
|
|
|
|
/** |
|
* Метод, предназначенный для управления пунктами меню навигации в Панели управления |
|
* |
|
* @param int $id идентификатор меню навигации |
|
*/ |
|
function navigationItemEdit($navigation_item_id = null) |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
// Определяем действие пользователя |
|
switch ($_REQUEST['sub']) |
|
{ |
|
// Если действие не определено, отображаем форму с данными для редактирования |
|
case 'new': |
|
|
|
$sql = $AVE_DB->Query(" |
|
SELECT |
|
* |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
navigation_id = " . (int)$_REQUEST['navigation_id'] . " |
|
AND |
|
parent_id = 0 |
|
ORDER BY |
|
position ASC |
|
"); |
|
|
|
$items = array(); |
|
|
|
while ($row = $sql->FetchAssocArray()) |
|
{ |
|
$row['css_style'] = stripslashes($row['css_style']); |
|
|
|
// имя связанного документа |
|
if ($row['document_id'] > 0) |
|
{ |
|
$doc_info = get_document((int)$row['document_id']); |
|
|
|
$row['document_title'] = (($doc_info['document_breadcrum_title']) |
|
? $doc_info['document_breadcrum_title'] |
|
: $doc_info['document_title']); |
|
} |
|
else |
|
{ |
|
$row['document_title'] = ''; |
|
} |
|
|
|
$row['children'] = $this->getChildrenById($row['navigation_item_id'], 0, true); |
|
|
|
if (! empty($item_id)) |
|
$items = $row; |
|
else |
|
$items[] = $row; |
|
} |
|
|
|
$alias = $AVE_DB->Query(" |
|
SELECT |
|
alias |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = " . $_REQUEST['navigation_id'] . " |
|
")->GetCell(); |
|
|
|
//-- Стираем кеш навигации |
|
$this->clearCache($_REQUEST['navigation_id'], $alias); |
|
|
|
$AVE_Template->assign('select_tpl', 'navigation/select.tpl'); |
|
$AVE_Template->assign('items', $items); |
|
$AVE_Template->assign('content', $AVE_Template->fetch('navigation/item_new.tpl')); |
|
break; |
|
|
|
case 'edit': |
|
|
|
$item = $AVE_DB->Query(" |
|
SELECT |
|
* |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
navigation_item_id = " . $navigation_item_id . " |
|
")->FetchRow(); |
|
|
|
$item->css_style = stripslashes($item->css_style); |
|
|
|
if ($item->document_id) |
|
$doc_info = get_document((int)$item->document_id); |
|
|
|
$item->document_title = (($doc_info['document_breadcrum_title']) |
|
? $doc_info['document_breadcrum_title'] |
|
: $doc_info['document_title']); |
|
|
|
$item->document_alias = $doc_info['document_alias']; |
|
|
|
$AVE_Template->assign('item', $item); |
|
$AVE_Template->assign('content', $AVE_Template->fetch('navigation/item_edit.tpl')); |
|
break; |
|
|
|
case 'save': |
|
|
|
$_REQUEST['alias'] = (strpos($_REQUEST['alias'], 'javascript') !== false) |
|
? str_replace(array(' ', '%'), '-', $_REQUEST['alias']) |
|
: $_REQUEST['alias']; |
|
|
|
// Определяем флаг статуса пункта меню (активен/неактивен) |
|
$status = (empty($_REQUEST['alias'])) |
|
? 0 |
|
: 1; |
|
|
|
if ($navigation_item_id) |
|
{ |
|
// Выполняем запрос к БД и обновляем информацию в таблице для данного меню |
|
$sql = $AVE_DB->Query(" |
|
UPDATE |
|
" . PREFIX . "_navigation_items |
|
SET |
|
document_id = '" . (($_REQUEST['document_id']) ? (int)$_REQUEST['document_id'] : '') . "', |
|
title = '" . $this->_replace_wildcode($_REQUEST['title']) . "', |
|
alias = '" . $_REQUEST['alias'] . "', |
|
description = '" . $this->_replace_wildcode($_REQUEST['description']) . "', |
|
image = '" . $_REQUEST['image'] . "', |
|
css_style = '" . addslashes($_REQUEST['css_style']) . "', |
|
css_class = '" . $_REQUEST['css_class'] . "', |
|
css_id = '" . $_REQUEST['css_id'] . "', |
|
target = '" . $_REQUEST['target'] . "', |
|
status = '" . $status . "' |
|
WHERE |
|
navigation_item_id = '" . $navigation_item_id . "' |
|
"); |
|
|
|
$navigation_id = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
navigation_item_id = '" . $navigation_item_id . "' |
|
")->GetCell(); |
|
|
|
$alias = $AVE_DB->Query(" |
|
SELECT |
|
alias |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = " . $navigation_id . " |
|
")->GetCell(); |
|
|
|
//-- Стираем кеш навигации |
|
$this->clearCache($_REQUEST['navigation_id'], $alias); |
|
} |
|
else |
|
{ |
|
if ($_REQUEST['after']) |
|
$after = $AVE_DB->Query("SELECT * FROM ".PREFIX."_navigation_items WHERE navigation_item_id = '" . $_REQUEST['after'] . "' ")->FetchArray(); |
|
else |
|
$after = array('parent_id' => 0, 'level' => 1, 'position' => 0); |
|
|
|
// Выполняем запрос к БД и обновляем информацию в таблице для данного меню |
|
$sql = $AVE_DB->Query(" |
|
INSERT |
|
" . PREFIX . "_navigation_items |
|
SET |
|
navigation_id = '" . $_REQUEST['navigation_id'] . "', |
|
document_id = '" . (($_REQUEST['document_id']) ? (int)$_REQUEST['document_id'] : '') . "', |
|
title = '" . $this->_replace_wildcode($_REQUEST['title']) . "', |
|
alias = '" . $_REQUEST['alias'] . "', |
|
description = '" . $this->_replace_wildcode($_REQUEST['description']) . "', |
|
image = '" . $_REQUEST['image'] . "', |
|
css_style = '" . addslashes($_REQUEST['css_style']) . "', |
|
css_class = '" . $_REQUEST['css_class'] . "', |
|
css_id = '" . $_REQUEST['css_id'] . "', |
|
target = '" . $_REQUEST['target'] . "', |
|
parent_id = '" . $after['parent_id'] . "', |
|
level = '" . $after['level'] . "', |
|
position = '" . $after['position'] . "', |
|
status = '" . $status . "' |
|
"); |
|
|
|
$navigation_item_id = $AVE_DB->getLastInsertId(); |
|
|
|
$alias = $AVE_DB->Query(" |
|
SELECT |
|
alias |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = " . $_REQUEST['navigation_id'] . " |
|
")->GetCell(); |
|
|
|
//-- Стираем кеш навигации |
|
$this->clearCache($_REQUEST['navigation_id'], $alias); |
|
} |
|
|
|
$message = 'Пункт меню успешно сохранен'; |
|
$header = 'Выполнено'; |
|
$theme = 'accept'; |
|
|
|
echo json_encode( |
|
array( |
|
'message' => $message, |
|
'header' => $header, |
|
'theme' => $theme, |
|
'after' => $_REQUEST['after'], |
|
'item_id' => $navigation_item_id) |
|
); |
|
exit; |
|
} |
|
/* |
|
// Сохраняем системное сообщение в журнал |
|
reportLog($AVE_Template->get_config_vars('NAVI_REPORT_ADDIT') . " (" . $this->_replace_wildcode($title) . ") - ". $AVE_Template->get_config_vars('NAVI_REPORT_TLEV')); |
|
|
|
// Выполняем обновление страницы |
|
header('Location:index.php?do=navigation&action=entries&id=' . $nav_id . '&cp=' . SESSION); |
|
exit; |
|
*/ |
|
} |
|
|
|
|
|
|
|
/** |
|
* Метод, предназначенный для удаления пунктов меню навигации связанных с удаляемым документом. |
|
* Данный метод вызывается при удалении документа с идентификатором $document_id. |
|
* Если у пункта меню нет потомков - пункт удаляется, в противном случае пункт деактивируется |
|
* |
|
* @param int $document_id идентификатор удаляемого документа |
|
*/ |
|
function navigationItemDeleteFromDoc($document_id) |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
if (! is_numeric($document_id)) |
|
return; |
|
|
|
// Выполняем запрос к БД и получаем ID пункта меню, с которым связан документ |
|
$sql = $AVE_DB->Query(" |
|
SELECT |
|
navigation_item_id |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
document_id = '" . $document_id . "' |
|
"); |
|
|
|
while ($row = $sql->FetchRow()) |
|
{ |
|
// Выполняем запрос к БД для определения у удаляемого пункта подпунктов |
|
$num = $AVE_DB->Query(" |
|
SELECT |
|
COUNT(1) |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
parent_id = '" . $row->navigation_item_id . "' |
|
")->GetCell(); |
|
|
|
// Если данный пункт имеет подпункты, тогда |
|
if ($num > 0) |
|
{ |
|
// Выполняем запрос к БД и деактивируем пункт меню |
|
$AVE_DB->Query(" |
|
UPDATE |
|
" . PREFIX . "_navigation_items |
|
SET |
|
status = '0' |
|
WHERE |
|
navigation_item_id = '" . $row->navigation_item_id . "' |
|
"); |
|
|
|
// Сохраняем системное сообщение в журнал |
|
reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DEACT') . " (id: $row->navigation_item_id)"); |
|
} |
|
else |
|
{ // В противном случае, если данный пункт не имеет подпунктов, тогда |
|
|
|
// Выполняем запрос к БД и удаляем помеченный пункт |
|
$AVE_DB->Query(" |
|
DELETE |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
navigation_item_id = '" . $row->navigation_item_id . "' |
|
"); |
|
|
|
// Сохраняем системное сообщение в журнал |
|
reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DELIT') . " (id: $row->navigation_item_id)"); |
|
} |
|
} |
|
} |
|
|
|
|
|
/** |
|
* Метод, предназначенный для удаления пункта меню навигации в Панели управления |
|
* |
|
* @param int $navigation_item_id идентификатор меню навигации |
|
*/ |
|
function navigationItemDelete($navigation_item_id) |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
if (!is_numeric($navigation_item_id)) |
|
return; |
|
|
|
// Выполняем запрос к БД для определения у удаляемого пункта подпунктов |
|
$num = $AVE_DB->Query(" |
|
SELECT |
|
COUNT(1) |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
parent_id = '" . $navigation_item_id . "' |
|
")->GetCell(); |
|
|
|
// Если данный пункт имеет подпункты, тогда |
|
if ($num > 0) |
|
{ |
|
$sql = $AVE_DB->Query(" |
|
SELECT |
|
* |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
navigation_item_id = '" . $navigation_item_id . "' |
|
LIMIT 1 |
|
")->FetchRow(); |
|
|
|
// Выполняем запрос к БД и деактивируем пункт меню |
|
$AVE_DB->Query(" |
|
UPDATE |
|
" . PREFIX . "_navigation_items |
|
SET |
|
status = '0' |
|
WHERE |
|
navigation_item_id = '" . $navigation_item_id . "' |
|
"); |
|
|
|
// Сохраняем системное сообщение в журнал |
|
reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DEACT') . " (" . stripslashes($sql->title) . ") (id: $navigation_item_id)"); |
|
} |
|
else |
|
{ |
|
// В противном случае, если данный пункт не имеет подпунктов, тогда |
|
$sql = $AVE_DB->Query(" |
|
SELECT * |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
navigation_item_id = '" . $navigation_item_id . "' |
|
LIMIT 1 |
|
")->FetchRow(); |
|
|
|
// Выполняем запрос к БД и удаляем помеченный пункт |
|
$AVE_DB->Query(" |
|
DELETE |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
navigation_item_id = '" . $navigation_item_id . "' |
|
"); |
|
|
|
// Сохраняем системное сообщение в журнал |
|
reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DELIT') . " (" . stripslashes($sql->title) . ") (id: $navigation_item_id)"); |
|
} |
|
|
|
$nav = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id, alias |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = " . $sql->navigation_id . " |
|
")->FetchRow(); |
|
|
|
//-- Стираем кеш навигации |
|
$this->clearCache($nav->navigation_id, $nav->alias); |
|
|
|
// Выполняем обновление страницы |
|
header('Location:' . get_referer_admin_link()); |
|
exit; |
|
} |
|
|
|
|
|
/** |
|
* Метод, предназначенный для активации пункта меню навигации. |
|
* Данный метод используется при изменении статуса документа с идентификатором $document_id |
|
* |
|
* @param int $document_id идентификатор документа на который ссылается пункт меню |
|
*/ |
|
function navigationItemStatusOn($document_id) |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
if (!is_numeric($document_id)) |
|
return; |
|
|
|
// Выполняем запрос к БД и получаем id пункта меню, который соответствует идентификатору документа в ссылке |
|
$sql = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id, |
|
navigation_item_id |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
document_id = '" . $document_id . "' |
|
AND |
|
status = '0' |
|
"); |
|
|
|
while ($row = $sql->FetchRow()) |
|
{ |
|
// Выполняем запрос к БД изменяем статус пункта меню на активный (1) |
|
$AVE_DB->Query(" |
|
UPDATE |
|
" . PREFIX . "_navigation_items |
|
SET |
|
status = '1' |
|
WHERE |
|
navigation_item_id = '" . $row->navigation_item_id . "' |
|
"); |
|
|
|
$nav = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id, alias |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = " . $row->navigation_id . " |
|
")->FetchRow(); |
|
|
|
//-- Стираем кеш навигации |
|
$this->clearCache($nav->navigation_id, $nav->alias); |
|
|
|
// Сохраняем системное сообщение в журнал |
|
reportLog($AVE_Template->get_config_vars('NAVI_REPORT_ACT') . " (id: $row->navigation_item_id)"); |
|
} |
|
|
|
|
|
} |
|
|
|
/** |
|
* Метод, предназначенный для деактивации пункта меню навигации. |
|
* Данный метод используется при изменении статуса документа с идентификатором $document_id |
|
* |
|
* @param int $document_id идентификатор документа на который ссылается пункт меню |
|
*/ |
|
function navigationItemStatusOff($document_id) |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
if (! is_numeric($document_id)) |
|
return; |
|
|
|
// Выполняем запрос к БД и получаем id пункта меню, |
|
// который соответствует идентификатору документа в ссылке |
|
$sql = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id, |
|
navigation_item_id |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
document_id = '" . $document_id . "' |
|
AND |
|
status = '1' |
|
"); |
|
|
|
while ($row = $sql->fetchrow()) |
|
{ |
|
// Выполняем запрос к БД изменяем статус пункта меню на неактивный (0) |
|
$AVE_DB->Query(" |
|
UPDATE |
|
" . PREFIX . "_navigation_items |
|
SET |
|
status = '0' |
|
WHERE |
|
navigation_item_id = '" . $row->navigation_item_id . "' |
|
"); |
|
|
|
|
|
$nav = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id, alias |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = " . $row->navigation_id . " |
|
")->FetchRow(); |
|
|
|
//-- Стираем кеш навигации |
|
$this->clearCache($nav->navigation_id, $nav->alias); |
|
|
|
// Сохраняем системное сообщение в журнал |
|
reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DEACT') . " (id: $row->navigation_item_id)"); |
|
} |
|
} |
|
|
|
/** |
|
* Метод, предназначенный для активации пункта меню навигации. |
|
* Данный метод используется при изменении статуса документа с идентификатором $document_id |
|
* |
|
* @param int $document_id идентификатор документа на который ссылается пункт меню |
|
*/ |
|
function navigationItemGet($navigation_item_id) |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
if (! is_numeric($navigation_item_id)) |
|
return; |
|
|
|
// Выполняем запрос к БД и получаем id пункта меню, который соответствует идентификатору документа в ссылке |
|
$item = $AVE_DB->Query(" |
|
SELECT |
|
* |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
navigation_item_id = '" . $navigation_item_id . "' |
|
")->FetchAssocArray(); |
|
|
|
if ($item['document_id']) |
|
$doc_info = get_document((int)$item['document_id']); |
|
|
|
$item['document_title'] = (($doc_info['document_breadcrum_title']) |
|
? $doc_info['document_breadcrum_title'] |
|
: $doc_info['document_title']); |
|
|
|
$item['document_alias'] = $doc_info['document_alias']; |
|
|
|
$nav = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id, alias |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = " . $item['navigation_id'] . " |
|
")->FetchRow(); |
|
|
|
//-- Стираем кеш навигации |
|
$this->clearCache($nav->navigation_id, $nav->alias); |
|
|
|
$AVE_Template->assign('item', $item); |
|
$AVE_Template->assign('content', $AVE_Template->fetch('navigation/item.tpl')); |
|
} |
|
|
|
/** |
|
* Метод, предназначенный для рекурсивоной |
|
* сортировки пунктов меню навигации. |
|
*/ |
|
function navigationSort() |
|
{ |
|
global $AVE_DB, $AVE_Template; |
|
|
|
$level = 1; |
|
|
|
$navigation_id = (int)$_REQUEST['navigation_id']; |
|
|
|
foreach ($_REQUEST['data'] as $item_id => $item) |
|
{ |
|
$AVE_DB->Query(" |
|
UPDATE |
|
" . PREFIX . "_navigation_items |
|
SET |
|
level = '" . $level . "', |
|
parent_id = '0', |
|
position = '" . (int)$item_id . "' |
|
WHERE |
|
navigation_item_id = " . $item['id'] ." |
|
AND |
|
navigation_id = " . $navigation_id . " |
|
"); |
|
|
|
if (is_array($item['children'])) |
|
{ |
|
$this->navigationSortNested($item['children'], $item['id'], $level, $navigation_id); |
|
} |
|
} |
|
|
|
$nav = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id, alias |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = " . $navigation_id . " |
|
")->FetchRow(); |
|
|
|
//-- Стираем кеш навигации |
|
$this->clearCache($nav->navigation_id, $nav->alias); |
|
|
|
if (isAjax()) |
|
{ |
|
echo json_encode( |
|
array( |
|
'message' => $AVE_Template->get_config_vars('NAVI_SORTED'), |
|
'header' => $AVE_Template->get_config_vars('NAVI_REPORT_SUCCESS'), |
|
'theme' => 'accept' |
|
) |
|
); |
|
} |
|
|
|
exit; |
|
} |
|
|
|
/** |
|
* Метод, предназначенный для рекурсивоной |
|
* сортировки пунктов меню навигации. |
|
*/ |
|
function navigationSortNested($array = array(), $parent_id = null, $level = null, $navigation_id = null) |
|
{ |
|
global $AVE_DB; |
|
|
|
$level++; |
|
|
|
foreach($array as $key => $value) |
|
{ |
|
$AVE_DB->Query(" |
|
UPDATE |
|
" . PREFIX . "_navigation_items |
|
SET |
|
level = '" . $level . "', |
|
parent_id = '" . (int)$parent_id . "', |
|
position = '" . $key . "' |
|
WHERE |
|
navigation_item_id = " . $value['id'] . " |
|
AND |
|
navigation_id = " . $navigation_id . " |
|
"); |
|
|
|
if (is_array($value['children'])) |
|
{ |
|
$this->navigationSortNested($value['children'], $value['id'], $level, $navigation_id); |
|
} |
|
} |
|
} |
|
|
|
|
|
function getDocumentById($doc_id = null) |
|
{ |
|
$document = get_document($doc_id); |
|
|
|
echo json_encode( |
|
array( |
|
'doc_id' => $doc_id, |
|
'document_title' => $document['document_title'], |
|
'document_alias' => $document['document_alias'] |
|
) |
|
); |
|
exit; |
|
} |
|
|
|
|
|
function navigationItemStatus($navigation_item_id, $status = 1) |
|
{ |
|
global $AVE_DB; |
|
|
|
$AVE_DB->Query(" |
|
UPDATE |
|
" . PREFIX . "_navigation_items |
|
SET |
|
status = '" . $status . "' |
|
WHERE |
|
navigation_item_id = '" . $navigation_item_id . "' |
|
"); |
|
|
|
$navigation_id = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id |
|
FROM |
|
" . PREFIX . "_navigation_items |
|
WHERE |
|
navigation_item_id = '" . $navigation_item_id . "' |
|
")->GetCell(); |
|
|
|
$nav = $AVE_DB->Query(" |
|
SELECT |
|
navigation_id, alias |
|
FROM |
|
" . PREFIX . "_navigation |
|
WHERE |
|
navigation_id = " . $navigation_id . " |
|
")->FetchRow(); |
|
|
|
//-- Стираем кеш навигации |
|
$this->clearCache($nav->navigation_id, $nav->alias); |
|
|
|
echo json_encode( |
|
array( |
|
'status' => ($status == 0 ? 1 : 0) |
|
) |
|
); |
|
|
|
exit; |
|
} |
|
|
|
|
|
function clearCache($id, $alias = '') |
|
{ |
|
if (file_exists(BASE_DIR . '/tmp/cache/sql/nav/template-' . $id . '.cache')) |
|
unlink(BASE_DIR . '/tmp/cache/sql/nav/template-' . $id . '.cache'); |
|
|
|
if (file_exists(BASE_DIR . '/tmp/cache/sql/nav/template-' . $alias . '.cache')) |
|
unlink(BASE_DIR . '/tmp/cache/sql/nav/template-' . $alias . '.cache'); |
|
|
|
if (file_exists(BASE_DIR . '/tmp/cache/sql/nav/items-' . $id . '.cache')) |
|
unlink(BASE_DIR . '/tmp/cache/sql/nav/items-' . $id . '.cache'); |
|
|
|
if (file_exists(BASE_DIR . '/tmp/cache/sql/nav/items-' . $alias . '.cache')) |
|
unlink(BASE_DIR . '/tmp/cache/sql/nav/items-' . $alias . '.cache'); |
|
} |
|
|
|
|
|
function clearCacheId($id, $alias = '') |
|
{ |
|
$dir_id = BASE_DIR . '/tmp/cache/sql/nav_' . $id; |
|
$dir_alias = BASE_DIR . '/tmp/cache/sql/nav_' . $alias; |
|
|
|
if (file_exists($dir_id)) |
|
{ |
|
foreach (glob($dir_id . '/*') as $file) |
|
{ |
|
unlink($file); |
|
} |
|
} |
|
|
|
if (file_exists($dir_alias)) |
|
{ |
|
foreach (glob($dir_alias . '/*') as $file) |
|
{ |
|
unlink($file); |
|
} |
|
} |
|
} |
|
|
|
|
|
function clearCacheNav($id, $alias) |
|
{ |
|
$cache_id = str_replace('nav_', '', $id); |
|
$cache_id = 'nav/' . substr($cache_id, 0, 3); |
|
|
|
$cache_dir = BASE_DIR . '/tmp/cache/sql/' . (trim($cache_id) > '' |
|
? trim($cache_id) . '/' |
|
: ''); |
|
|
|
rrmdir($cache_dir); |
|
|
|
|
|
$cache_id = str_replace('nav_', '', $alias); |
|
$cache_id = 'nav/' . substr($cache_id, 0, 3); |
|
|
|
$cache_dir = BASE_DIR . '/tmp/cache/sql/' . (trim($cache_id) > '' |
|
? trim($cache_id) . '/' |
|
: ''); |
|
|
|
rrmdir($cache_dir); |
|
} |
|
} |
|
?>
|
|
|