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.
 
 
 
 
 

4291 lines
141 KiB

<?php
/**
* AVE.cms
*
* Класс, предназначенный для управления документами в Панели управления
*
* @package AVE.cms
* @version 3.x
* @filesource
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
*
*/
class AVE_Document
{
/**
* Свойства класса
*/
/**
* Количество документов отображаемых на одной странице
*
* @public int
*
*/
public $_limit = 25;
public $_max_remark_length = 500;
/**
* Внутренние методы класса
*/
/**
* Метод, предназначенный для формирование метки времени,
* которая будет определять начало периода показа списка Документов.
* Т.е. с какого числа/времени начать вывод списка документов.
*
* @return int метка времени Unix
*/
function _documentListStart()
{
$published = explode(".", $_REQUEST['document_published']);
$timestamp = time(0);
if (! empty($published[0]))
{
$timestamp = mktime(
0,
0,
0,
$published[1],
$published[0],
$published[2]
);
}
return ($timestamp==time(0)
? ''
: $timestamp);
}
/**
* Метод, предназначенный для формирование метки времени,
* которая будет определять окончание периода показа списка Документов.
* Т.е. по какое число/время ограничить вывод списка документов.
*
* @return int метка времени Unix
*/
function _documentListEnd()
{
$expire = explode(".", $_REQUEST['document_expire']);
$timestamp = time(0);
if (! empty($expire[0]))
{
$timestamp = mktime(
23,
59,
59,
$expire[1],
$expire[0],
$expire[2]
);
}
return ($timestamp==time(0) ? '' : $timestamp);
}
/**
* Метод, предназначенный для формирование метки времени начала публикации Документа
*
* @return int метка времени Unix
*/
function _documentStart($data = 0)
{
if (is_numeric($data))
return $data;
$data = explode(" ", $data);
$stamp['day'] = explode(".", $data[0]);
$stamp['time'] = explode(":", $data[1]);
if (!empty($stamp))
{
$timestamp = mktime(
$stamp['time'][0],
$stamp['time'][1],
0,
$stamp['day'][1],
$stamp['day'][0],
$stamp['day'][2]
);
}
return $timestamp;
}
/**
* Метод, предназначенный для формирование метки времени окончания публикации Документа
*
* @return int метка времени Unix
*/
function _documentEnd($data = 0)
{
if (is_numeric($data))
return $data;
$data = explode(" ", $data);
$stamp['day'] = explode(".", $data[0]);
$stamp['time'] = explode(":", $data[1]);
if (!empty($stamp))
{
$timestamp = mktime(
$stamp['time'][0],
$stamp['time'][1],
0,
$stamp['day'][1],
$stamp['day'][0],
$stamp['day'][2]
);
}
return $timestamp;
}
/**
* Метод, предназначенный для получения типа поля
* (изображения, однострочное поле, многострочный текст и т.д.),
* а также формирования вспомогательных элементов управления этим полем (например кнопка)
*
* @param string $field_type тип поля
* @param string $field_value содержимое поля
* @param int $field_id идентификатор поля
* @param string $dropdown значения для поля типа "Выпадающий список"
* @return string HTML-код поля Документа
*/
function _documentFieldGet($field_type, $field_value, $field_id, $default = '')
{
$func = 'get_field_'.$field_type;
if (! is_callable($func))
$func = 'get_field_default';
$field = $func($field_value, 'edit', $field_id, '', 0, $x, 0, 0, $default);
return $field;
}
function _documentFieldSave($field_type, $field_value, $field_id, $default = '')
{
$func = 'get_field_'.$field_type;
if (! is_callable($func))
$func = 'get_field_default';
$field = $func($field_value, 'save', $field_id, '', 0, $x, 0, 0, $default);
return $field;
}
function _get_rubric_fields ($id)
{
global $AVE_DB;
$sql = "
SELECT
Id,
rubric_field_type,
rubric_field_numeric
FROM
".PREFIX."_rubric_fields
WHERE
rubric_id = '" . $id . "'
";
$query = $AVE_DB->Query($sql);
$ids = array();
while ($row = $query->FetchAssocArray())
{
$ids[$row['Id']]['rubric_field_type'] = $row['rubric_field_type'];
$ids[$row['Id']]['rubric_field_numeric'] = (int)$row['rubric_field_numeric'];
}
return $ids;
}
function _get_document_text_fields ($id)
{
global $AVE_DB;
$sql = "
SELECT
rubric_field_id
FROM
".PREFIX."_document_fields_text
WHERE
document_id = '" . $id . "'
";
$query = $AVE_DB->Query($sql);
$ids = array();
while ($row = $query->GetCell())
array_push($ids, $row);
return $ids;
}
function _get_rubric ($id)
{
global $AVE_DB;
if (! $id)
return false;
$sql = "
SELECT
rubric_alias,
rubric_alias_history,
rubric_code_start,
rubric_code_end
FROM
" . PREFIX . "_rubrics
WHERE
Id = '" . $id . "'
";
return $AVE_DB->Query($sql)->FetchRow();
}
/**
* Метод, предназначенный для получения списка документов в Панели управления
*
*/
function documentListGet()
{
global $AVE_DB, $AVE_Rubric, $AVE_Template;
$ex_titel = '';
$nav_titel = '';
$ex_time = '';
$nav_time = '';
$request = '';
$ex_rub = '';
$ex_delete = '';
$nav_rub = '';
$ex_docstatus = '';
$navi_docstatus = '';
// При смене страницы убираем из сессии параметры выборки документов
unset ($_SESSION['search_query']);
// Если в запросе пришел параметр на поиск документа по названию
if (!empty($_REQUEST['QueryTitel']))
{
$request = $_REQUEST['QueryTitel'];
$chain = explode(' ', $request); // Получаем список слов, разделяя по пробелу (если их несколько)
// Циклически обрабатываем слова, формируя условия, которые будут применены в запросе к БД
foreach ($chain as $search)
{
$and = @explode(' +', $search);
foreach ($and as $and_word)
{
if (strpos($and_word, '+') !== false)
{
$ex_titel .= " AND ((UPPER(doc.document_title) LIKE '%" . mb_strtoupper(substr($and_word, 1)) . "%')OR(UPPER(doc.document_alias) LIKE '%" . mb_strtoupper(substr($and_word, 1)) . "%'))";
}
}
$and_not = @explode(' -', $search);
foreach ($and_not as $and_not_word)
{
if (strpos($and_not_word, '-') !== false)
{
$ex_titel .= " AND (UPPER(doc.document_title) NOT LIKE '%" . mb_strtoupper($and_not_word, 1) . "%')";
}
}
$start = explode(' +', $request);
if (strpos($start[0], ' -') !== false) $start = explode(' -', $request);
$start = $start[0];
}
$ex_titel = "AND ((UPPER(doc.document_title) LIKE '%" . mb_strtoupper($start) . "%')OR(UPPER(doc.document_alias) LIKE '%" . mb_strtoupper($start) . "%'))" . $ex_titel;
$nav_titel = '&QueryTitel=' . urlencode($request);
}
$sql_join_field = '';
$sql_where_field = '';
$field_link = '';
if (isset($_REQUEST['field_id']) && (int)$_REQUEST['field_id'] > 0)
{
$sql_join_field = "
LEFT JOIN
" . PREFIX . "_document_fields AS df1
ON
doc.Id = df1.document_id
LEFT JOIN
" . PREFIX . "_document_fields_text AS df2
ON
df1.document_id = df2.document_id
";
if ($_REQUEST['field_request'] == 'eq')
{
$sql_where_field = "
AND
(df1.rubric_field_id = '" . (int)$_REQUEST['field_id'] . "'
AND
UPPER(CONCAT_WS('', df1.field_value, NULLIF(df2.field_value, '')) = '" . mb_strtoupper($_REQUEST['field_search']) . "')
OR
df1.field_number_value = '" . mb_strtoupper($_REQUEST['field_search']) . "')
";
}
else if ($_REQUEST['field_request'] == 'like')
{
$sql_where_field = "
AND
(df1.rubric_field_id = '" . (int)$_REQUEST['field_id'] . "'
AND
UPPER(CONCAT_WS('', df1.field_value, NULLIF(df2.field_value, '')) LIKE '%" . mb_strtoupper($_REQUEST['field_search']) . "%')
OR
df1.field_number_value LIKE '%" . mb_strtoupper($_REQUEST['field_search']) . "%')
";
}
$field_link = '&field_id=' . (int)$_REQUEST['field_id'] . '&field_request=' . $_REQUEST['field_request'] . '&field_search=' . $_REQUEST['field_search'];
}
// Если в запросе пришел id определенной рубрики
if (isset($_REQUEST['rubric_id']) && $_REQUEST['rubric_id'] != 'all')
{
// Формируем условия, которые будут применены в запросе к БД
$ex_rub = " AND doc.rubric_id = '" . $_REQUEST['rubric_id'] . "'";
// формируем условия, которые будут применены в ссылках
$nav_rub = '&rubric_id=' . (int)$_REQUEST['rubric_id'];
$sql = $AVE_DB->Query("
SELECT
Id,
rubric_field_type,
rubric_field_title
FROM
" . PREFIX . "_rubric_fields
WHERE
rubric_id = '" . $_REQUEST['rubric_id'] ."'
ORDER BY
rubric_field_position ASC
");
$fields = array();
while($row = $sql->FetchRow())
{
array_push($fields, $row);
}
$AVE_Template->assign('fields', $fields);
}
$ex_db = '';
// Поиск с учётом условий настроек рубрик
if (! isset($_REQUEST['rubric_id']) && empty($_REQUEST['QueryTitel']))
{
// Формируем условия, которые будут применены в запросе к БД
$ex_rub = " AND rub.rubric_docs_active = '1'";
// формируем условия для бд
$ex_db = "LEFT JOIN " . PREFIX . "_rubrics as rub on rub.Id = rubric_id";
}
$ex_lang = '';
// Поиск с учётом языка документа
if (isset($_REQUEST['lang_id']) && $_REQUEST['lang_id'] != '')
{
// Формируем условия, которые будут применены в запросе к БД
$ex_lang = " AND doc.document_lang = '{$_REQUEST["lang_id"]}'";
$nav_lang = '&lang_id=' . $_REQUEST['lang_id'];
}
else
$nav_lang = '';
// Поиск с выводом всех результатов из всех рубрик
if (@$_REQUEST['rubric_id'] == 'all')
{
$nav_rub = '&rubric_id=all';
}
// Если в запросе пришел параметр на фильтрацию документов по определенному временному интервалу
if (@$_REQUEST['document_published'] && @$_REQUEST['document_expire'])
{
// Формируем условия, которые будут применены в запросе к БД
$ex_time = 'AND ((doc.document_published BETWEEN ' . $this->_documentListStart() . ' AND ' . $this->_documentListEnd() . ') OR doc.document_published = 0)';
// формируем условия, которые будут применены в ссылках
$nav_time = '&TimeSelect=1'
. '&document_published=' . $_REQUEST['document_published']
. '&document_expire=' . $_REQUEST['document_expire'];
}
// Если в запросе пришел параметр на фильтрацию документов по статусу
if (! empty($_REQUEST['status']))
{
// Определяем, какой статус запрашивается и формируем условия, которые будут применены в запросе к БД,
// а также в ссылках, для дальнейшей навигации
switch ($_REQUEST['status'])
{
// С любым статусом
case '':
case 'All':
break;
// Только опубликованные
case 'Opened':
$ex_docstatus = "AND doc.document_status = '1'";
$navi_docstatus = '&status=Opened';
break;
// Только неопубликованные
case 'Closed':
$ex_docstatus = "AND doc.document_status = '0'";
$navi_docstatus = '&status=Closed';
break;
// Помеченные на удаление
case 'Deleted':
$ex_docstatus = "AND doc.document_deleted = '1'";
$navi_docstatus = '&status=Deleted';
break;
}
}
// Определяем группу пользоваеля и id документа, если он присутствует в запросе
// $ex_delete = (UGROUP != 1) ? "AND doc.document_deleted != '1'" : '' ;
$w_id = !empty($_REQUEST['doc_id'])
? " AND doc.Id = '" . $_REQUEST['doc_id'] . "'"
: '';
// Выполняем запрос к БД на получение количества документов соответствующих вышеопределенным условиям
$sql = "
SELECT COUNT(doc.Id)
FROM " . PREFIX . "_documents as doc
" . $ex_db . "
" . $sql_join_field . "
WHERE 1
" . $ex_delete . "
" . $ex_time . "
" . $ex_titel . "
" . $ex_rub . "
" . $ex_docstatus . "
" . $ex_lang . "
" . $w_id . "
" . $sql_where_field . "
";
$num = $AVE_DB->Query($sql)->GetCell();
// Определяем лимит документов, который будет показан на 1 странице
$limit = (isset($_REQUEST['Datalimit']) && is_numeric($_REQUEST['Datalimit']) && $_REQUEST['Datalimit'] > 0)
? $_REQUEST['Datalimit']
: $limit = $this->_limit;
$nav_limit = '&Datalimit=' . $limit;
// Определяем количество страниц, которые будут сформированы на основании количества полученных документов
$pages = ceil($num / $limit);
$start = get_current_page() * $limit - $limit;
$db_sort = 'ORDER BY doc.Id DESC';
$navi_sort = '&sort=id_desc';
// Параметры вывборки документов
$search_query = base64_encode($_SERVER['QUERY_STRING']);
// Если в запросе используется параметр сортировки
if (!empty($_REQUEST['sort']))
{
// Определяем, по какому параметру происходит сортировка
switch ($_REQUEST['sort'])
{
// По id документа, по возрастанию
case 'id' :
$db_sort = 'ORDER BY doc.Id ASC';
$navi_sort = '&sort=id';
break;
// По id документа, по убыванию
case 'id_desc' :
$db_sort = 'ORDER BY doc.Id DESC';
$navi_sort = '&sort=id_desc';
break;
// По названию документа, в алфавитном порядке
case 'title' :
$db_sort = 'ORDER BY doc.document_title ASC';
$navi_sort = '&sort=title';
break;
// По названию документа, в обратном алфавитном порядке
case 'title_desc' :
$db_sort = 'ORDER BY doc.document_title DESC';
$navi_sort = '&sort=title_desc';
break;
// По url-адресу, в алфавитном порядке
case 'alias' :
$db_sort = 'ORDER BY doc.document_alias ASC';
$navi_sort = '&sort=alias';
break;
// По url-адресу, в обратном алфавитном порядке
case 'alias_desc' :
$db_sort = 'ORDER BY doc.document_alias DESC';
$navi_sort = '&sort=alias_desc';
break;
// По id рубрики, по возрастанию
case 'rubric' :
$db_sort = 'ORDER BY doc.rubric_id ASC';
$navi_sort = '&sort=rubric';
break;
// По id рубрики, по убыванию
case 'rubric_desc' :
$db_sort = 'ORDER BY doc.rubric_id DESC';
$navi_sort = '&sort=rubric_desc';
break;
// По дате публикации, по возрастанию
case 'published' :
$db_sort = 'ORDER BY doc.document_published ASC';
$navi_sort = '&sort=published';
break;
// По дате публикации, по убыванию
case 'published_desc' :
$db_sort = 'ORDER BY doc.document_published DESC';
$navi_sort = '&sort=published_desc';
break;
// По количеству просмотров, по возрастанию
case 'view' :
$db_sort = 'ORDER BY doc.document_count_view ASC';
$navi_sort = '&sort=view';
break;
// По количеству просмотров, по убыванию
case 'view_desc' :
$db_sort = 'ORDER BY doc.document_count_view DESC';
$navi_sort = '&sort=view_desc';
break;
// По количеству печати документа, по возрастанию
case 'print' :
$db_sort = 'ORDER BY doc.document_count_print ASC';
$navi_sort = '&sort=print';
break;
// По количеству печати документа, по убыванию
case 'print_desc' :
$db_sort = 'ORDER BY doc.document_count_print DESC';
$navi_sort = '&sort=print_desc';
break;
// По автору, по алфавитному возрастанию
case 'author' :
$db_sort = 'ORDER BY doc.document_author_id ASC';
$navi_sort = '&sort=author';
break;
// По автору, по алфавитному убыванию
case 'author_desc' :
$db_sort = 'ORDER BY doc.document_author_id DESC';
$navi_sort = '&sort=author_desc';
break;
// По дате последнего редактирования, по возрастанию
case 'changed':
$db_sort = 'ORDER BY doc.document_changed ASC';
$navi_sort = '&sort=changed';
break;
// По дате последнего редактирования, по убыванию
case 'changed_desc':
$db_sort = 'ORDER BY doc.document_changed DESC';
$navi_sort = '&sort=changed_desc';
break;
// По языку документа, по возрастанию
case 'lang':
$db_sort = 'ORDER BY doc.document_lang ASC';
$navi_sort = '&sort=lang';
break;
// По языку документа, по убыванию
case 'lang_desc':
$db_sort = 'ORDER BY doc.document_lang DESC';
$navi_sort = '&sort=lang_desc';
break;
// По умолчанию, по дате последнего редактирования по убыванию.
// Последний отредактированный документ, будет первым в списке.
default :
$db_sort = 'ORDER BY doc.document_changed DESC';
$navi_sort = '&sort=changed_desc';
break;
}
}
$docs = array();
// Выполняем запрос к БД на получение уже не количества документов, отвечающих условиям, а уже на
// получение всех данных, с учетом всех условий, а также типа сортировки и лимита для вывода на
// одну страницу.
$sql = "
SELECT STRAIGHT_JOIN SQL_CALC_FOUND_ROWS
doc.*,
rub.rubric_admin_teaser_template
FROM
" . PREFIX . "_documents as doc
LEFT JOIN
" . PREFIX . "_rubrics AS rub
ON rub.Id = doc.rubric_id
" . $sql_join_field . "
WHERE 1
" . $ex_rub . "
" . $ex_delete . "
" . $ex_time . "
" . $ex_titel . "
" . $ex_docstatus . "
" . $ex_lang . "
" . $w_id . "
" . $sql_where_field . "
" . $db_sort . "
LIMIT
" . $start . "," . $limit . "
";
$sql = $AVE_DB->Query($sql);
// Циклически обрабатываем полученные данные с целью приведения некоторых из них к удобочитаемому виду
while ($row = $sql->FetchRow())
{
// Запомниаем в сесии, параметры выборки для документа
$_SESSION['search_query'][$row->Id] = $search_query;
// Определяем количество комментариев, оставленных для данного документа
$row->ist_remark = $AVE_DB->Query("
SELECT
COUNT(*)
FROM
" . PREFIX . "_document_remarks
WHERE
document_id = '" . $row->Id . "'
")->GetCell();
$this->documentPermissionFetch($row->rubric_id);
// Получаем название рубрики по ее Id
$row->RubName = $AVE_Rubric->rubricNameByIdGet($row->rubric_id)->rubric_title;
$row->document_author = get_username_by_id($row->document_author_id); // Получаем имя пользователя (Автора)
$row->cantEdit = 0;
$row->canDelete = 0;
$row->canEndDel = 0;
$row->canOpenClose = 0;
$row->rubric_admin_teaser_template = @eval2var(' ?>'.($row->rubric_admin_teaser_template>''
? @showrequestelement($row, $row->rubric_admin_teaser_template)
: '').'<?php ');
$row->document_title = stripslashes(htmlspecialchars_decode($row->document_title));
$row->document_breadcrum_title = stripslashes(htmlspecialchars_decode($row->document_breadcrum_title));
$lang_pack = array();
if($row->document_lang_group > 0)
{
$sql1 = $AVE_DB->Query("
SELECT SQL_CALC_FOUND_ROWS
Id,
rubric_id,
document_alias,
document_lang,
document_status
FROM
".PREFIX."_documents
WHERE
document_lang_group=" . $row->document_lang_group . "
OR
Id = " . $row->document_lang_group
);
while ($row1 = $sql1->FetchAssocArray())
{
$lang_pack[$row1['document_lang']] = $row1;
}
}
$row->lang_pack = $lang_pack;
// разрешаем редактирование и удаление
// если автор имеет право изменять свои документы в рубрике
// или пользователю разрешено изменять все документы в рубрике
if (
($row->document_author_id == @$_SESSION['user_id'] && isset($_SESSION[$row->rubric_id . '_editown']) && @$_SESSION[$row->rubric_id . '_editown'] == 1)
||
(isset($_SESSION[$row->rubric_id . '_editall']) && $_SESSION[$row->rubric_id . '_editall'] == 1)
)
{
$row->cantEdit = 1;
$row->canDelete = 1;
$row->canOpenClose = 1;
}
// запрещаем редактирование главной страницы и страницу ошибки 404 если требуется одобрение Администратора
if ( ($row->Id == 1 || $row->Id == PAGE_NOT_FOUND_ID)
&& isset($_SESSION[$row->rubric_id . '_newnow']) && @$_SESSION[$row->rubric_id . '_newnow'] != 1)
{
$row->cantEdit = 0;
}
// разрешаем автору блокировать и разблокировать свои документы если не требуется одобрение Администратора
if ($row->document_author_id == @$_SESSION['user_id']
&& isset($_SESSION[$row->rubric_id . '_newnow']) && @$_SESSION[$row->rubric_id . '_newnow'] == 1)
{
$row->canOpenClose = 1;
}
// разрешаем всё, если пользователь принадлежит группе Администраторов или имеет все права на рубрику
if (UGROUP == 1 || @$_SESSION[$row->rubric_id . '_alles'] == 1)
{
$row->cantEdit = 1;
$row->canDelete = 1;
$row->canEndDel = 1;
$row->canOpenClose = 1;
}
// Запрещаем удаление Главной страницы и страницы с 404 ошибкой
if ($row->Id == 1 || $row->Id == PAGE_NOT_FOUND_ID)
{
$row->canDelete = 0;
$row->canEndDel = 0;
}
array_push($docs, $row);
}
// Передаем полученные данные в шаблон для вывода
$AVE_Template->assign('docs', $docs);
$link = "index.php?do=docs";
$link .= (isset($_REQUEST['action']) && $_REQUEST['action'] == 'showsimple') ? '&action=showsimple' : '';
$link .= !empty($_REQUEST['target']) ? '&target=' . urlencode($_REQUEST['target']) : '';
$link .= !empty($_REQUEST['doc']) ? '&doc=' . urlencode($_REQUEST['doc']) : '';
$link .= !empty($_REQUEST['document_alias']) ? '&document_alias=' . urlencode($_REQUEST['document_alias']) : '';
$link .= !empty($_REQUEST['navi_item_target']) ? '&navi_item_target=' . urlencode($_REQUEST['navi_item_target']) : '';
$link .= $navi_docstatus;
$link .= $nav_titel;
$link .= $nav_rub;
$link .= $nav_lang;
$link .= $nav_time;
$link .= $nav_limit;
$link .= $field_link;
$link .= (isset($_REQUEST['selurl']) && $_REQUEST['selurl'] == 1) ? '&selurl=1' : '';
$link .= (isset($_REQUEST['selecturl']) && $_REQUEST['selecturl'] == 1) ? '&selecturl=1' : '';
$link .= (isset($_REQUEST['function']) && $_REQUEST['function'] == 1) ? '&function=1' : '';
$link .= (isset($_REQUEST['idonly']) && $_REQUEST['idonly'] == 1) ? '&idonly=1' : '';
$link .= (isset($_REQUEST['idtitle']) && $_REQUEST['idtitle'] == 1) ? '&idtitle=1' : '';
$link .= (isset($_REQUEST['pop']) && $_REQUEST['pop'] == 1) ? '&pop=1' : '';
$link .= (isset($_REQUEST['onlycontent']) && $_REQUEST['onlycontent'] == 1) ? '&onlycontent=1' : '';
$link .= (isset($_REQUEST['langCode']) && !empty($_REQUEST['langCode'])) ? '&langCode='.$_REQUEST['langCode'] : '';
$link .= (isset($_REQUEST['CKEditor']) && !empty($_REQUEST['CKEditor'])) ? '&CKEditor='.$_REQUEST['CKEditor'] : '';
$link .= (isset($_REQUEST['CKEditorFuncNum']) && $_REQUEST['CKEditorFuncNum'] == 1) ? '&CKEditorFuncNum=1' : '';
$AVE_Template->assign('link', $link);
// Если количество отобранных документов превышает лимит на одной странице - формируем постраничную навигацию
if ($num > $limit)
{
$page_nav = get_pagination($pages, 'page', ' <a href="' . $link . $navi_sort . '&page={s}'.(empty($_REQUEST['rubric_id'])
? ''
: '&rubric_id='.$_REQUEST['rubric_id']).'&cp=' . SESSION . '">{t}</a>');
$AVE_Template->assign('page_nav', $page_nav);
}
$AVE_Template->assign('DEF_DOC_START_YEAR', mktime(0, 0, 0, date("m"), date("d"), date("Y") - 10));
$AVE_Template->assign('DEF_DOC_END_YEAR', mktime(0, 0, 0, date("m"), date("d"), date("Y") + 10));
}
/**
* Метод, предназначенный для сохранения статусов документа в БД
*
*/
function documentEditStatus()
{
global $AVE_DB;
switch(@$_REQUEST['moderation'])
{
// статусы
case "1" :
foreach (@$_REQUEST['document'] as $id => $status)
{
if (is_numeric($id) && is_numeric($status))
{
$AVE_DB->Query("UPDATE " . PREFIX . "_documents SET document_status = '1' WHERE Id = '".$id."' ");
}
}
break;
// статусы
case "0" :
foreach (@$_REQUEST['document'] as $id => $status)
{
if (is_numeric($id) && is_numeric($status))
{
$AVE_DB->Query("UPDATE " . PREFIX . "_documents SET document_status = '0' WHERE Id = '".$id."' ");
}
}
break;
// в корзину
case "intrash" :
foreach (@$_REQUEST['document'] as $id => $status)
{
if (is_numeric($id) && is_numeric($status))
{
$AVE_DB->Query("UPDATE " . PREFIX . "_documents SET document_deleted = '1' WHERE Id = '".$id."' ");
}
}
break;
// из корзины
case "outtrash" :
foreach (@$_REQUEST['document'] as $id => $status)
{
if (is_numeric($id) && is_numeric($status))
{
$AVE_DB->Query("UPDATE " . PREFIX . "_documents SET document_deleted = '0' WHERE Id = '".$id."' ");
}
}
break;
// совсем удалить
case "trash" :
foreach (@$_REQUEST['document'] as $id => $status)
{
if (is_numeric($id) && is_numeric($status))
{
$AVE_DB->Query("DELETE FROM " . PREFIX . "_documents WHERE Id = '".$id."'");
$AVE_DB->Query("DELETE FROM " . PREFIX . "_document_fields WHERE document_id = '".$id."'");
$AVE_DB->Query("DELETE FROM " . PREFIX . "_document_fields_text WHERE document_id = '".$id."'");
}
}
break;
}
header('Location:index.php?do=docs'.(empty($_REQUEST['rubric_id']) ? '' : '&rubric_id='.$_REQUEST['rubric_id']).'&cp=' . SESSION);
exit;
}
/**
* Функция предназначенна для анализа ключевых слов и разненсения их по табличке _document_keyword
*
*/
function generateKeywords($document_id, $keywords=null)
{
global $AVE_DB;
if (! $keywords)
$keywords = $AVE_DB->Query("SELECT document_meta_keywords FROM " . PREFIX . "_documents WHERE Id = " . intval($document_id) . " LIMIT 1")->GetCell();
$keywords = explode(',', $keywords);
$res = $AVE_DB->Query("DELETE FROM " . PREFIX . "_document_keywords where document_id = " . intval($document_id));
foreach ($keywords as $k => $v)
{
if (trim($v) > '')
{
$key = trim(mb_substr($v, 0, 254));
$res = $AVE_DB->Query("INSERT INTO ".PREFIX."_document_keywords
(
document_id,
keyword
)
VALUES
(
'".intval($document_id)."',
'".clean_no_print_char($key)."'
)
");
}
}
}
/**
* Функция предназначенна для анализа ключевых слов и разненсения их по табличке _document_tags
*
*/
function generateTags($document_id,$keywords=null)
{
global $AVE_DB;
if (! $keywords)
$keywords = $AVE_DB->Query("SELECT document_tags FROM " . PREFIX . "_documents WHERE Id=" . intval($document_id) . " LIMIT 1")->GetCell();
$keywords = explode(',',$keywords);
$res = $AVE_DB->Query("DELETE FROM " . PREFIX . "_document_tags where document_id = " . intval($document_id));
foreach($keywords as $k => $v)
{
if (trim($v) > '')
{
$key = trim(mb_substr($v, 0, 254));
$res = $AVE_DB->Query("
INSERT
INTO
" . PREFIX . "_document_tags
(
document_id,
tag
)
VALUES
(
'" . intval($document_id) . "',
'" . clean_no_print_char($key) . "'
)
");
}
}
}
/**
* Метод, предназначенный для сохранения ревизии документа в БД
*
*/
static function SaveRevission($document_id)
{
global $AVE_DB;
$sql = $AVE_DB->Query("
SELECT
doc.rubric_field_id,
doc.field_value,
more.field_value as more
FROM
" . PREFIX . "_document_fields AS doc
LEFT JOIN
" . PREFIX . "_document_fields_text AS more
ON
(more.rubric_field_id = doc.rubric_field_id and more.document_id=doc.document_id)
WHERE
doc.document_id = '" . $document_id . "'
");
$rows = array();
while ($row = $sql->FetchAssocArray())
{
$row['field_value'] = (string)$row['field_value'] . (string)$row['more'];
$rows[$row['rubric_field_id']] = pretty_chars(clean_no_print_char($row['field_value']));
}
$dtime = $AVE_DB->Query('SELECT document_changed FROM ' . PREFIX . '_documents WHERE Id = ' . $document_id)->GetCell();
$last_rev = @unserialize($AVE_DB->Query("SELECT doc_data FROM " . PREFIX . "_document_rev WHERE doc_id=" . $document_id . " ORDER BY doc_revision DESC LIMIT 1")->GetCell());
// это я долго пытался понять почему всегда старая ревизия не равна новой даже если просто нажали лишний раз сохранить
// оказывается редактор подсовывет alt="" если альта в имге нету и сносит его если он есть там пустой ))))))))))
// но пусть проверка будет - может редакторы сменятся/апдейтятся а может кто просто хардкором будет код править)))
$dorev = false;
foreach ($rows as $k => $v)
{
if ($rows[$k] <> $last_rev[$k])
{
$dorev = true;
}
}
if ($dorev)
{
$AVE_DB->Query("
INSERT INTO
" . PREFIX . "_document_rev
SET
doc_id = '" . $document_id . "',
doc_revision = '" . $dtime . "',
doc_data = '" . addslashes(serialize($rows)) . "',
user_id = '" . $_SESSION['user_id'] ."'
");
}
return $rows;
}
/**
* Метод, предназначенный для востановления ревизии документа
*
*/
function documentRevissionRestore($document_id, $revision, $rubric_id)
{
global $AVE_DB, $AVE_Template;
$this->documentPermissionFetch($rubric_id);
if ( (isset($_SESSION[$rubric_id . '_delrev']) && $_SESSION[$rubric_id . '_delrev'] == 1)
|| (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1)
|| (defined('UGROUP') && UGROUP == 1) )
{
$run = true;
}
if ($run === true)
{
$res = $AVE_DB->Query("
SELECT
doc_data
FROM
" . PREFIX . "_document_rev
WHERE
doc_id = '" . $document_id . "'
AND
doc_revision = '" . $revision . "'
LIMIT 1
")->GetCell();
if (! $res)
return false;
$data = @unserialize($res);
foreach($data as $k => $v)
{
if ($k)
{
$AVE_DB->Query("
UPDATE
" . PREFIX . "_document_fields
SET
field_value = '" . mb_substr($v,0,499) . "',
field_number_value = '" . preg_replace('/[^\d.]/', '', $v) . "'
WHERE
document_id = '" . $document_id . "'
AND
rubric_field_id = '" . $k . "'
");
if (mb_strlen($v) > 500)
{
$AVE_DB->Query("
UPDATE
" . PREFIX . "_document_fields_text
SET
field_value = '" . mb_substr($v,500) . "'
WHERE
document_id = '" . $document_id . "'
AND
rubric_field_id = '" . $k . "'
");
}
else
{
$AVE_DB->Query("
DELETE
FROM
". PREFIX . "_document_fields_text
WHERE
document_id= '" . $document_id . "'
AND
rubric_field_id='" . $k . "'
");
}
}
}
// Сохраняем системное сообщение в журнал
reportLog($AVE_Template->get_config_vars('DOC_REVISION_RECOVER')." (Doc: $document_id Rev: $revision)");
header('Location:index.php?do=docs&action=edit&Id=' . (int)$_REQUEST['doc_id'] . '&rubric_id=' . (int)$_REQUEST['rubric_id'] . '&cp=' . SESSION);
}
else
{
$AVE_Template->assign('content', $AVE_Template->get_config_vars('DOC_NO_RES_REVISION'));
}
}
/**
* Метод, предназначенный для удаления ревизии документа
*
*/
function documentRevissionDelete($document_id, $revision, $rubric_id){
global $AVE_DB, $AVE_Template;
$this->documentPermissionFetch($rubric_id);
if ( (isset($_SESSION[$rubric_id . '_delrev']) && $_SESSION[$rubric_id . '_delrev'] == 1)
|| (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1)
|| (defined('UGROUP') && UGROUP == 1) ){ $run = true; }
if ($run === true)
{
$AVE_DB->Query("
DELETE
FROM
" . PREFIX . "_document_rev
WHERE
doc_id = '" . $document_id . "'
AND
doc_revision='".$revision."'
");
reportLog($AVE_Template->get_config_vars('DOC_REVISION_DELETE')." (Doc: $document_id Rev: $revision)");
if (! isset($_REQUEST['ajax']))
{
header('Location:index.php?do=docs&action=edit&rubric_id=' . $rubric_id . '&Id=' . $document_id . '&cp=' . SESSION);
}
}
else
{
$AVE_Template->assign('content', $AVE_Template->get_config_vars('DOC_NO_DEL_REVISION'));
}
}
/**
* Метод, предназначенный для сохранения документа в БД
*
* @param int $rubric_id Идентификатор Рубрики
* @param int $document_id Идентификатор Документа или null, если документ новый
* @param array $data Документ в массиве структура - хитрая
* @param bool $update_non_exists_fields Изменять поля на пустые значения у не переданных полей или не надо
* @param bool $rubric_code Использовать код рубрики или не надо
* @param bool $revisions Использовать ревизии документов
* @param bool $logs Писать системные сообщения в журнал
* @param bool $generate Генерировать Meta
*
* return int/bool Возвращает номер документа если все удачно или false если все плохо
*/
function documentSave ($rubric_id, $document_id, $data, $update_non_exists_fields = false, $rubric_code = true, $revisions = true, $logs = true, $generate = true)
{
global $AVE_DB, $AVE_Template;
//-- Проверяем входящие данные -- //
// Если отсутсвует рубрика, ничего не делаем
if(! $rubric_id)
return false;
// Если отсутсвуют данные, ничего не делаем
if(! isset($data))
return false;
// Если отсутсвуют данные полей, ничего не делаем
if(! isset($data['feld']))
return false;
$rubric_id = (int)$rubric_id;
$document_id = (int)$document_id;
// Определяем тип опреации
$oper = 'INSERT';
// Забираем параметры рубрики
$_rubric = $this->_get_rubric($rubric_id);
// Запускаем триггер перед сохранением
Hooks::trigger('DocumentBeforeSave', array('rubric_id' => $rubric_id, 'document_id' => $document_id, 'data' => $data, 'requests' => $_REQUEST));
// Выполняем стартовый код рубрики
if ($rubric_code)
eval ('?'.'>' . $_rubric->rubric_code_start . '<'.'?');
// Если нет данных для сохранения, перкращаем сохранение и переходим на страницу документов
if (empty($data))
{
header('Location:index.php?do=docs&rubric_id=' . $rubric_id . '&cp=' . SESSION);
exit;
}
// Если есть ID документа, то ставим оператор UPDATE
if ($document_id > 0)
$oper = 'UPDATE';
// Если пользователь имеет права на добавление документов в указанную рубрику, тогда
if ($oper == 'INSERT' && !( (isset($_SESSION[$rubric_id . '_newnow']) && $_SESSION[$rubric_id . '_newnow'] == 1)
|| (isset($_SESSION[$rubric_id . '_new']) && $_SESSION[$rubric_id . '_new'] == 1)
|| (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1)
|| (defined('UGROUP') && UGROUP == 1) ))
return false;
// Title документа
$data['document_title'] = $_url = empty($data['document_title'])
? $AVE_Template->get_config_vars('DOC_WITHOUT_TITLE')
: $data['document_title'];
// Если оператор равен UPDATE
if ($oper == 'UPDATE')
{
// Выполняем запрос к БД на получение автора документа и id Рубрики
$row = $AVE_DB->Query("
SELECT
rubric_id,
document_author_id
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
")->FetchRow();
// Присваиваем значение переменной $rubric_id
$rubric_id = $row->rubric_id;
// Запрещаем редактирвание
$row->cantEdit = 0;
// Определяем права доступа к документам в данной рубрики
$this->documentPermissionFetch($row->rubric_id);
// Разрешаем редактирование
// если автор имеет право изменять свои документы в рубрике
// или пользователю разрешено изменять все документы в рубрике
if ( (isset($_SESSION['user_id']) && $row->document_author_id == $_SESSION['user_id'] &&
isset($_SESSION[$row->rubric_id . '_editown']) && $_SESSION[$row->rubric_id . '_editown'] == 1)
|| (isset($_SESSION[$row->rubric_id . '_editall']) && @$_SESSION[$row->rubric_id . '_editall'] == 1) )
{
// Разрешаем редактирование
$row->cantEdit = 1;
}
// Запрещаем редактирование главной страницы и страницы ошибки 404 если требуется одобрение Администратора
if ( ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) && @$_SESSION[$row->rubric_id . '_editall'] != 1 )
{
// Запрещаем редактирвание
$row->cantEdit = 0;
}
// Разрешаем редактирование, если пользователь принадлежит группе Администраторов или имеет все права на рубрику
if ( (defined('UGROUP') && UGROUP == 1)
|| (isset($_SESSION[$row->rubric_id . '_alles']) && $_SESSION[$row->rubric_id . '_alles'] == 1) )
{
// Разрешаем редактирование
$row->cantEdit = 1;
}
// выходим если нельзя редактировать
if(! $row->cantEdit==1 )
return false;
//-- Обрабатываем все данные, пришедшие в запросе --//
// Поиск по документу 1 - Да / 0 - Нет
$search = (isset($data['document_in_search']) && $data['document_in_search'] == 1)
? '1'
: '0';
// Если пользователь имеет права на добавление/редактирование документов в указанную рубрику, тогда
if (
(isset($_SESSION[$row->rubric_id . '_newnow']) && $_SESSION[$row->rubric_id . '_newnow'] == 1)
||
(isset($_SESSION[$row->rubric_id . '_editall']) && $_SESSION[$row->rubric_id . '_editall'] == 1)
||
(isset($_SESSION[$row->rubric_id . '_alles']) && $_SESSION[$row->rubric_id . '_alles'] == 1)
||
(defined('UGROUP') && UGROUP == 1)
)
{
// Статус документа 1 - Опубликован / 0 - Нет
$document_status = (isset($data['document_status'])
? $data['document_status']
: '0');
}
else
{
// Не опубликован
$document_status = '0';
}
// Если ID документа равно 1 или ID равно Документа 404
// то стату всегда будет 1
$document_status = ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID)
? '1'
: $document_status;
// Формируем/проверяем адрес на уникальность
if ($document_id != 1)
{
$data['document_alias'] = $_url = prepare_url(empty($data['document_alias'])
? trim($_POST['prefix'] . '/' . $data['document_title'], '/')
: $data['document_alias']);
}
// Если ID документа = 1, то алиас не меняем
else
{
$data['document_alias'] = "/";
}
$cnt = 1;
// Проверяем адрес на уникальность, если не уникален
// добавляем число к адресу
while ($AVE_DB->Query("
SELECT 1
FROM
" . PREFIX . "_documents
WHERE
Id != '" . $document_id . "'
AND
document_alias = '" . $data['document_alias'] . "'
LIMIT 1
")->NumRows() == 1)
{
$data['document_alias'] = $_url . '-' . $cnt;
$cnt++;
}
}
// Если оператор INSERT
else
{
// Поиск по документу 1 - Да / 0 - Нет
$search = (isset($data['document_in_search']) && $data['document_in_search'] == 1)
? '1'
: '0';
// Статус документа 1 - Опубликован / 0 - Нет
$document_status = ! empty($data['document_status'])
? (int)$data['document_status']
: '0';
// Формируем/проверяем адрес на уникальность
$data['document_alias'] = $_url = prepare_url(empty($data['document_alias'])
? trim($data['prefix'] . '/' . $data['document_title'], '/')
: $data['document_alias']);
$cnt = 1;
// Проверяем адрес на уникальность, если не уникален
// добавляем число к адресу
while (
$AVE_DB->Query("
SELECT 1
FROM
" . PREFIX . "_documents
WHERE
document_alias = '" . $data['document_alias'] . "'
LIMIT 1
")->NumRows()
)
{
$data['document_alias'] = $_url . '-' . $cnt;
$cnt++;
}
}
// Если оператор UPDATE, забираем перед сохранением старый алиас документа
if ($oper == 'UPDATE')
{
$data['document_alias_old'] = $AVE_DB->Query("
SELECT
document_alias
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
")->GetCell();
}
else
{
// Если оператор INSERT
// Если новый алиас документа, совпадает с алиасом в истории, просто стираем историю
$AVE_DB->Query("
DELETE FROM
". PREFIX . "_document_alias_history
WHERE
document_alias = '" . $data['document_alias'] . "'
");
}
// Дата публикации документа
// Для документов с ID = 1 и Ошибки 404, дата не пишется
$data['document_published'] = ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID)
? '0'
: $this->_documentStart($data['document_published']);
// Дата окончания публикации документа
// Для документов с ID = 1 и Ошибки 404, дата не пишется
$data['document_expire'] = ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID)
? '0'
: $this->_documentEnd($data['document_expire']);
// Дата изменения документа
$data['document_changed'] = time();
// Использовать ли историю алиасов
$data['document_alias_history'] = (empty($data['document_alias_history']))
? '0'
: $data['document_alias_history'];
// Sitemap
$data['document_sitemap_freq'] = ($data['document_sitemap_freq'] != ''
? (int)$data['document_sitemap_freq']
: 3);
// Sitemap
$data['document_sitemap_pr'] = ($data['document_sitemap_pr'] != ''
? $data['document_sitemap_pr']
: '0.5');
$data['document_linked_navi_id'] = ($data['document_linked_navi_id'] != ''
? $data['document_linked_navi_id']
: 0);
$fields = array();
// Получаем структуру документа
if ($oper == 'INSERT')
{
$sql = "
SELECT
*
FROM
" . PREFIX . "_rubric_fields
WHERE
rubric_id = '" . $rubric_id . "'
ORDER BY
rubric_field_position ASC
";
}
else
{
$sql = "
SELECT
rub.*,
rubric_field_default,
df.field_value
FROM
" . PREFIX . "_rubric_fields AS rub
LEFT JOIN
" . PREFIX . "_document_fields AS df
ON rubric_field_id = rub.Id
WHERE
document_id = '" . $document_id . "'
ORDER BY
rubric_field_position ASC
";
}
$query = $AVE_DB->Query($sql);
// Если пришел вызов поля, который связан с модулем
if (isset($data['field_module']))
{
while(list($mod_key, $mod_val) = each($_REQUEST['field_module']))
{
require_once(BASE_DIR . '/modules/' . $mod_val . '/document.php');
$mod_function = (string)$mod_val . '_document_save';
$fields = $mod_function($mod_key, $mod_val, $query, $data['feld'][$mod_key], $mod_key, $rubric_id);
}
}
else
{
while ($row = $query->FetchRow())
{
$fields[$row->Id] = $row;
}
}
unset ($sql, $query);
$where = ($oper == 'UPDATE' ? 'WHERE Id = ' . $document_id : '');
$author = ($oper != 'UPDATE' ? 'document_author_id = ' . $_SESSION['user_id'] . ',' : '');
$operator = ($oper == 'UPDATE' ? "UPDATE " . PREFIX . "_documents" : "INSERT INTO " . PREFIX . "_documents");
$breadcrumb_title = (isset($data['document_breadcrum_title']) && $data['document_breadcrum_title'] != '')
? $data['document_breadcrum_title']
: '';
$document_tags = isset($data['document_tags'])
? $data['document_tags']
: '';
// Сохраняем все параметры документа
$sql = "
$operator
SET
rubric_id = '" . $rubric_id . "',
rubric_tmpl_id = '" . (int)$data['rubric_tmpl_id'] . "',
document_parent = '" . (int)$data['document_parent'] . "',
document_title = '" . htmlspecialchars(clean_no_print_char($data['document_title']), ENT_QUOTES) . "',
document_breadcrum_title = '" . htmlspecialchars(clean_no_print_char($breadcrumb_title), ENT_QUOTES) . "',
document_alias = '" . $data['document_alias'] . "',
document_alias_history = '" . $data['document_alias_history'] . "',
document_published = '" . $data["document_published"] . "',
document_expire = '" . $data["document_expire"] . "',
document_changed = '" . $data["document_changed"] . "',
$author
document_in_search = '" . $search . "',
document_meta_keywords = '" . htmlspecialchars(clean_no_print_char($data['document_meta_keywords']), ENT_QUOTES) . "',
document_meta_description = '" . htmlspecialchars(clean_no_print_char($data['document_meta_description']), ENT_QUOTES) . "',
document_meta_robots = '" . $data['document_meta_robots'] . "',
document_sitemap_freq = '" . $data['document_sitemap_freq'] . "',
document_sitemap_pr = '" . $data['document_sitemap_pr'] . "',
document_status = '" . $data['document_status'] . "',
document_linked_navi_id = '" . (int)$data['document_linked_navi_id'] . "',
document_tags = '" . addslashes(htmlspecialchars(clean_no_print_char($document_tags))). "',
document_lang = '" . (empty($data['document_lang']) ? DEFAULT_LANGUAGE : $data['document_lang']). "',
document_lang_group = '" . (empty($data['document_lang_group']) ? '0' : (int)$data['document_lang_group']). "',
document_property = '" . (empty($data['document_property']) ? '' : $data['document_property']). "'
$where
";
$AVE_DB->Query($sql);
// Получаем id добавленной записи
$iid = $AVE_DB->InsertId();
// Сохраняем ревизию документа
if ($oper == 'UPDATE' && $revisions)
$this->SaveRevission($document_id);
// Переназначаем $document_id
$document_id = $_REQUEST['Id'] = ($oper == "INSERT" ? $iid : $document_id);
//Проверяем алиас на изменения (Старый/Новый)
if (
$oper == 'UPDATE'
AND $data['document_alias'] != $data['document_alias_old']
AND (
($data['document_alias_history'] == '0' AND $_rubric->rubric_alias_history == '1')
OR
($data['document_alias_history'] == '1')
)
AND
($AVE_DB->Query("
SELECT 1
FROM
" . PREFIX . "_document_alias_history
WHERE
document_alias = '" . $data['document_alias_old'] . "'
LIMIT 1
")->NumRows() == 0)
)
{
$AVE_DB->Query("
INSERT INTO
" . PREFIX . "_document_alias_history
SET
document_id = '" . $document_id . "',
document_alias = '" . $data['document_alias_old'] . "',
document_alias_author = '" . $_SESSION['user_id'] . "',
document_alias_changed = '" . time() . "'
");
}
// Сохраняем системное сообщение в журнал
if ($logs)
reportLog(($oper=='INSERT'
? $AVE_Template->get_config_vars('DOC_SAVE_ADD')
: $AVE_Template->get_config_vars('DOC_SAVE_EDIT')) . $AVE_Template->get_config_vars('DOC_SAVE_LOG_DOC') .' (' . $data['document_title'] . ' Id: ' . $document_id . ')');
// Получаем ID полей в данной рубрике
$rubric_fields = $this->_get_rubric_fields($rubric_id);
// Получаем ID текстовых полей в данном документе
$document_text_fields = $this->_get_document_text_fields($document_id);
// Циклически обрабатываем поля документа
foreach ($fields as $k => $v)
{
$fld_id = $v->Id;
$slash = false;
// Если в данных нет поля и мы редактируем документ - изменять ли это поле на пустое значение
if ($oper == 'UPDATE' && (! (isset($data['feld'][$fld_id]))) && ! $update_non_exists_fields)
continue;
$fld_val = (isset($data['feld'][$fld_id])
? $data['feld'][$fld_id]
: $v->rubric_field_default);
/* ------------------------------------------------------------------- */
// Если значение поля не является массивом
if (! is_array ($fld_val))
{
// Если запрещено использование php кода, тогда обнуляем данные поля
if (! check_permission('document_php'))
{
if (is_php_code($fld_val))
$fld_val = '';
}
// Убираем из текста непечатабельные символы
$fld_val = clean_no_print_char($fld_val);
$fld_val = pretty_chars($fld_val);
}
// Отправляем полученные данные в функцию поля, в раздел "Save"
// для преобразования перед сохранением
$func = 'get_field_' . $rubric_fields[$fld_id]['rubric_field_type'];
// Если вызывается функция
if (is_callable ($func))
$fld_val = $func($fld_val, 'save', $fld_id, '', 0, $x, 0, 0, 0);
//-- Собираем запрос к БД на добавление нового поля с его содержимым --//
$where = ($oper == 'UPDATE'
? "WHERE document_id = '" . $document_id . "' AND rubric_field_id = '" . $fld_id . "'"
: '');
$operator = ($oper == 'UPDATE'
? "UPDATE " . PREFIX . "_document_fields"
: "INSERT INTO " . PREFIX . "_document_fields");
$insert = ($oper == 'UPDATE'
? ''
: "rubric_field_id = '" . $fld_id . "', document_id = '" . $document_id . "',");
$fval = is_array ($fld_val)
? serialize ($fld_val)
: $fld_val;
$substr = 500;
if (mb_substr($fval, 501, 1))
$substr = 499;
// Сохраняем первые 500 символов
$f_val_500 = mb_substr ($fval, 0, $substr);
// Проверяем чтобы не было в конце слеша - \
if (mb_substr($f_val_500, 498, 1) == '\\')
$slash = true;
if ($slash)
$f_val_500 = rtrim ($f_val_500, '\\');
$sql = "
$operator
SET
$insert
field_value = '" . $f_val_500 . "',
field_number_value = '" . (($rubric_fields[$fld_id]['rubric_field_numeric'])
? preg_replace ('/[^\d.]/', '', $fld_val)
: 0) . "',
document_in_search = '" . $search . "'
$where
";
$AVE_DB->Query($sql);
unset ($sql, $f_val_500, $fld_val);
// Если символов больше 500, то сохраняем их в другой таблице
if (mb_strlen($fval) > $substr)
{
// Проверяем есть ли запись о поле в БД
$check_field = false;
if (in_array ($fld_id, $document_text_fields))
$check_field = true;
$operator = ($check_field
? "UPDATE " . PREFIX . "_document_fields_text"
: "INSERT INTO " . PREFIX . "_document_fields_text"
);
$where = ($check_field
? "WHERE document_id = '" . $document_id . "' AND rubric_field_id = '" . $fld_id . "'"
: '');
$insert = ($check_field
? ''
: "rubric_field_id = '" . $fld_id . "', document_id = '" . $document_id . "',");
$f_val_unlim = mb_substr($fval, $substr);
if ($slash)
$f_val_unlim = '\\' . $f_val_unlim;
$sql = "
$operator
SET
$insert
field_value = '" . $f_val_unlim . "'
$where
";
$AVE_DB->Query($sql);
unset($sql, $f_val_unlim);
}
// Если символов меньше 500, то чистим поле в другой таблице
else
{
$AVE_DB->Query("
DELETE
FROM
". PREFIX . "_document_fields_text
WHERE
document_id = '" . $document_id . "'
AND
rubric_field_id='" . $fld_id . "'
");
}
}
// Очищаем кэш шаблона
$AVE_DB->Query("
DELETE
FROM
" . PREFIX . "_rubric_template_cache
WHERE
doc_id = '" . $document_id . "'
");
$field_module = isset($data['field_module'])
? $data['field_module']
: '';
// Запускаем триггер после сохранения
Hooks::trigger('DocumentAfterSave', array('rubric_id' => $rubric_id, 'document_id' => $document_id, 'data' => $data, 'field_module' => $field_module));
// Выполняем код рубрики, после сохранения
if ($rubric_code)
eval (' ?>' . $_rubric->rubric_code_end . '<?php ');
if ($document_id == 1)
$hash_url = md5('');
else
$hash_url = md5($data['document_alias']);
// Чистим кеш
$AVE_DB->clearcache('rub_' . $rubric_id);
$AVE_DB->clearcache('doc_' . $document_id);
$AVE_DB->clearcompile('doc_' . $document_id);
$AVE_DB->clearCacheUrl('url_' . $hash_url);
$AVE_DB->clearcacherequest('doc_' . $document_id);
unset ($_rubric, $fields);
// Дополнительные обработки
if ($generate)
{
$this->generateKeywords($document_id);
$this->generateTags($document_id);
}
return $document_id;
}
/**
* Метод, предназначенный для добавления нового документа в БД
*
* @param int $rubric_id идентификатор Рубрики
*/
function documentNew($rubric_id)
{
global $AVE_DB, $AVE_Rubric, $AVE_Template;
$this->documentPermissionFetch($rubric_id);
// Если пользователь имеет права на добавление документов в указанную рубрику, тогда
if ( (isset($_SESSION[$rubric_id . '_newnow']) && $_SESSION[$rubric_id . '_newnow'] == 1)
|| (isset($_SESSION[$rubric_id . '_new']) && $_SESSION[$rubric_id . '_new'] == 1)
|| (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1)
|| (defined('UGROUP') && UGROUP == 1) )
{
// Поля
$sql = $AVE_DB->Query("
SELECT
a.*,
b.Id AS group_id,
b.group_title,
b.group_description,
b.group_position
FROM
" . PREFIX . "_rubric_fields AS a
LEFT JOIN
" . PREFIX . "_rubric_fields_group AS b
ON a.rubric_field_group = b.Id
WHERE
a.rubric_id = '" . $rubric_id . "'
ORDER BY
b.group_position ASC,
a.rubric_field_position ASC
");
$fields_list = array();
while ($row = $sql->FetchRow())
{
$group_id = ($row->rubric_field_group) ? $row->rubric_field_group : 0;
$fields_list[$group_id]['group_id'] = $row->group_id;
$fields_list[$group_id]['group_position'] = ($row->group_position) ? $row->group_position : 100;
$fields_list[$group_id]['group_title'] = $row->group_title;
$fields_list[$group_id]['group_description'] = $row->group_description;
$fields_list[$group_id]['fields'][$row->Id]['Id'] = $row->Id;
$fields_list[$group_id]['fields'][$row->Id]['rubric_id'] = $row->rubric_id;
$fields_list[$group_id]['fields'][$row->Id]['rubric_field_title'] = $row->rubric_field_title;
$fields_list[$group_id]['fields'][$row->Id]['rubric_field_description'] = $row->rubric_field_description;
$fields_list[$group_id]['fields'][$row->Id]['rubric_field_default'] = $row->rubric_field_default;
$fields_list[$group_id]['fields'][$row->Id]['result'] = $this->_documentFieldGet($row->rubric_field_type, $row->rubric_field_default, $row->Id, $row->rubric_field_default);
}
$fields_list = msort($fields_list, 'group_position');
$AVE_Template->assign('groups_count', count($fields_list));
$AVE_Template->assign('fields_list', $fields_list);
// Группы полей
$fields_groups = array();
$sql = $AVE_DB->Query("
SELECT *
FROM
" . PREFIX . "_rubric_fields_group
WHERE
rubric_id = '" . $rubric_id . "'
ORDER BY
group_position ASC
");
while ($row = $sql->FetchRow())
{
array_push($fields_groups, $row);
}
$AVE_Template->assign('fields_groups', $fields_groups);
// Определяем вид действия, переданный в параметре sub
switch ($_REQUEST['sub'])
{
case 'save': // Сохранение документа в БД
$public_start = $this->_documentStart(); // Дата/время начала публикации документа
$public_end = $this->_documentEnd(); // Дата/время окончания публикации документа
$innavi = check_permission_acp('navigation_new') ? '&innavi=1' : '';
// Определяем статус документа
$document_status = ! empty($_REQUEST['document_status'])
? (int)$_REQUEST['document_status']
: '0';
// Если статус документа не определен
if (empty($document_status) && $_SESSION['user_group'] != 1)
{
$innavi = '';
@reset($_POST);
$newtext = "\n\n";
// Формируем текст сообщения, состоящий из данных,
// которые пользователь ввел в поля документа
foreach ($_POST['feld'] as $val)
{
if (! empty($val))
{
$newtext .= $val;
$newtext .= "\n---------------------\n";
}
}
$text = strip_tags($newtext);
// Получаем e-mail адрес из общих настроек системы
$system_mail = get_settings('mail_from');
$system_mail_name = get_settings('mail_from_name');
// Отправляем администартору уведомление, о том что необходимо проверить документ
$body_to_admin = $AVE_Template->get_config_vars('DOC_MAIL_BODY_CHECK');
$body_to_admin = str_replace('%N%', "\n", $body_to_admin);
$body_to_admin = str_replace('%TITLE%', stripslashes($_POST['document_title']), $body_to_admin);
$body_to_admin = str_replace('%USER%', "'" . $_SESSION['user_name'] . "'", $body_to_admin);
send_mail(
$system_mail,
$body_to_admin . $text,
$AVE_Template->get_config_vars('DOC_MAIL_SUBJECT_CHECK'),
$system_mail,
$system_mail_name,
'text'
);
// Отправляем уведомление автору, о том что документ находится на проверке
$body_to_author = str_replace('%N%', "\n", $AVE_Template->get_config_vars('DOC_MAIL_BODY_USER'));
$body_to_author = str_replace('%TITLE%', stripslashes($_POST['document_title']), $body_to_author);
$body_to_author = str_replace('%USER%', "'" . $_SESSION['user_name'] . "'", $body_to_author);
send_mail(
$_SESSION['user_email'],
$body_to_author,
$AVE_Template->get_config_vars('DOC_MAIL_SUBJECT_USER'),
$system_mail,
$system_mail_name,
'text'
);
}
if (! ((isset($_SESSION[$rubric_id . '_newnow']) && $_SESSION[$rubric_id . '_newnow'] == 1)
|| (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1)
|| (defined('UGROUP') && UGROUP == 1)) )
{
$document_status = 0;
}
$_POST['document_status'] = $document_status;
$iid = $this->documentSave($rubric_id, null, $_POST, true);
if ($_REQUEST['doc_after'])
header('Location:index.php?do=docs&action=after&document_id=' . $iid . '&rubric_id=' . $rubric_id . '&cp=' . SESSION . $innavi);
else
header('Location:index.php?do=docs&action=edit&Id=' . $iid . '&rubric_id=' . $rubric_id . '&cp=' . SESSION);
exit;
case '': // Действия по умолчанию, если не задано
$document = new stdClass();
// Получаем список прав доступа на добавление документов в определенную рубрику
$this->documentPermissionFetch($rubric_id);
// Определяем флаг, который будет активировать или запрещать смену статуса у документа
if ( (defined('UGROUP') && UGROUP == 1)
|| (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1)
|| (isset($_SESSION[$rubric_id . '_newnow']) && $_SESSION[$rubric_id . '_newnow'] == 1) )
{
$document->dontChangeStatus = 0;
}
else
{
$document->dontChangeStatus = 1;
}
$maxId = $AVE_DB->Query("
SELECT
MAX(Id)
FROM
" . PREFIX . "_documents
")->GetCell();
// получения списка документов из связанной рубрики
$linked_id = $AVE_DB->Query("
SELECT
rubric_linked_rubric
FROM
" . PREFIX . "_rubrics
WHERE
Id = '".$rubric_id."'
")->GetCell();
$linked_id = @unserialize($linked_id);
$document_alias = array();
if ($linked_id)
{
foreach ($linked_id as $linked_id)
{
$sql = $AVE_DB->Query("
SELECT
doc.document_alias,
doc.document_title,
doc.document_breadcrum_title,
doc.Id,
rub.rubric_title
FROM
" . PREFIX . "_documents as doc
JOIN
" . PREFIX . "_rubrics as rub
ON rub.Id = doc.rubric_id
WHERE
doc.rubric_id = '".$linked_id."'
");
while ($row = $sql->FetchRow())
{
$document_alias[$row->rubric_title][] = array(
'document_alias' => $row->document_alias,
'document_title' => $row->document_title,
'document_breadcrum_title' => $row->document_breadcrum_title,
'Id' => $row->Id
);
}
}
}
// получения списка документов из связанной рубрики
$AVE_Template->assign('document_alias', $document_alias);
$lang_pack = array();
if (! empty($_REQUEST['lang_pack']))
{
$sql1 = $AVE_DB->Query("
SELECT
Id,
rubric_id,
document_alias,
document_lang,
document_status
FROM
".PREFIX."_documents
WHERE
document_lang_group=".intval($_REQUEST['lang_pack'])." OR Id=".intval($_REQUEST['lang_pack']));
while ($row1 = $sql1->FetchAssocArray())
{
$lang_pack[$row1['document_lang']] = $row1;
if ($row1['Id'] == intval($_REQUEST['lang_pack']))
$document->document_alias=$_REQUEST['lang'].'/'.trim(ltrim($row1['document_alias'], $row1['document_lang']), '/');
}
}
// Формируем данные и передаем в шаблон
$document->lang_pack=$lang_pack;
$document->fields = $fields_list;
$document->rubric_title = $AVE_Rubric->rubricNameByIdGet($rubric_id)->rubric_title;
$document->rubric_url_prefix = strftime(str_ireplace("%id", $maxId+1, $AVE_Rubric->rubricNameByIdGet($rubric_id)->rubric_alias));
$document->formaction = 'index.php?do=docs&action=new&sub=save&rubric_id=' . $rubric_id . ((isset($_REQUEST['pop']) && $_REQUEST['pop']==1) ? 'pop=1' : '') . '&cp=' . SESSION;
$document->count_groups = count($fields_list);
$document->document_published = time();
$document->document_expire = mktime(date("H"), date("i"), 0, date("m"), date("d"), date("Y") + 10);
$rubric_tmpls = array();
$sql = $AVE_DB->Query("
SELECT
id,
title
FROM
" . PREFIX . "_rubric_templates
WHERE
rubric_id = '" . $rubric_id . "'
");
while ($row = $sql->FetchRow())
{
array_push($rubric_tmpls, $row);
}
// Доступные шаблоны рубрики
$AVE_Template->assign('rubric_tmpls', $rubric_tmpls);
$AVE_Template->assign('document', $document);
$AVE_Template->assign('content', $AVE_Template->fetch('documents/form.tpl'));
break;
}
}
else
{ // Пользователь не имеет прав на создание документа, формируем сообщение с ошибкой
$AVE_Template->assign('erorr', $AVE_Template->get_config_vars('DOC_NO_PERMISSION_RUB'));
$AVE_Template->assign('content', $AVE_Template->fetch('error.tpl'));
}
}
/**
* Метод, предназначенный для редактирования документа
*
* @param int $document_id идентификатор Документа
*/
function documentEdit($document_id)
{
global $AVE_DB, $AVE_Rubric, $AVE_Template;
// Определяем действие, выбранное пользователем
switch ($_REQUEST['sub'])
{
// Если была нажата кнопка Сохранить изменения
case 'save':
$row = $AVE_DB->Query("
SELECT
rubric_id,
document_author_id
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
")->FetchRow();
$this->documentSave($row->rubric_id, $document_id, $_POST, true);
if (isset($_REQUEST['closeafter']) && $_REQUEST['closeafter'] == 1)
{
if (! isAjax())
{
echo "<script>window.opener.location.reload(); window.close();</script>";
}
else
{
$message = $AVE_Template->get_config_vars('DOCUMENT_SAVED');
$header = $AVE_Template->get_config_vars('DOC_REV_SUCCESS');
$theme = 'accept';
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
exit;
}
}
else
{
if (! isAjax())
{
header('Location:index.php?do=docs&action=after&document_id=' . $document_id . '&rubric_id=' . $row->rubric_id . '&cp=' . SESSION);
}
else
{
$message = $AVE_Template->get_config_vars('DOCUMENT_SAVED');
$header = $AVE_Template->get_config_vars('DOC_REV_SUCCESS');
$theme = 'accept';
echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme));
exit;
}
}
exit;
// Если пользователь не выполнял никаких действий, а просто открыл документ для редактирования
case '':
// Выполняем запрос к БД на получение данных о документе
$document = $AVE_DB->Query("
SELECT *
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
")->FetchRow();
$lang_pack = array();
$sql = $AVE_DB->Query("
SELECT
Id,
document_alias,
document_lang,
document_lang_group,
document_status
FROM
".PREFIX."_documents
WHERE
". ($document->document_lang_group > 0
? "document_lang_group = ".$document->document_lang_group." OR Id = ".$document->document_lang_group." OR "
: "")."document_lang_group = ".$document_id." OR Id = ".$document_id
);
while ($row = $sql->FetchAssocArray())
{
$lang_pack[$row['document_lang']] = $row;
}
$document->lang_pack = $lang_pack;
$show = true;
// Проверяем права доступа к документу
$this->documentPermissionFetch($document->rubric_id);
// запрещаем доступ,
// если автору документа не разрешено изменять свои документы в рубрике
// или пользователю не разрешено изменять все документы в рубрике
if (!( (isset($_SESSION['user_id']) && $document->document_author_id == $_SESSION['user_id']
&& isset($_SESSION[$document->rubric_id . '_editown']) && $_SESSION[$document->rubric_id . '_editown'] == 1)
|| (isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1)))
{
$show = false;
}
// запрещаем доступ к главной странице и странице ошибки 404, если требуется одобрение Администратора
if ( ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) &&
!(isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1) )
{
$show = false;
}
// разрешаем доступ, если пользователь принадлежит группе Администраторов или имеет все права на рубрику
if ( (defined('UGROUP') && UGROUP == 1)
|| (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1) )
{
$show = true;
}
if ($show)
{
$fields = array();
if (
(defined('UGROUP') && UGROUP == 1)
|| (isset($_SESSION[$document->rubric_id . '_newnow']) && $_SESSION[$document->rubric_id . '_newnow'] == 1)
|| (isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1)
|| (isset($_SESSION[$document->rubric_id . '_editown']) && $_SESSION[$document->rubric_id . '_editown'] == 1)
|| (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1)
)
{
$document->dontChangeStatus = 0;
}
else
{
$document->dontChangeStatus = 1;
}
// Выполняем запрос к БД на получение списка полей, которые относятся к данному документу
$sql = $AVE_DB->Query("
SELECT *
FROM
" . PREFIX . "_rubric_fields
WHERE
rubric_id = '" . $document->rubric_id . "'
ORDER BY
rubric_field_position ASC
");
// не парсим поля, просто создаём контрольный массив полей
while ($row = $sql->FetchRow())
{
$fields[$row->Id] = $row;
}
$doc_fields = array();
// Выполняем запрос к БД и получаем все данные для полей документа
$sql = $AVE_DB->Query("
SELECT
doc.Id AS df_id,
groups.*,
groups.Id AS group_id,
rub.*,
rubric_field_default,
rubric_field_alias,
doc.field_value,
field_more.field_value as field_value_more
FROM
" . PREFIX . "_rubric_fields AS rub
LEFT JOIN
" . PREFIX . "_rubric_fields_group AS groups
ON rub.rubric_field_group = groups.Id
LEFT JOIN
" . PREFIX . "_document_fields AS doc
ON (rubric_field_id = rub.Id)
LEFT JOIN
" . PREFIX . "_document_fields_text AS field_more
ON (field_more.rubric_field_id = doc.rubric_field_id AND doc.document_id=field_more.document_id)
WHERE
doc.document_id = '" . $document_id . "'
ORDER BY
groups.group_position ASC, rub.rubric_field_position ASC
");
// записываем массив с полями документа
while ($row = $sql->FetchRow())
{
$row->field_value = (string)$row->field_value . (string)$row->field_value_more;
$row->field = $this->_documentFieldGet($row->rubric_field_type, $row->field_value, $row->Id, $row->rubric_field_default);
$doc_fields[$row->Id] = $row;
}
// для каждого поля из контрольного массива...
foreach ($fields as $field_id => $row)
{
// если в документе поле есть, то записываем его
if ($doc_fields[$field_id])
{
$fields[$field_id] = $doc_fields[$field_id];
}
// если нет, парсим чистое поле и добавляем в бд
else
{
$row->field = $this->_documentFieldGet($row->rubric_field_type, $row->rubric_field_default, $row->Id, $row->rubric_field_default);
$fields[$field_id] = $row;
$AVE_DB->Query("
INSERT INTO " . PREFIX . "_document_fields
SET
rubric_field_id = '" . $field_id . "',
document_id = '" . $document->Id . "'
");
}
}
foreach ($fields as $field)
{
$group_id = ($field->rubric_field_group) ? $field->rubric_field_group : 0;
$fields_list[$group_id]['group_id'] = $field->group_id;
$fields_list[$group_id]['group_position'] = ($field->group_position) ? $field->group_position : 100;
$fields_list[$group_id]['group_title'] = $field->group_title;
$fields_list[$group_id]['fields'][$field->Id]['Id'] = $field->Id;
$fields_list[$group_id]['fields'][$field->Id]['rubric_id'] = $row->rubric_id;
$fields_list[$group_id]['fields'][$field->Id]['rubric_field_title'] = $field->rubric_field_title;
$fields_list[$group_id]['fields'][$field->Id]['rubric_field_alias'] = $field->rubric_field_alias;
$fields_list[$group_id]['fields'][$field->Id]['rubric_field_description'] = $field->rubric_field_description;
$fields_list[$group_id]['fields'][$field->Id]['result'] = $field->field;
}
$fields_list = msort($fields_list, 'group_position');
unset($doc_fields);
unset($fields);
// Заглушка на время публикации
$document->document_published = ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) ? '0' : $document->document_published = $document->document_published == 0 ? time() : $document->document_published;
$document->document_expire = ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) ? '0' : $document->document_expire = $document->document_expire == 0 ? mktime(date("H"), date("i"), 0, date("m"), date("d"), date("Y") + 10) : $document->document_expire;
// Формируем ряд переменных и передаем их в шаблон для вывода
$document->fields = $fields_list;
$document->count_groups = count($fields_list);
$document->document_title = htmlspecialchars_decode(stripslashes(html_entity_decode($document->document_title)));
$document->document_meta_keywords = htmlspecialchars_decode(stripslashes(html_entity_decode($document->document_meta_keywords)));
$document->document_meta_description = htmlspecialchars_decode(stripslashes(html_entity_decode($document->document_meta_description)));
$document->document_breadcrum_title = htmlspecialchars_decode(stripslashes(html_entity_decode($document->document_breadcrum_title)));
$document->document_alias_breadcrumb = rewrite_link('index.php?id=' . $document->Id . '&amp;doc=' . (empty($document->document_alias) ? prepare_url($document->document_title) : $document->document_alias));
$document->rubric_title = $AVE_Rubric->rubricNameByIdGet($document->rubric_id)->rubric_title;
$document->rubric_url_prefix = $AVE_Rubric->rubricNameByIdGet($document->rubric_id)->rubric_alias;
$document->formaction = 'index.php?do=docs&action=edit&sub=save&Id=' . $document_id . '&cp=' . SESSION;
if ($document->document_parent != 0) $document->parent = $AVE_DB->Query("SELECT document_alias, document_title, Id FROM " . PREFIX . "_documents WHERE Id = '".$document->document_parent."' ")->FetchRow();
$document_rev = array();
if ( (isset($_SESSION[$document->rubric_id . '_delrev']) && $_SESSION[$document->rubric_id . '_delrev'] == 1)
|| (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1)
|| (defined('UGROUP') && UGROUP == 1) )
{
$document->canDelRev = 1;
}
$sql_rev = $AVE_DB->Query("
SELECT *
FROM
" . PREFIX . "_document_rev
WHERE
doc_id = '" . $document_id . "'
ORDER BY
doc_revision DESC
LIMIT 7
");
// Формируем массив из полученных данных
while ($result = $sql_rev->FetchRow())
{
$result->user_id = get_username_by_id($result->user_id);
array_push($document_rev, $result);
}
$AVE_Template->assign('document_rev', $document_rev);
// получения списка документов из связанной рубрики
$linked_id = $AVE_DB->Query("
SELECT
rubric_linked_rubric
FROM
" . PREFIX . "_rubrics
WHERE
Id = '".$document->rubric_id."'
")->GetCell();
@$linked_id = unserialize($linked_id);
$document_alias = array();
if ($linked_id)
{
foreach ($linked_id as $linked_id)
{
$sql = $AVE_DB->Query("
SELECT
doc.document_alias,
doc.document_title,
doc.document_breadcrum_title,
doc.Id,
rub.rubric_title
FROM
" . PREFIX . "_documents as doc
JOIN
" . PREFIX . "_rubrics as rub
ON rub.Id = doc.rubric_id
WHERE
doc.rubric_id = '" . $linked_id . "'
");
while ($row = $sql->FetchRow())
{
$document_alias[$row->rubric_title][] = array(
'document_alias'=>$row->document_alias,
'document_title'=>htmlspecialchars_decode(stripslashes(html_entity_decode($row->document_title))),
'document_breadcrum_title'=>htmlspecialchars_decode(stripslashes(html_entity_decode($row->document_breadcrum_title))),
'Id'=>$row->Id
);
}
}
}
$rubric_tmpls = array();
$sql = $AVE_DB->Query("
SELECT
id,
title
FROM
" . PREFIX . "_rubric_templates
WHERE
rubric_id = '" . $document->rubric_id . "'
");
while ($row = $sql->FetchRow())
{
array_push($rubric_tmpls, $row);
}
// Доступные шаблоны рубрики
$AVE_Template->assign('rubric_tmpls', $rubric_tmpls);
// получения списка документов из связанной рубрики
$AVE_Template->assign('document_alias', $document_alias);
$AVE_Template->assign('document', $document);
// Отображаем страницу для редактирования
$AVE_Template->assign('content', $AVE_Template->fetch('documents/form.tpl'));
}
else // Если пользователь не имеет прав на редактирование, формируем сообщение об ошибке
{
$AVE_Template->assign('erorr', $AVE_Template->get_config_vars('DOC_NO_PERMISSION'));
$AVE_Template->assign('content', $AVE_Template->fetch('error.tpl'));
}
break;
}
}
/**
* Метод, предназначенный для копирования документа
*
* @param int $document_id идентификатор Документа
*/
function documentCopy($document_id)
{
global $AVE_DB, $AVE_Rubric, $AVE_Template;
// Определяем действие, выбранное пользователем
switch ($_REQUEST['sub'])
{
// Если была нажата кнопка Сохранить изменения
case 'save': // Сохранение документа в БД
$public_start = $this->_documentStart(); // Дата/время начала публикации документа
$public_end = $this->_documentEnd(); // Дата/время окончания публикации документа
$innavi = check_permission_acp('navigation_new') ? '&innavi=1' : '';
// Определяем статус документа
$document_status = !empty($_REQUEST['document_status']) ? (int)$_REQUEST['document_status'] : '0';
// Если статус документа не определен
if (empty($document_status) && $_SESSION['user_group'] != 1)
{
$innavi = '';
@reset($_POST);
$newtext = "\n\n";
// Формируем текст сообщения, состоящий из данных,
// которые пользователь ввел в поля документа
foreach ($_POST['feld'] as $val)
{
if (!empty($val))
{
$newtext .= $val;
$newtext .= "\n---------------------\n";
}
}
$text = strip_tags($newtext);
// Получаем e-mail адрес из общих настроек системы
$system_mail = get_settings('mail_from');
$system_mail_name = get_settings('mail_from_name');
// Отправляем администартору уведомление, о том что необходимо проверить документ
$body_to_admin = $AVE_Template->get_config_vars('DOC_MAIL_BODY_CHECK');
$body_to_admin = str_replace('%N%', "\n", $body_to_admin);
$body_to_admin = str_replace('%TITLE%', stripslashes($_POST['document_title']), $body_to_admin);
$body_to_admin = str_replace('%USER%', "'" . $_SESSION['user_name'] . "'", $body_to_admin);
send_mail(
$system_mail,
$body_to_admin . $text,
$AVE_Template->get_config_vars('DOC_MAIL_SUBJECT_CHECK'),
$system_mail,
$system_mail_name,
'text'
);
// Отправляем уведомление автору, о том что документ находится на проверке
$body_to_author = str_replace('%N%', "\n", $AVE_Template->get_config_vars('DOC_MAIL_BODY_USER'));
$body_to_author = str_replace('%TITLE%', stripslashes($_POST['document_title']), $body_to_author);
$body_to_author = str_replace('%USER%', "'" . $_SESSION['user_name'] . "'", $body_to_author);
send_mail(
$_SESSION['user_email'],
$body_to_author,
$AVE_Template->get_config_vars('DOC_MAIL_SUBJECT_USER'),
$system_mail,
$system_mail_name,
'text'
);
}
if (! ((isset($_SESSION[$rubric_id . '_newnow']) && $_SESSION[$rubric_id . '_newnow'] == 1)
|| (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1)
|| (defined('UGROUP') && UGROUP == 1)) )
{
$document_status = 0;
}
$_POST['document_status']=$document_status;
$iid = $this->documentSave($_REQUEST['rubric_id'],null,$_POST,true);
if (! $_REQUEST['next_edit'])
{
header('Location:index.php?do=docs&action=after&document_id=' . $iid . '&rubric_id=' . $rubric_id . '&cp=' . SESSION . $innavi);
}
else
{
header('Location:index.php?do=docs&action=edit&Id=' . $iid . '&rubric_id=' . $rubric_id . '&cp=' . SESSION);
}
exit;
// Если пользователь не выполнял никаких действий, а просто открыл документ для копирования
// Если пользователь не выполнял никаких действий, а просто открыл документ для редактирования
case '':
// Выполняем запрос к БД на получение данных о документе
$document = $AVE_DB->Query("
SELECT *
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
")->FetchRow();
$show = true;
// Проверяем права доступа к документу
$this->documentPermissionFetch($document->rubric_id);
// запрещаем доступ,
// если автору документа не разрешено изменять свои документы в рубрике
// или пользователю не разрешено изменять все документы в рубрике
if (!( (isset($_SESSION['user_id']) && $document->document_author_id == $_SESSION['user_id']
&& isset($_SESSION[$document->rubric_id . '_editown']) && $_SESSION[$document->rubric_id . '_editown'] == 1)
|| (isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1)))
{
$show = false;
}
// запрещаем доступ к главной странице и странице ошибки 404, если требуется одобрение Администратора
if ( ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) &&
!(isset($_SESSION[$document->rubric_id . '_newnow']) && $_SESSION[$document->rubric_id . '_newnow'] == 1) )
{
$show = false;
}
// разрешаем доступ, если пользователь принадлежит группе Администраторов или имеет все права на рубрику
if ( (defined('UGROUP') && UGROUP == 1)
|| (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1) )
{
$show = true;
}
if ($show)
{
$fields = array();
if ( (defined('UGROUP') && UGROUP == 1)
|| (isset($_SESSION[$document->rubric_id . '_newnow']) && $_SESSION[$document->rubric_id . '_newnow'] == 1) )
{
$document->dontChangeStatus = 0;
}
else
{
$document->dontChangeStatus = 1;
}
// Выполняем запрос к БД и получаем все данные для полей документа
$sql = $AVE_DB->Query("
SELECT
doc.Id AS df_id,
groups.*,
rub.*,
rubric_field_default,
doc.field_value,
field_more.field_value as field_value_more
FROM
" . PREFIX . "_rubric_fields AS rub
LEFT JOIN
" . PREFIX . "_rubric_fields_group AS groups
ON rub.rubric_field_group = groups.Id
LEFT JOIN
" . PREFIX . "_document_fields AS doc
ON (rubric_field_id = rub.Id)
LEFT JOIN
" . PREFIX . "_document_fields_text AS field_more
ON (field_more.rubric_field_id = doc.rubric_field_id AND doc.document_id=field_more.document_id)
WHERE
doc.document_id = '" . $document_id . "'
ORDER BY
groups.group_position ASC, rub.rubric_field_position ASC
");
while ($row = $sql->FetchRow())
{
$row->field_value = (string)$row->field_value . (string)$row->field_value_more;
$row->field = $this->_documentFieldGet($row->rubric_field_type, $row->field_value, $row->Id, $row->rubric_field_default);
array_push($fields, $row);
}
$maxId = $AVE_DB->Query("
SELECT
MAX(Id)
FROM
" . PREFIX . "_documents
")->GetCell();
foreach ($fields as $field)
{
$group_id = ($field->rubric_field_group) ? $field->rubric_field_group : 0;
$fields_list[$group_id]['group_position'] = ($field->group_position) ? $field->group_position : 100;
$fields_list[$group_id]['group_title'] = $field->group_title;
$fields_list[$group_id]['fields'][$field->Id]['Id'] = $field->Id;
$fields_list[$group_id]['fields'][$field->Id]['rubric_id'] = $row->rubric_id;
$fields_list[$group_id]['fields'][$field->Id]['rubric_field_title'] = $field->rubric_field_title;
$fields_list[$group_id]['fields'][$field->Id]['rubric_field_description'] = $field->rubric_field_description;
$fields_list[$group_id]['fields'][$field->Id]['result'] = $field->field;
}
$fields_list = msort($fields_list, 'group_position');
unset($doc_fields);
unset($fields);
// Формируем ряд переменных и передаем их в шаблон для вывода
$document->fields = $fields_list;
$document->count_groups = count($fields_list);
$document->document_alias = '';
$document->rubric_title = $AVE_Rubric->rubricNameByIdGet($_REQUEST['rubric_id'])->rubric_title;
$document->rubric_url_prefix = strftime(str_ireplace("%id", $maxId+1, $AVE_Rubric->rubricNameByIdGet($_REQUEST['rubric_id'])->rubric_alias));
$document->formaction = 'index.php?do=docs&action=copy&sub=save&rubric_id=' . $_REQUEST['rubric_id'] . ((isset($_REQUEST['pop']) && $_REQUEST['pop']==1) ? 'pop=1' : '') . '&cp=' . SESSION;
$document->document_published = time();
$document->document_expire = mktime(date("H"), date("i"), 0, date("m"), date("d"), date("Y") + 10);
if ($document->document_parent != 0)
$document->parent = $AVE_DB->Query("SELECT document_title, Id FROM " . PREFIX . "_documents WHERE Id = '" . $document->document_parent . "' ")->FetchRow();
$AVE_Template->assign('document', $document);
// Отображаем страницу для редактирования
$AVE_Template->assign('content', $AVE_Template->fetch('documents/form.tpl'));
}
else // Если пользователь не имеет прав на редактирование, формируем сообщение об ошибке
{
$AVE_Template->assign('erorr', $AVE_Template->get_config_vars('DOC_NO_PERMISSION'));
$AVE_Template->assign('content', $AVE_Template->fetch('error.tpl'));
}
break;
}
}
/**
* Метод, предназначенный для пометки документа к удалению
*
* @param int $document_id идентификатор Документа
*/
function documentMarkDelete($document_id)
{
global $AVE_DB;
// Выполняем запрос к БД на получение информации о документе (id, id рубрики, автор)
$row = $AVE_DB->Query("
SELECT
Id,
rubric_id,
document_author_id
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
")->FetchRow();
// Если у пользователя достаточно прав на выполнение данной операции
if (
(isset($_SESSION[$row->rubric_id . '_editall']) && $_SESSION[$row->rubric_id . '_editall'] == 1)
||
(isset($_SESSION[$row->rubric_id . '_editown']) && $_SESSION[$row->rubric_id . '_editown'] == 1)
||
(isset($_SESSION[$row->rubric_id . '_alles']) && $_SESSION[$row->rubric_id . '_alles'] == 1)
||
(defined('UGROUP') && UGROUP == 1)
)
{
// и это не главная страница и не страница с ошибкой 404
if ($document_id != 1 && $document_id != PAGE_NOT_FOUND_ID)
{
// Выполняем запрос к БД на обновление данных (пометка на удаление)
$AVE_DB->Query("
UPDATE
" . PREFIX . "_documents
SET
document_deleted = '1'
WHERE
Id = '" . $document_id . "'
");
$AVE_DB->clearcache('rub_'.$row->rubric_id);
$AVE_DB->clearcache('doc_'.$document_id);
$AVE_DB->clearcompile('doc_'.$document_id);
// Сохраняем системное сообщение в журнал
reportLog('Положил документ в корзину (' . $document_id . ')');
}
}
// Выполняем обновление страницы
header('Location:index.php?do=docs'.(empty($_REQUEST['rubric_id']) ? '' : '&rubric_id='.$_REQUEST['rubric_id']).'&cp=' . SESSION);
}
/**
* Метод, предназначенный для снятия отметки об удаления
*
* @param int $document_id идентификатор Документа
*/
function documentUnmarkDelete($document_id)
{
global $AVE_DB;
// Выполняем запрос к БД на обновление информации (снятие отметки об удалении)
$row = $AVE_DB->Query("
SELECT *
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
")->FetchRow();
$AVE_DB->Query("
UPDATE
" . PREFIX . "_documents
SET
document_deleted = '0'
WHERE
Id = '" . $document_id . "'
");
// Сохраняем системное сообщение в журнал
reportLog('Восстановил удаленный документ (' . $document_id . ')');
$AVE_DB->clearcache('rub_'.$row->rubric_id);
$AVE_DB->clearcache('doc_'.$document_id);
$AVE_DB->clearcompile('doc_'.$document_id);
// Выполняем обновление страницы
header('Location:index.php?do=docs'.(empty($_REQUEST['rubric_id']) ? '' : '&rubric_id='.$_REQUEST['rubric_id']).'&cp=' . SESSION);
}
/**
* Метод, предназначенный для полного удаления документа без возможности восстановления
*
* @param int $document_id идентификатор Документа
*/
function documentDelete($document_id)
{
global $AVE_DB;
// Проверяем, чтобы удаляемый документ не являлся главной страницей и не страницей с 404 ощибкой
if ($document_id != 1 && $document_id != PAGE_NOT_FOUND_ID)
{
$row = $AVE_DB->Query("
SELECT *
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
")->FetchRow();
// Выполняем запрос к БД на удаление информации о документе
$AVE_DB->Query("
DELETE
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
");
// Выполняем запрос к БД на удаление полей, которые относились к документу
$AVE_DB->Query("
DELETE
f1.*,
f2.*
FROM
" . PREFIX . "_document_fields AS f1
INNER JOIN
" . PREFIX . "_document_fields_text AS f2
WHERE
f1.document_id = '" . $document_id . "'
AND
f2.document_id = f1.document_id
");
// Очищаем кэш шаблона
$AVE_DB->Query("
DELETE
FROM
" . PREFIX . "_rubric_template_cache
WHERE
doc_id = '" . $document_id . "'
");
// Сохраняем системное сообщение в журнал
reportLog('Удалил документ <strong>'. $row->document_title . ' (ID: ' . $document_id . ')</strong>');
}
// Удаляем кеш докеумента
$AVE_DB->clearcache('rub_' . $row->rubric_id);
$AVE_DB->clearcache('doc_' . $document_id);
$AVE_DB->clearcompile('doc_'.$document_id);
// Выполняем обновление страницы
header('Location:index.php?do=docs'.(empty($_REQUEST['rubric_id'])
? ''
: '&rubric_id='.$_REQUEST['rubric_id']).'&cp=' . SESSION);
}
/**
* Метод, предназначенный для публикации или отмены публикации документа
*
* @param int $document_id идентификатор Документа
* @param string $openclose статус Документа {open|close}
*/
function documentStatusSet($document_id, $openclose = 0)
{
global $AVE_DB, $AVE_Template;
$errors = array();
$show = true;
// Выполняем запрос к БД на получение информации о документе (id, id рубрики, автор)
$document = $AVE_DB->Query("
SELECT
Id,
rubric_id,
document_author_id
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
")->FetchRow();
// Проверяем права доступа к документу
$this->documentPermissionFetch($document->rubric_id);
// запрещаем доступ,
// если автору документа не разрешено изменять свои документы в рубрике
// или пользователю не разрешено изменять все документы в рубрике
if (!
(
(isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1)
||
(isset($_SESSION[$document->rubric_id . '_editown']) && $_SESSION[$document->rubric_id . '_editown'] == 1)
||
(isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1)
||
(defined('UGROUP') && UGROUP == 1)
)
)
{
$show = false;
}
// запрещаем доступ к главной странице и странице ошибки 404, если требуется одобрение Администратора
if ( ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) &&
!(isset($_SESSION[$document->rubric_id . '_newnow']) && $_SESSION[$document->rubric_id . '_newnow'] == 1) )
{
$show = false;
}
// разрешаем доступ, если пользователь принадлежит группе Администраторов или имеет все права на рубрику
if ( (defined('UGROUP') && UGROUP == 1)
|| (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1) )
{
$show = true;
}
if ($show)
{
// Выполняем запрос к БД на получение id автора документа, чтобы проверить уровень прав доступа
// Проверем, чтобы у пользователя было достаточно прав на выполнение данной операции
if (
(
($document->document_author_id == @$_SESSION['user_id'])
&&
(isset($_SESSION[$document->rubric_id . '_newnow']) && @$_SESSION[$row->rubric_id . '_newnow'] == 1)
||
@$_SESSION[$row->rubric_id . '_alles'] == 1
||
(defined('UGROUP') && UGROUP == 1)
)
||
(isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1)
||
(isset($_SESSION[$document->rubric_id . '_editown']) && $_SESSION[$document->rubric_id . '_editown'] == 1)
||
(isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1)
||
(defined('UGROUP') && UGROUP == 1)
)
{
// Если это не главная страница и не страница с 404 ошибкой
if ($document_id != 1 && $document_id != PAGE_NOT_FOUND_ID)
{
// Выполянем запрос к БД на смену статуса у документа
$AVE_DB->Query("
UPDATE
" . PREFIX . "_documents
SET
document_status = '" . $openclose . "'
WHERE
Id = '" . $document_id . "'
");
$AVE_DB->clearcache('rub_'.$row->rubric_id);
$AVE_DB->clearcache('doc_'.$document_id);
$AVE_DB->clearcompile('doc_'.$document_id);
// Сохраняем системное сообщение в журнал
reportLog($_SESSION['user_name'] . ' - ' . (($openclose==1) ? $AVE_Template->get_config_vars('DOC_DOCUMENT_ACT') : $AVE_Template->get_config_vars('DOC_DOCUMENT_DISACT')) . ' ' . $AVE_Template->get_config_vars('DOC_DOCUMENT_DOC') . ' (' . $document_id . ')', 2, 2);
}
else
{
$errors[] = $AVE_Template->get_config_vars('DOC_DOCUMENT_OPEN_ERR');
}
}
else
{
$errors[] = $AVE_Template->get_config_vars('DOC_DOCUMENT_OPEN_PRIVE');
}
if (isset($_REQUEST['ajax']))
{
if (empty($errors))
{
// Если ошибок не найдено, формируем сообщение об успешной операции
echo json_encode(array((($openclose==1) ? $AVE_Template->get_config_vars('DOC_DOCUMENT_OPEN') : $AVE_Template->get_config_vars('DOC_DOCUMENT_CLOSE')) . implode(',<br />', $errors), 'accept'));
}
else
{
// В противном случае формируем сообщение с ошибкой
echo json_encode(array($AVE_Template->get_config_vars('DOC_URL_CHECK_ER') . implode(',<br />', $errors), 'error'));
}
$AVE_DB->clearcache('rub_'.$row->rubric_id);
$AVE_DB->clearcache('doc_'.$document_id);
$AVE_DB->clearcompile('doc_'.$document_id);
exit;
}
else
{
$AVE_DB->clearcache('rub_'.$row->rubric_id);
$AVE_DB->clearcache('doc_'.$document_id);
$AVE_DB->clearcompile('doc_'.$document_id);
// Выполняем обновление страницы
header('Location:index.php?do=docs'.(empty($_REQUEST['rubric_id']) ? '' : '&rubric_id='.$_REQUEST['rubric_id']).'&cp=' . SESSION);
exit;
}
}
else
{
header('Location:index.php?do=docs&cp=' . SESSION);
exit;
}
}
/**
* Метод, предназначенный для передачи в Smarty шаблонизатор меток периода времени отображаемых
* в списке документов
*
*/
function documentTemplateTimeAssign()
{
global $AVE_Template;
if (!empty($_REQUEST['TimeSelect']))
{
$AVE_Template->assign('sel_start', $this->_documentListStart());
$AVE_Template->assign('sel_end', $this->_documentListEnd());
}
}
/**
* Метод, предназначенный для переноса документа в другую рубрику
*
*/
function documentRubricChange()
{
global $AVE_DB, $AVE_Template;
$document_id = (int)$_REQUEST['Id']; // идентификатор документа
$rubric_id = (int)$_REQUEST['rubric_id']; // идентификатор текущей рубрики
// Если в запросе пришел идентификатор новой рубрики и id документа, тогда
// выполняем автоматический перенос документа из одной рубрики в другую
if ((! empty($_POST['NewRubr'])) and (! empty($_GET['Id'])))
{
$new_rubric_id = (int)$_POST['NewRubr']; // идентификатор целевой рубрики
// Циклически обрабатываем данные, пришедшие в запросе методо POST
foreach ($_POST as $key => $value)
{
if (is_integer($key))
{
// Определяем флаг поля
switch ($value)
{
// Если 0, тогда
case 0:
// Выполняем запрос к БД на удаление старого поля (лишнее или не требует переноса)
$AVE_DB->Query("
DELETE
FROM
" . PREFIX . "_document_fields
WHERE
document_id = '" . $document_id . "'
AND
rubric_field_id = '" . $key . "'
");
$AVE_DB->Query("
DELETE
FROM
" . PREFIX . "_document_fields_text
WHERE
document_id = '" . $document_id . "'
AND
rubric_field_id = '" . $key . "'
");
break;
// Если -1, тогда
case -1:
// Выполняем запрос на получение данных для этого (старого) поля
$row_fd = $AVE_DB->Query("
SELECT
rubric_field_title,
rubric_field_type
FROM
" . PREFIX . "_rubric_fields
WHERE
Id = '" . $key . "'
")->FetchRow();
// Выполняем запрос к БД и получаем последнюю позицию полей в рубрики КУДА переносим
$new_pos = $AVE_DB->Query("
SELECT
rubric_field_position
FROM
" . PREFIX . "_rubric_fields
WHERE
rubric_id = '" . $new_rubric_id . "'
ORDER BY
rubric_field_position DESC
LIMIT 1
")->GetCell();
++$new_pos;
// Выполняем запрос к БД и добавляем новое поле в новую рубрику
$AVE_DB->Query("
INSERT
INTO
" . PREFIX . "_rubric_fields
SET
rubric_id = '" . $new_rubric_id . "',
rubric_field_title = '" . addslashes($row_fd->rubric_field_title) . "',
rubric_field_type = '" . addslashes($row_fd->rubric_field_type) . "',
rubric_field_position = '" . $new_pos . "'
");
$lastid = $AVE_DB->InsertId();
// Выполняем запрос к БД и добавляем запись о поле в таблицу с полями документов
$sql_docs = $AVE_DB->Query("
SELECT Id
FROM
" . PREFIX . "_documents
WHERE
rubric_id = '" . $new_rubric_id . "'
");
while ($row_docs = $sql_docs->FetchRow())
{
$AVE_DB->Query("
INSERT
INTO
" . PREFIX . "_document_fields
SET
rubric_field_id = '" . $lastid . "',
document_id = '" . $row_docs->Id . "',
field_value = '',
document_in_search = '1'
");
}
// Выполняем запрос к БД и создаем новое поле для изменяемого документа
$AVE_DB->Query("
UPDATE
" . PREFIX . "_document_fields
SET
rubric_field_id = '" . $lastid . "'
WHERE
rubric_field_id = '" . $key . "'
AND
document_id = '" . $document_id . "'
");
$AVE_DB->Query("
UPDATE
" . PREFIX . "_document_fields_text
SET
rubric_field_id = '" . $lastid . "'
WHERE
rubric_field_id = '" . $key . "'
AND
document_id = '" . $document_id . "'
");
break;
// По умолчанию
default:
// Выполняем запрос к БД и просто обновляем имеющиеся данные
$AVE_DB->Query("
UPDATE
" . PREFIX . "_document_fields
SET
rubric_field_id = '" . $value . "'
WHERE
rubric_field_id = '" . $key . "'
AND
document_id = '" . $document_id . "'
");
$AVE_DB->Query("
UPDATE
" . PREFIX . "_document_fields_text
SET
rubric_field_id = '" . $value . "'
WHERE
rubric_field_id = '" . $key . "'
AND
document_id = '" . $document_id . "'
");
break;
}
}
}
// Выполняем запрос к БД и получаем список всех полей у новой рубрики
$sql_rub = $AVE_DB->Query("
SELECT Id
FROM
" . PREFIX . "_rubric_fields
WHERE
rubric_id = '" . $new_rubric_id . "'
ORDER BY
Id ASC
");
// Выполняем запросы к БД на проверку наличия нужных полей.
while ($row_rub = $sql_rub->FetchRow())
{
$num = $AVE_DB->Query("
SELECT 1
FROM
" . PREFIX . "_document_fields
WHERE
rubric_field_id = '" . $row_rub->Id . "'
AND
document_id = '" . $document_id . "'
LIMIT 1
")->NumRows();
// Если в новой рубрики требуемого поля нет, выполняем запрос к БД на добавление нового типа поля
if ($num != 1)
{
$AVE_DB->Query("
INSERT
" . PREFIX . "_document_fields
SET
rubric_field_id = '" . $row_rub->Id . "',
document_id = '" . $document_id . "',
field_value = '',
document_in_search = '1'
");
}
}
// Выполянем запрос к БД на обновление информации, в котором устанавливаем для перенесенного документа
// новое значение id рубрики
$AVE_DB->Query("
UPDATE
" . PREFIX . "_documents
SET
rubric_id = '" . $new_rubric_id . "'
WHERE
Id = '" . $document_id . "'
");
// Выполняем запрос к БД и очищаем кэш шаблона документа
$AVE_DB->Query("
DELETE
FROM
" . PREFIX . "_rubric_template_cache
WHERE
doc_id = '" . $document_id . "'
");
echo '<script>window.opener.location.reload(); window.close();</script>';
}
else // Если в запросе не был указан id рубрики и id документа
{
// Формируем и отображаем форму, где пользователь самостоятельно определяет перенос
$fields = array();
if ((! empty($_GET['NewRubr'])) and ($rubric_id != (int)$_GET['NewRubr']))
{
// Выполняем запрос к БД и выбираем все поля новой рубрики
$sql_rub = $AVE_DB->Query("
SELECT
Id,
rubric_field_title,
rubric_field_type
FROM
" . PREFIX . "_rubric_fields
WHERE
rubric_id = '" . (int)$_GET['NewRubr'] . "'
ORDER BY
Id ASC
");
$mass_new_rubr = array();
while ($row_rub = $sql_rub->FetchRow())
{
$mass_new_rubr[] = array('Id' => $row_rub->Id,
'title' => $row_rub->rubric_field_title,
'rubric_field_type' => $row_rub->rubric_field_type
);
}
// Выполняем запрос к БД и выбираем все поля старой рубрики
$sql_old_rub = $AVE_DB->Query("
SELECT
Id,
rubric_field_title,
rubric_field_type
FROM
" . PREFIX . "_rubric_fields
WHERE
rubric_id = '" . $rubric_id . "'
ORDER BY
Id ASC
");
// Циклически обрабатываем полученные данные
while ($row_nr = $sql_old_rub->FetchRow()) {
$type = $row_nr->rubric_field_type;
$option_arr = array('0' => $AVE_Template->get_config_vars('DOC_CHANGE_DROP_FIELD'),
'-1' => $AVE_Template->get_config_vars('DOC_CHANGE_CREATE_FIELD')
);
$selected = -1;
foreach ($mass_new_rubr as $row)
{
if ($row['rubric_field_type'] == $type)
{
$option_arr[$row['Id']] = $row['title'];
if ($row_nr->rubric_field_title == $row['title'])
$selected = $row['Id'];
}
}
$fields[$row_nr->Id] = array('title' => $row_nr->rubric_field_title,
'Options' => $option_arr,
'Selected' => $selected
);
}
}
// Формируем ряд переменых и отображаем страницу с выбором рубрики
$AVE_Template->assign('fields', $fields);
$AVE_Template->assign('formaction', 'index.php?do=docs&action=change&Id=' . $document_id . '&rubric_id=' . $rubric_id . '&pop=1&cp=' . SESSION);
$AVE_Template->assign('content', $AVE_Template->fetch('documents/change.tpl'));
}
}
/**
* Метод, предназначенный для формирования прав доступа Группы пользователей на Документы определённой Рубрики
*
* @param int $rubric_id идентификатор Рубрики
*/
function documentPermissionFetch($rubric_id)
{
global $AVE_DB;
// Массив прав пользователей
static $rubric_permissions = array();
// Если у нас уже имеются полученные права для данной рубрики, просто прерываем проверку
if (isset($rubric_permissions[$rubric_id])) return;
// Выполняем запрос к БД на получение прав для данной рубрики
$sql = $AVE_DB->Query("
SELECT
rubric_id,
rubric_permission
FROM
" . PREFIX . "_rubric_permissions
WHERE
user_group_id = '" . UGROUP . "'
");
// Циклически обрабатываем полученные данные и формируем массив прав
while ($row = $sql->FetchRow())
{
$rubric_permissions[$row->rubric_id] = 1;
$permissions = explode('|', $row->rubric_permission);
foreach ($permissions as $rubric_permission)
{
if (! empty($rubric_permission))
{
$_SESSION[$row->rubric_id . '_' . $rubric_permission] = 1;
}
}
}
}
/**
* Метод, предназначенный для просмотра и добавления Заметок к Документу
*
* @param int $reply признак ответа на Заметку
*/
function documentRemarkNew($document_id = 0, $reply = 0)
{
global $AVE_DB, $AVE_Template, $AVE_Core;
// Если id документа не число или 0, прерываем выполнение
if (! (is_numeric($document_id) && $document_id > 0))
exit;
$document_title = get_document($document_id, 'document_title');
$AVE_Template->assign('document_title', $document_title);
// Если в запросе пришел параметр на Сохранение
if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'save')
{
// Если пользователь оставил комментарий и у него имеются права и это не ответ, а новая заметка, тогда
if (!empty($_REQUEST['remark_text']) && check_permission('remarks') && empty($_REQUEST['reply']))
{
// Выполняем запрос к БД на добавление новой заметки для документа
$AVE_DB->Query("
INSERT
" . PREFIX . "_document_remarks
SET
document_id = '" . $document_id . "',
remark_title = '" . clean_no_print_char($_REQUEST['remark_title']) . "',
remark_text = '" . substr(clean_no_print_char($_REQUEST['remark_text']), 0, $this->_max_remark_length) . "',
remark_author_id = '" . $_SESSION['user_id'] . "',
remark_published = '" . time() . "',
remark_first = '1',
remark_author_email = '" . $_SESSION['user_email'] . "'
");
}
// Выполняем обновление страницы
header('Location:index.php?do=docs&action=remark_reply&Id=' . $document_id . '&pop=1&cp=' . SESSION);
}
// Если это ответ на уже существующую заметку
if ($reply == 1)
{
if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'save')
{
// Если пользователь оставил ответ и имеет на это права
if (! empty($_REQUEST['remark_text']) && check_permission('remarks'))
{
// Выполняем запрос на получение e-mail адреса автора заметки
$remark_author_email = $AVE_DB->Query("
SELECT
remark_author_email
FROM
" . PREFIX . "_document_remarks
WHERE
remark_first = '1'
AND
document_id = '" . $document_id . "'
")->GetCell();
// Выполняем запрос к БД на добавление заметки в БД
$AVE_DB->Query("
INSERT
" . PREFIX . "_document_remarks
SET
document_id = '" . $document_id . "',
remark_title = '" . clean_no_print_char($_REQUEST['remark_title']) . "',
remark_text = '" . substr(clean_no_print_char($_REQUEST['remark_text']), 0, $this->_max_remark_length) . "',
remark_author_id = '" . $_SESSION['user_id'] . "',
remark_published = '" . time() . "',
remark_first = '0',
remark_author_email = '" . $_SESSION['user_email'] . "'
");
}
// Формируем сообщение и отправляем письмо автору, с информацией о том, что на его заметку есть ответ
$system_mail = get_settings('mail_from');
$system_mail_name = get_settings('mail_from_name');
$link = get_home_link() . 'index.php?do=docs&doc_id=' . $document_id;
$body_to_admin = $AVE_Template->get_config_vars('DOC_MAIL_BODY_NOTICE');
$body_to_admin = str_replace('%N%', "\n", $body_to_admin);
$body_to_admin = str_replace('%TITLE%', stripslashes($_POST['remark_title']), $body_to_admin);
$body_to_admin = str_replace('%USER%', get_username_by_id($_SESSION['user_id']), $body_to_admin);
$body_to_admin = str_replace('%LINK%', $link, $body_to_admin);
send_mail(
$remark_author_email,
$body_to_admin,
$AVE_Template->get_config_vars('DOC_MAIL_SUBJECT_NOTICE'),
$system_mail,
$system_mail_name,
'text'
);
// Выполняем обновление страницы
header('Location:index.php?do=docs&action=remark_reply&Id=' . $document_id . '&pop=1&cp=' . SESSION);
}
// Получаем общее количество заметок для документа
$num = $AVE_DB->Query("
SELECT COUNT(*)
FROM " . PREFIX . "_document_remarks
WHERE document_id = '" . $document_id . "'
")->GetCell();
// Определяыем лимит заметок на 1 странице и подсчитываем количество страниц
$limit = 10;
$pages = ceil($num / $limit);
$start = get_current_page() * $limit - $limit;
$answers = array();
// Выполняем запрос к БД на получение заметок с учетом количества на 1 странцу
$sql = $AVE_DB->Query("
SELECT *
FROM
" . PREFIX . "_document_remarks
WHERE
document_id = '" . $document_id . "'
ORDER BY
Id DESC
LIMIT " . $start . "," . $limit
);
while ($row = $sql->FetchAssocArray())
{
$row['remark_author'] = get_username_by_id($row['remark_author_id']);
$row['remark_text'] = nl2br($row['remark_text']);
$row['remark_avatar'] = getAvatar($row['remark_author_id'],40);
array_push($answers, $row);
}
$remark_status = $AVE_DB->Query("
SELECT
remark_status
FROM
" . PREFIX . "_document_remarks
WHERE
document_id = '" . $document_id . "'
AND
remark_first = '1'
")->GetCell();
// Если количество заметок превышает допустимое значение, определенное в переменной $limit, тогда
// формируем постраничную навигацию
if ($num > $limit)
{
$page_nav = "<li><a href=\"index.php?do=docs&action=remark_reply&Id=" . $document_id . "&page={s}&pop=1&cp=" . SESSION . "\">{t}</a></li>";
$page_nav = get_pagination($pages, 'page', $page_nav);
$AVE_Template->assign('page_nav', $page_nav);
}
// Передаем данные в шаблон и отображаем страницу со списком заметок
$AVE_Template->assign('document_title', $document_title);
$AVE_Template->assign('remark_status', $remark_status);
$AVE_Template->assign('answers', $answers);
$AVE_Template->assign('reply', 1);
$AVE_Template->assign('formaction', 'index.php?do=docs&action=remark_reply&sub=save&Id=' . $document_id . '&reply=1&cp=' . SESSION);
$AVE_Template->assign('content', $AVE_Template->fetch('documents/newremark.tpl'));
}
else
{ // В противном случае, если заметок еще нет, открываем форму для добавление заметки
$AVE_Template->assign('reply', 1);
$AVE_Template->assign('new', 1);
$AVE_Template->assign('formaction', 'index.php?do=docs&action=remark&sub=save&Id=' . $document_id . '&cp=' . SESSION);
$AVE_Template->assign('content', $AVE_Template->fetch('documents/newremark.tpl'));
}
}
/**
* Метод, предназначенный для управления статусами дискусии (разрешить или запретить оставлять
* ответы на заметки для других пользователей)
*
* @param int $document_id идентификатор документа
* @param int $status статус дискусии
*/
function documentRemarkStatus($document_id = 0, $status = 0)
{
global $AVE_DB;
// Если id документа число и оно больше 0, тогда
if (is_numeric($document_id) && $document_id > 0)
{
// Выполняем запрос к БД на обновление статуса у заметок
$AVE_DB->Query("
UPDATE
" . PREFIX . "_document_remarks
SET
remark_status = '" . ($status != 1 ? 0 : 1) . "'
WHERE
remark_first = '1'
AND
document_id = '" . $document_id . "'
");
}
// Выполняем обновление данных
header('Location:index.php?do=docs&action=remark_reply&Id=' . $document_id . '&pop=1&cp=' . SESSION);
exit;
}
/**
* Метод, предназначенный для удаление заметок
*
* @param int $all признак удаления всех Заметок (1 - удалить все)
*/
function documentRemarkDelete($document_id = 0, $all = 0)
{
global $AVE_DB;
// Если id документа не число или 0, прерываем выполнение
if (! (is_numeric($document_id) && $document_id > 0))
exit;
// Если в запросе пришел параметр на удаление всех заметок
if ($all == 1)
{
// Выполянем запрос к БД и удалаем заметки
$AVE_DB->Query("
DELETE
FROM
" . PREFIX . "_document_remarks
WHERE
document_id = '" . $document_id . "'
");
// Выполняем обновление страницы
header('Location:index.php?do=docs&action=remark&Id=' . $document_id . '&pop=1&cp=' . SESSION);
exit;
}
else
{
if (! (isset($_REQUEST['CId']) && is_numeric($_REQUEST['CId']) && $_REQUEST['CId'] > 0))
exit;
// В противном случае, выполняем запрос к БД и удаляем только ту заметку, которая была выбрана
$AVE_DB->Query("
DELETE
FROM
" . PREFIX . "_document_remarks
WHERE
document_id = '" . $document_id . "'
AND
Id = '" . $_REQUEST['CId'] . "'
");
// Выполняем обновление страницы
header('Location:index.php?do=docs&action=remark_reply&Id=' . $document_id . '&pop=1&cp=' . SESSION);
exit;
}
}
/**
* Добавить в навигацию пункт ссылающийся на документ
*
*/
function documentInNavi()
{
global $AVE_DB;
$document_id = isset($_REQUEST['document_id']) ? (int)$_REQUEST['document_id'] : 0;
$rubric_id = isset($_REQUEST['rubric_id']) ? (int)$_REQUEST['rubric_id'] : 0;
$title = isset($_REQUEST['navi_title']) ? clean_no_print_char($_REQUEST['navi_title']) : '';
if ($document_id > 0 && $rubric_id > 0 && $title != '' && check_permission_acp('navigation_new'))
{
$document_alias = $AVE_DB->Query("
SELECT
document_alias
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
AND
rubric_id = '" . $rubric_id . "'
LIMIT 1
")->GetCell();
}
if (isset($document_alias) && $document_alias !== false)
{
// Получаем id пункта меню из запроса
$parent_id = isset($_REQUEST['parent_id']) ? (int)$_REQUEST['parent_id'] : 0;
// Если пункт не родительский, а какой-либо дочерний
if ($parent_id > 0)
{
// Выполняем запрос к БД на получение id меню навигации и уровня
list($navigation_id, $status, $level) = $AVE_DB->Query("
SELECT
navigation_id,
status,
level+1
FROM
" . PREFIX . "_navigation_items
WHERE
navigation_item_id = '" . $parent_id . "'
LIMIT 1
")->FetchArray();
}
else
{
$navigation_id = (isset($_REQUEST['navi_id']) && (int)$_REQUEST['navi_id'] > 0) ? (int)$_REQUEST['navi_id'] : 1;
$status = 1;
$level = 1;
}
$target = (isset($_REQUEST['navi_item_target']) && $_REQUEST['navi_item_target'] == '_blank') ? '_blank' : '_self';
$position = empty($_REQUEST['navi_item_position']) ? 1 : (int)$_REQUEST['navi_item_position'];
if ($level > 3)
$level = '3';
// Добавляем информации о новой связке Документ<->Пункт меню
$AVE_DB->Query("
INSERT
INTO
" . PREFIX . "_navigation_items
SET
title = '" . $title . "',
document_id = '" . $document_id . "',
alias = '" . $document_alias . "',
parent_id = '" . $parent_id . "',
navigation_id = '" . $navigation_id . "',
level = '" . $level . "',
target = '" . $target . "',
position = '" . $position . "',
status = '" . $status . "'
");
}
header('Location:index.php?do=docs&action=after&document_id=' . $document_id . '&rubric_id=' . $rubric_id . '&cp=' . SESSION);
exit;
}
/**
* Вывод формы дополнительных действий с новым или отредактированным документом
*
*/
function documentFormAfter()
{
global $AVE_DB, $AVE_Template;
$document_id = isset($_REQUEST['document_id']) ? (int)$_REQUEST['document_id'] : 0;
$rubric_id = isset($_REQUEST['rubric_id']) ? (int)$_REQUEST['rubric_id'] : 0;
$innavi = (isset($_REQUEST['innavi']) && check_permission_acp('navigation_new')) ? 1 : 0;
if ($document_id > 0 && $rubric_id > 0)
{
$document = $AVE_DB->Query("
SELECT
Id AS document_id,
rubric_id,
document_title AS document_title,
'" . $innavi . "' AS innavi
FROM
" . PREFIX . "_documents
WHERE
Id = '" . $document_id . "'
AND
rubric_id = '" . $rubric_id . "'
LIMIT 1
")->FetchAssocArray();
}
if (empty($document))
{
header('Location:index.php?do=docs&cp=' . SESSION);
exit;
}
$search_query = $_SESSION['search_query'][$document_id] ? true : false;
$AVE_Template->assign('search_query', $search_query);
$AVE_Template->assign($document);
$AVE_Template->assign('content', $AVE_Template->fetch('documents/form_after.tpl'));
}
/**
* Редирект сохраненного документа на раздел, учитывая фильтр
*
*/
function documentSaveRedirect()
{
$document_id = isset($_REQUEST['document_id'])
? (int)$_REQUEST['document_id']
: 0;
// Если не пришел $documet_id
if (! $document_id)
{
header('Location:index.php?do=docs&cp=' . SESSION);
exit;
}
// Параметры поиска
$search_query = base64_decode($_SESSION['search_query'][$document_id]);
$search_query = $search_query
? $search_query
: 'do=docs&cp=' . SESSION;
// Убираем из сессии данный документ
unset ($_SESSION['search_query'][$document_id]);
// Переходим на страницу
header('Location: index.php?' . $search_query);
exit;
}
/**
* Метод, предназначенный для смены автора документа
*
* @param int $doc_id идентификатор документа
* @param int $user_id идентификатор пользователя
*/
function changeAutorSave()
{
global $AVE_DB;
// Если id документа число и оно больше 0, тогда
if (is_numeric($_REQUEST['doc_id']) && $_REQUEST['doc_id'] > 0)
{
// Выполняем запрос к БД на обновление статуса у заметок
$AVE_DB->Query("
UPDATE
" . PREFIX . "_documents
SET
document_author_id = '" . $_REQUEST['user_id'] . "'
WHERE
Id = '" . $_REQUEST['doc_id'] . "'
");
$username = get_username_by_id($_REQUEST['user_id']);
echo "
<script>
window.opener.document.getElementById('doc_id_". $_REQUEST['doc_id'] ."').textContent = '$username';
window.close();
</script>
";
}
exit;
}
/**
* Метод, предназначенный для удаления ревизий документов
*
*/
function documentsRevisionsClear()
{
global $AVE_DB, $AVE_Template;
if (check_permission('document_php'))
{
$sql = $AVE_DB->Query("
TRUNCATE TABLE " . PREFIX . "_document_rev
");
if ($sql->_result === false)
{
$message = $AVE_Template->get_config_vars('SETTINGS_REV_DELETED_ERR');
$header = $AVE_Template->get_config_vars('SETTINGS_ERROR');
$theme = 'error';
}
else
{
$message = $AVE_Template->get_config_vars('SETTINGS_REV_DELETED');
$header = $AVE_Template->get_config_vars('SETTINGS_SUCCESS');
$theme = 'accept';
reportLog($AVE_Template->get_config_vars('SETTINGS_REV_UPDATE'));
}
if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = 'run')
{
echo json_encode(
array(
'message' => $message,
'header' => $header,
'theme' => $theme
)
);
}
else
{
header('Location:index.php?do=settings&cp=' . SESSION);
}
}
exit;
}
/**
* Метод, предназначенный для удаления ревизий документов
*
*/
function documentCounterClear()
{
global $AVE_DB, $AVE_Template;
if (check_permission('gen_settings'))
{
$sql = $AVE_DB->Query("
TRUNCATE TABLE
" . PREFIX . "_view_count
");
if ($sql->_result === false)
{
$message = $AVE_Template->get_config_vars('SETTINGS_COUNT_DELETED_ERR');
$header = $AVE_Template->get_config_vars('SETTINGS_ERROR');
$theme = 'error';
}
else
{
$message = $AVE_Template->get_config_vars('SETTINGS_COUNT_DELETED');
$header = $AVE_Template->get_config_vars('SETTINGS_SUCCESS');
$theme = 'accept';
reportLog($AVE_Template->get_config_vars('SETTINGS_COUNT_UPDATE'));
}
if (isAjax())
{
echo json_encode(
array(
'message' => $message,
'header' => $header,
'theme' => $theme
)
);
}
else
{
header('Location:index.php?do=settings&cp=' . SESSION);
}
}
exit;
}
/**
* Метод, предназначенный для формирования URL
*
*/
function documentAliasCreate()
{
$alias = empty($_REQUEST['alias']) ? '' : prepare_url($_REQUEST['alias']);
$prefix = empty($_REQUEST['prefix']) ? '' : prepare_url($_REQUEST['prefix']);
$title = empty($_REQUEST['title']) ? '' : $_REQUEST['title'];
$title = (URL_YANDEX==true) ? y_translate($title) : prepare_url($title);
if ($alias != $title && $alias != trim($prefix . '/' . $title, '/'))
$alias = trim($alias . '/' . $title, '/');
return $alias;
}
/**
* Метод, предназначенный для контроля уникальности URL
*
*/
function documentAliasCheck()
{
global $AVE_DB, $AVE_Template;
$document_id = (isset($_REQUEST['id']) && is_numeric($_REQUEST['id'])) ? $_REQUEST['id'] : 0;
$document_alias = (isset($_REQUEST['alias'])) ? $_REQUEST['alias'] : '';
$check = (isset($_REQUEST['check']) && (bool)$_REQUEST['check'] === true) ? true : false;
$alias_id = (isset($_REQUEST['alias_id'])) ? (int)$_REQUEST['alias_id'] : 0;
$errors = array();
// Если указанный URL пользователем не пустой
if (! empty($document_alias))
{
// Проверяем, чтобы данный URL соответствовал требованиям
if (preg_match(TRANSLIT_URL ? '/[^\.a-z0-9\/_-]+/' : '/^[^0-9A-Za-zА-Яа-яЁё]+$/u', $document_alias))
{
$errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_SYMBOL');
}
// Если URL начинается с "/" - фиксируем ошибку
if ($document_alias[0] == '/')
$errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_START');
// Если суффикс URL заканчивается на "/" и URL заканчивается на "/" - фиксируем ошибку
if (substr(URL_SUFF, 0, 1) == '/' && substr($document_alias, -1) == '/')
$errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_END');
// Если в URL используются слова apage-XX, artpage-XX,page-XX,print, фиксируем ошибку, где ХХ - число
$matches = preg_grep('/^(apage-\d+|artpage-\d+|page-\d+|print)$/i', explode('/', $document_alias));
if (! empty($matches))
$errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_SEGMENT') . implode(', ', $matches);
$and_docs = (($check === false) ? "AND Id != '" . $document_id . "'" : '');
//$and_aliace = (($check === true) ? "AND document_id != '" . $document_id . "'" : '');
$and_alias_id = (isset($alias_id) ? "AND id != '" . $alias_id . "'" : '');
// Выполняем запрос к БД на получение всех URL и проверку на уникальность
if (empty($errors))
{
$alias_exist = $AVE_DB->Query("
SELECT 1
FROM
" . PREFIX . "_documents
WHERE
document_alias = '" . $document_alias . "'
$and_docs
LIMIT 1
")->NumRows();
if ($alias_exist)
$errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_DUPLICATES');
$alias_exist = $AVE_DB->Query("
SELECT 1
FROM
" . PREFIX . "_document_alias_history
WHERE
document_alias = '" . $document_alias . "'
$and_alias_id
LIMIT 1
")->NumRows();
if ($alias_exist)
$errors[] = $AVE_Template->get_config_vars('DOC_URL_H_ERROR_DUPLICATES');
}
}
else
{ // В противном случае, если URL пустой, формируем сообщение об ошибке
$errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_EMTY');
}
// Если ошибок не найдено, формируем сообщение об успешной операции
if (empty($errors))
{
return json_encode(array($AVE_Template->get_config_vars('DOC_URL_CHECK_OK') . implode(',<br />', $errors), 'accept', $check));
}
else
{ // В противном случае формируем сообщение с ошибкой
return json_encode(array($AVE_Template->get_config_vars('DOC_URL_CHECK_ER') . implode(',<br />', $errors), 'error'));
}
}
/**
* Метод, предназначенный для
*
*/
function documentAliasHistoryList()
{
global $AVE_DB, $AVE_Template;
$sql = $AVE_DB->Query("
SELECT
h.id,
h.document_id,
h.document_alias_changed,
COUNT(h.document_id) as count,
d.rubric_id,
d.document_title,
d.document_alias,
r.rubric_title
FROM
" . PREFIX . "_document_alias_history AS h
LEFT JOIN
" . PREFIX . "_documents AS d
ON h.document_id = d.Id
LEFT JOIN
" . PREFIX . "_rubrics AS r
ON d.rubric_id = r.Id
WHERE
h.document_id = d.Id
GROUP BY
h.document_id
ORDER BY
h.document_alias_changed DESC
");
$documents = array();
while ($row = $sql->FetchAssocArray())
{
array_push($documents, $row);
}
$AVE_Template->assign('documents', $documents);
$AVE_Template->assign('content', $AVE_Template->fetch('documents/alias_list.tpl'));
}
/**
* Метод, предназначенный для
*
*/
function documentAliasListDoc($id)
{
global $AVE_DB, $AVE_Template, $AVE_Rubric;
$document = $AVE_DB->Query("
SELECT
d.rubric_id,
d.document_title,
d.document_alias,
r.rubric_title
FROM
" . PREFIX . "_documents AS d
LEFT JOIN
" . PREFIX . "_rubrics AS r
ON d.rubric_id = r.Id
WHERE
d.Id = " . $id . "
")->FetchRow();
$sql = $AVE_DB->Query("
SELECT *
FROM
".PREFIX."_document_alias_history
WHERE
document_id = '". $id ."'
");
$aliases = array();
while ($row = $sql->FetchRow())
{
$row->document_alias_author_name = get_username_by_id($row->document_alias_author);
array_push($aliases, $row);
}
$AVE_Template->assign('document', $document);
$AVE_Template->assign('aliases', $aliases);
switch($_REQUEST['sub'])
{
case 'list':
$AVE_Template->assign('content', $AVE_Template->fetch('documents/alias_doc_list.tpl'));
break;
default:
$AVE_Template->assign('content', $AVE_Template->fetch('documents/alias_doc.tpl'));
break;
}
}
/**
* Метод, предназначенный для
*
*/
function documentAliasNew()
{
global $AVE_DB, $AVE_Template;
$sql = $AVE_DB->Query("
INSERT
INTO
" . PREFIX . "_document_alias_history
SET
document_id = '" . (int)$_REQUEST['doc_id'] . "',
document_alias = '" . trim($_REQUEST['alias']) . "',
document_alias_author = '" . (int)UID . "',
document_alias_changed = '" . time() . "'
");
if ($sql === false)
{
$message = $AVE_Template->get_config_vars('DOC_ALIASES_REP_ER_T');
$header = $AVE_Template->get_config_vars('DOC_ALIASES_REP_ER');
$theme = 'error';
}
else
{
$message = $AVE_Template->get_config_vars('DOC_ALIASES_REP_OK_T');
$header = $AVE_Template->get_config_vars('DOC_ALIASES_REP_OK');
$theme = 'accept';
}
if (isAjax())
{
echo json_encode(
array(
'message' => $message,
'header' => $header,
'theme' => $theme
)
);
}
else
{
header('Location:index.php?do=docs&action=aliases_doc&cp=' . SESSION);
}
exit;
}
/**
* Метод, предназначенный для
*
*/
function documentAliasEdit()
{
global $AVE_DB, $AVE_Template;
$sql = $AVE_DB->Query("
UPDATE
" . PREFIX . "_document_alias_history
SET
document_alias = '" . $_REQUEST['alias'] . "'
WHERE
id = '" . $_REQUEST['id'] . "'
");
if ($sql === false)
{
$message = $AVE_Template->get_config_vars('DOC_ALIASES_REP_ER_T_E');
$header = $AVE_Template->get_config_vars('DOC_ALIASES_REP_ER');
$theme = 'error';
}
else
{
$message = $AVE_Template->get_config_vars('DOC_ALIASES_REP_OK_T_E');
$header = $AVE_Template->get_config_vars('DOC_ALIASES_REP_OK');
$theme = 'accept';
}
if (isAjax())
{
echo json_encode(
array(
'message' => $message,
'header' => $header,
'theme' => $theme
)
);
}
else
{
header('Location:index.php?do=docs&action=aliases_doc&cp=' . SESSION);
}
exit;
}
/**
* Метод, предназначенный для
*
*/
function documentAliasSave()
{
global $AVE_DB, $AVE_Template;
if (isset($_REQUEST['alias_del']))
{
foreach ($_REQUEST['alias_del'] as $id => $val)
{
$AVE_DB->Query("
DELETE
FROM
" . PREFIX . "_document_alias_history
WHERE
id = '" . $id . "'
");
}
}
exit;
}
/**
* Метод, предназначенный для
*
*/
function documentAliasDel()
{
global $AVE_DB, $AVE_Template;
if (isset($_REQUEST['alias_id']))
{
$AVE_DB->Query("
DELETE
FROM
" . PREFIX . "_document_alias_history
WHERE
id = '" . $_REQUEST['alias_id'] . "'
");
}
exit;
}
}
?>