AVE.CMS v3.28
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.
 
 
 
 
 

1304 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->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/navigations/' . $id . '/template.cache'))
unlink(BASE_DIR . '/tmp/cache/sql/navigations/' . $id . '/template.cache');
if (file_exists(BASE_DIR . '/tmp/cache/sql/navigations/' . $alias . '/template.cache'))
unlink(BASE_DIR . '/tmp/cache/sql/navigations/' . $alias . '/template.cache');
if (file_exists(BASE_DIR . '/tmp/cache/sql/navigations/' . $id . '/items.cache'))
unlink(BASE_DIR . '/tmp/cache/sql/navigations/' . $id . '/items.cache');
if (file_exists(BASE_DIR . '/tmp/cache/sql/navigations/' . $alias . '/items.cache'))
unlink(BASE_DIR . '/tmp/cache/sql/navigations/' . $alias . '/items.cache');
}
function clearCacheNav($id, $alias)
{
$cache_id = explode('_', $id);
$cache_id = 'navigations/' . $cache_id[1];
$cache_dir = BASE_DIR . '/tmp/cache/sql/' . (trim($cache_id) > ''
? trim($cache_id) . '/'
: '');
rrmdir($cache_dir);
$cache_id = explode('_', $alias);
$cache_id = 'navigations/' . $cache_id[1];
$cache_dir = BASE_DIR . '/tmp/cache/sql/' . (trim($cache_id) > ''
? trim($cache_id) . '/'
: '');
rrmdir($cache_dir);
}
}
?>