обновление много всего
This commit is contained in:
38
ReadMe.txt
38
ReadMe.txt
@@ -10,40 +10,4 @@ http://malsup.com/jquery/form/
|
||||
|
||||
|
||||
|
||||
/* ====================================================================
|
||||
СТИЛИ ДЛЯ ДРЕВОВИДНОГО ОТОБРАЖЕНИЯ КОММЕНТАРИЕВ (Replies)
|
||||
==================================================================== */
|
||||
|
||||
/* 1. Общий контейнер ответа, который находится внутри .mod_comment_comment
|
||||
и имеет отступ ms-4 */
|
||||
.mod_comment_comment .mod_comment_comment.ms-4 {
|
||||
/* Добавляем вертикальную линию слева */
|
||||
border-left: 3px solid #dee2e6; /* Легкая граница */
|
||||
|
||||
/* Уменьшаем margin-left, который дает ms-4, чтобы освободить место
|
||||
для линии и при этом не уходить слишком далеко вправо на каждом уровне. */
|
||||
margin-left: 20px !important; /* Принудительно уменьшаем отступ */
|
||||
padding-left: 15px; /* Отступ между линией и контентом ответа */
|
||||
|
||||
/* Опционально: немного отличающийся фон */
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
/* 2. Отдельно стилизуем рамку для вложенных карточек, чтобы они не выглядели
|
||||
громоздко внутри родителя */
|
||||
.mod_comment_comment .mod_comment_comment.ms-4 > .mod_comment_box {
|
||||
border: none !important; /* Убираем стандартную рамку карточки, чтобы осталась только наша вертикальная линия */
|
||||
}
|
||||
|
||||
/* 3. Убираем рамки у вложенных заголовков, чтобы линия была чистой */
|
||||
.mod_comment_comment .mod_comment_comment.ms-4 > .mod_comment_box > .card-header {
|
||||
border-bottom: none !important;
|
||||
}
|
||||
|
||||
/* 4. Более глубокий уровень вложенности (если ответов много) */
|
||||
/* Если ответ на ответ имеет дополнительный ms-4, стилизуем его дальше */
|
||||
.mod_comment_comment .mod_comment_comment.ms-4 .mod_comment_comment.ms-4 {
|
||||
border-color: #adb5bd; /* Чуть темнее линия для следующего уровня */
|
||||
background-color: #fff; /* Возвращаем белый фон для контраста */
|
||||
}
|
||||
|
||||
Добавить в шаблон <link rel="stylesheet" href="[tag:path]modules/comment/css/mod_comment_styles.css">
|
||||
@@ -181,64 +181,49 @@ class Comment
|
||||
*
|
||||
* @todo Вывод информации о авторе комментария
|
||||
*/
|
||||
function commentListShow($tpl_dir)
|
||||
function commentListShow($tpl_dir)
|
||||
{
|
||||
global $AVE_DB, $AVE_Template, $AVE_Core;
|
||||
|
||||
// Используем оператор объединения с null для PHP 8.4
|
||||
$document_id = (int)($_REQUEST['id'] ?? 0);
|
||||
$artpage = $_REQUEST['artpage'] ?? null;
|
||||
$apage = $_REQUEST['apage'] ?? null;
|
||||
$user_group = UGROUP ?? 0;
|
||||
|
||||
// Получаем ВСЕ настройки модуля разом
|
||||
$settings = $this->_commentSettingsGet();
|
||||
|
||||
// Проверяем, что в настройках модуля разрешено комментирование документов
|
||||
if ($this->_commentSettingsGet('comment_active') == 1)
|
||||
// Проверяем, что в настройках модуля разрешено комментирование
|
||||
if (isset($settings['comment_active']) && $settings['comment_active'] == 1)
|
||||
{
|
||||
// =================================================================================
|
||||
// НОВОЕ: ПРОВЕРКА ПРАВ НА ПРОСМОТР КОММЕНТАРИЕВ (Read Permission)
|
||||
// =================================================================================
|
||||
$read_groups = explode(',', $this->_commentSettingsGet('comment_user_groups_read'));
|
||||
|
||||
$assign['no_read_permission'] = 0; // Флаг: 0 = права есть
|
||||
$read_groups = explode(',', $settings['comment_user_groups_read']);
|
||||
$assign['no_read_permission'] = 0;
|
||||
|
||||
// Если группа текущего пользователя НЕ в списке разрешенных для ЧТЕНИЯ,
|
||||
if (!in_array($user_group, $read_groups))
|
||||
{
|
||||
// Устанавливаем флаг, что прав на чтение нет
|
||||
$assign['no_read_permission'] = 1;
|
||||
}
|
||||
// =================================================================================
|
||||
|
||||
$assign['display_comments'] = 1;
|
||||
|
||||
// Если группа пользователя, который в текущий момент просматривает документ попадает в список
|
||||
// разрешенных (в настройках модуля), тогда создаем флаг, который будет разрешать к показу
|
||||
// форму для добавления нового комментария
|
||||
if (in_array($user_group, explode(',', $this->_commentSettingsGet('comment_user_groups'))))
|
||||
if (in_array($user_group, explode(',', $settings['comment_user_groups'])))
|
||||
{
|
||||
$assign['cancomment'] = 1;
|
||||
}
|
||||
|
||||
// ЕСЛИ ЕСТЬ ПРАВА НА ЧТЕНИЕ, ПРОДОЛЖАЕМ ВЫБОРКУ И ВЫВОД
|
||||
if ($assign['no_read_permission'] == 0)
|
||||
{
|
||||
$assign['comment_max_chars'] = $this->_commentSettingsGet('comment_max_chars');
|
||||
$assign['im'] = $this->_commentSettingsGet('comment_use_antispam');
|
||||
$assign['comment_max_chars'] = $settings['comment_max_chars'];
|
||||
$assign['im'] = $settings['comment_use_antispam'];
|
||||
|
||||
// Выполняем запрос к БД на получение количества комментариев для текущего документа
|
||||
$comments = array();
|
||||
|
||||
if ($this->_commentSettingsGet('comment_use_page_nav') == 1)
|
||||
if ($settings['comment_use_page_nav'] == 1)
|
||||
{
|
||||
$limit = $this->_commentSettingsGet('comment_page_nav_count');
|
||||
$limit = $settings['comment_page_nav_count'];
|
||||
$start = get_current_page() * $limit - $limit;
|
||||
|
||||
$num = $AVE_DB->Query("
|
||||
SELECT COUNT(*)
|
||||
FROM " . PREFIX . "_module_comment_info
|
||||
WHERE document_id = '" . $document_id . "'
|
||||
")->GetCell();
|
||||
$num = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "'")->GetCell();
|
||||
|
||||
$sql = $AVE_DB->Query("
|
||||
SELECT *
|
||||
@@ -246,78 +231,41 @@ class Comment
|
||||
WHERE document_id = '" . $document_id . "'
|
||||
" . ($user_group == 1 ? '' : "AND comment_status = '1'") . "
|
||||
ORDER BY comment_published ASC
|
||||
LIMIT " . $start . "," . $limit . "
|
||||
LIMIT " . (int)$start . "," . (int)$limit . "
|
||||
");
|
||||
|
||||
$pages = @ceil($num / $limit);
|
||||
|
||||
if ($num > $limit)
|
||||
{
|
||||
$page_nav = '<a class="page_nav" href="index.php?id=' . $AVE_Core->curentdoc->Id
|
||||
. '&doc=' . (empty($AVE_Core->curentdoc->document_alias) ? prepare_url($AVE_Core->curentdoc->document_title) : $AVE_Core->curentdoc->document_alias)
|
||||
. ((isset($artpage) && is_numeric($artpage)) ? '&artpage=' . $artpage : '')
|
||||
. ((isset($apage) && is_numeric($apage)) ? '&apage=' . $apage : '')
|
||||
. '&page={s}">{t}</a> ';
|
||||
$page_nav = get_pagination(ceil($num / $limit), 'page', $page_nav, get_settings('navi_box'));
|
||||
|
||||
// *** ПРИМЕНЯЕМ КОСТЫЛИ ИЗ РЕАЛИЗАЦИИ ЗАПРОСОВ ДЛЯ ЧПУ ***
|
||||
// 1. Применяем rewrite_link и очищаем от тройных/двойных слешей
|
||||
$page_nav = str_ireplace('"//"', '"/"', str_ireplace('///', '/', rewrite_link($page_nav)));
|
||||
|
||||
// 2. Очищаем от URL_SUFF, если он есть (хотя это, возможно, не нужно для комментариев)
|
||||
// (Я опущу эту строку, так как она специфична для главной страницы.)
|
||||
// $page_nav = str_ireplace('"//' . URL_SUFF . '"', '"/"', $page_nav);
|
||||
|
||||
// 3. Запускаем более общую очистку, если там есть Query (GET-параметры),
|
||||
// что гарантирует удаление двойных слешей, которые могут появиться в пути
|
||||
$page_nav = preg_replace('/(?<!:)\/\//', '/', $page_nav);
|
||||
// *** КОНЕЦ ПРИМЕНЕНИЯ КОСТЫЛЕЙ ***
|
||||
|
||||
$GLOBALS['page_id'][$document_id]['page']=($GLOBALS['page_id'][$document_id]['page']>ceil($num / $limit) ? $GLOBALS['page_id'][$document_id]['page'] : ceil($num / $limit));
|
||||
}
|
||||
if ($num > $limit)
|
||||
{
|
||||
$page_nav = '<a class="page_nav" href="index.php?id=' . $AVE_Core->curentdoc->Id
|
||||
. '&doc=' . (empty($AVE_Core->curentdoc->document_alias) ? prepare_url($AVE_Core->curentdoc->document_title) : $AVE_Core->curentdoc->document_alias)
|
||||
. ((isset($artpage) && is_numeric($artpage)) ? '&artpage=' . $artpage : '')
|
||||
. ((isset($apage) && is_numeric($apage)) ? '&apage=' . $apage : '')
|
||||
. '&page={s}">{t}</a> ';
|
||||
$page_nav = get_pagination(ceil($num / $limit), 'page', $page_nav, get_settings('navi_box'));
|
||||
$page_nav = preg_replace('/(?<!:)\/\//', '/', $page_nav);
|
||||
}
|
||||
else
|
||||
{
|
||||
$page_nav = '';
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$sql = $AVE_DB->Query("
|
||||
SELECT *
|
||||
FROM " . PREFIX . "_module_comment_info
|
||||
WHERE document_id = '" . $document_id . "'
|
||||
" . ($user_group == 1 ? '' : "AND comment_status = '1'") . "
|
||||
ORDER BY comment_published ASC
|
||||
");
|
||||
|
||||
$sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module_comment_info WHERE document_id = '" . $document_id . "' " . ($user_group == 1 ? '' : "AND comment_status = '1'") . " ORDER BY comment_published ASC");
|
||||
$page_nav = '';
|
||||
}
|
||||
|
||||
// Получаем формат даты, который указан в общих настройках системы и
|
||||
// приводим дату создания комментария и дату редактирования к этому формату
|
||||
$date_time_format = $AVE_Template->get_config_vars('COMMENT_DATE_TIME_FORMAT');
|
||||
while ($row = $sql->FetchAssocArray())
|
||||
{
|
||||
|
||||
// -----------------------------------------------------
|
||||
// !!! НАЧАЛО: ВНЕДРЕНИЕ АВАТАРА !!!
|
||||
// -----------------------------------------------------
|
||||
if (isset($row['comment_author_id']) && $row['comment_author_id'] > 0)
|
||||
{
|
||||
// Вызываем глобальную функцию getAvatar с нужным размером (48px)
|
||||
// и сохраняем результат в поле 'avatar' для Smarty:
|
||||
$row['avatar'] = getAvatar($row['comment_author_id'], 48);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Для гостей (comment_author_id = 0) или неавторизованных:
|
||||
// Передаем пустую строку, чтобы Smarty использовал заглушку.
|
||||
$row['avatar'] = '';
|
||||
}
|
||||
// -----------------------------------------------------
|
||||
// !!! КОНЕЦ: ВНЕДРЕНИЕ АВАТАРА !!!
|
||||
// -----------------------------------------------------
|
||||
$row['comment_published'] = ave_date_format($date_time_format, $row['comment_published']);
|
||||
$row['comment_changed'] = ave_date_format($date_time_format, $row['comment_changed']);
|
||||
|
||||
@@ -326,13 +274,10 @@ class Comment
|
||||
}
|
||||
else
|
||||
{
|
||||
// Если нет прав, то эти переменные остаются пустыми/неопределенными
|
||||
$comments = array();
|
||||
$page_nav = '';
|
||||
}
|
||||
|
||||
|
||||
// Формируем ряд переменных для использования в шаблоне
|
||||
$assign['closed'] = @$comments[0][0]['comments_close'];
|
||||
$assign['comments'] = $comments;
|
||||
$assign['theme'] = defined('THEME_FOLDER') ? THEME_FOLDER : DEFAULT_THEME_FOLDER;
|
||||
@@ -340,11 +285,14 @@ class Comment
|
||||
$assign['page'] = base64_encode(get_redirect_link());
|
||||
$assign['subtpl'] = $tpl_dir . $this->_comments_tree_sub_tpl;
|
||||
|
||||
$AVE_Template->assign($assign);
|
||||
// --- ВОТ ЭТА СТРОКА РЕШАЕТ ВСЁ ---
|
||||
// Она передает ВСЕ настройки модуля (включая твои новые поля) в шаблон
|
||||
$AVE_Template->assign($settings);
|
||||
// --------------------------------
|
||||
|
||||
$AVE_Template->assign($assign);
|
||||
$AVE_Template->assign('page_nav', $page_nav);
|
||||
|
||||
// Отображаем шаблон
|
||||
$AVE_Template->display($tpl_dir . $this->_comments_tree_tpl);
|
||||
}
|
||||
}
|
||||
@@ -380,7 +328,7 @@ class Comment
|
||||
$AVE_Template->display($tpl_dir . $this->_comment_form_tpl);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Метод, предназначенный для записи в БД нового комментария.
|
||||
*
|
||||
* @param string $tpl_dir - путь к шаблонам модуля
|
||||
@@ -396,6 +344,9 @@ class Comment
|
||||
$user_group = UGROUP ?? 0;
|
||||
$secure_code = $_POST['securecode'] ?? '';
|
||||
$session_captcha = $_SESSION['captcha_keystring'] ?? null;
|
||||
|
||||
// Получаем настройки модуля для проверки обязательных полей
|
||||
$settings = $this->_commentSettingsGet();
|
||||
|
||||
// Если запрос пришел не ajax запросом, тогда формируем ссылку для последующего редиректа
|
||||
if (! $ajax)
|
||||
@@ -403,8 +354,23 @@ class Comment
|
||||
$link = rewrite_link(base64_decode($page));
|
||||
}
|
||||
|
||||
// --- ПРОВЕРКА ОБЯЗАТЕЛЬНЫХ УНИВЕРСАЛЬНЫХ ПОЛЕЙ ---
|
||||
// Проверка Поля 1 (хранится в website)
|
||||
if ($settings['comment_show_f1'] == 1 && $settings['comment_req_f1'] == 1 && empty($_POST['comment_author_website']))
|
||||
{
|
||||
if ($ajax) { echo 'error_req_f1'; exit; }
|
||||
else { header('Location:' . $link . '#end'); exit; }
|
||||
}
|
||||
// Проверка Поля 2 (хранится в city)
|
||||
if ($settings['comment_show_f2'] == 1 && $settings['comment_req_f2'] == 1 && empty($_POST['comment_author_city']))
|
||||
{
|
||||
if ($ajax) { echo 'error_req_f2'; exit; }
|
||||
else { header('Location:' . $link . '#end'); exit; }
|
||||
}
|
||||
// -------------------------------------------------
|
||||
|
||||
// Если в настройках модуля включено использование защитного кода, тогда
|
||||
if ($this->_commentSettingsGet('comment_use_antispam') == 1)
|
||||
if ($settings['comment_use_antispam'] == 1)
|
||||
{
|
||||
// Если введенный пользователем защитный код неверен, тогда выполняем обновление кода
|
||||
if (! (isset($session_captcha) && $session_captcha == $secure_code))
|
||||
@@ -426,50 +392,45 @@ class Comment
|
||||
}
|
||||
|
||||
// Определяем флаг модерации комментариев
|
||||
$comment_status = ($this->_commentSettingsGet('comment_need_approve') == 1) ? 0 : 1;
|
||||
$comment_status = ($settings['comment_need_approve'] == 1) ? 0 : 1;
|
||||
|
||||
// Если комментарии разрешены, тогда получаем все данные, который пользователь указал в форме
|
||||
if ($this->_commentSettingsGet('comment_active') == 1
|
||||
if ($settings['comment_active'] == 1
|
||||
&& !empty($_POST['comment_text'])
|
||||
&& !empty($_POST['comment_author_name'])
|
||||
&& in_array($user_group, explode(',', $this->_commentSettingsGet('comment_user_groups'))))
|
||||
&& in_array($user_group, explode(',', $settings['comment_user_groups'])))
|
||||
{
|
||||
// --- !!! НАЧАЛО БЕЗОПАСНОСТИ: Санитаризация и Экранирование !!! ---
|
||||
|
||||
$new_comment['parent_id'] = (int)($_POST['parent_id'] ?? 0);
|
||||
$new_comment['document_id'] = (int)($_POST['doc_id'] ?? 0);
|
||||
|
||||
// Экранирование для предотвращения SQLi:
|
||||
// Санитаризация для предотвращения XSS в строковых полях:
|
||||
$new_comment['comment_author_name'] = addslashes(strip_tags($_POST['comment_author_name'] ?? ''));
|
||||
$new_comment['comment_author_id'] = empty($_SESSION['user_id']) ? 0 : (int)$_SESSION['user_id'];
|
||||
$new_comment['comment_author_email'] = addslashes(strip_tags($_POST['comment_author_email'] ?? ''));
|
||||
$new_comment['comment_author_city'] = addslashes(strip_tags($_POST['comment_author_city'] ?? ''));
|
||||
$new_comment['comment_author_website'] = addslashes(strip_tags($_POST['comment_author_website'] ?? ''));
|
||||
|
||||
|
||||
// Маппинг универсальных полей в существующие колонки БД
|
||||
$new_comment['comment_author_city'] = addslashes(strip_tags($_POST['comment_author_city'] ?? '')); // Поле 2
|
||||
$new_comment['comment_author_website'] = addslashes(strip_tags($_POST['comment_author_website'] ?? '')); // Поле 1
|
||||
|
||||
$new_comment['comment_author_ip'] = $_SERVER['REMOTE_ADDR'];
|
||||
$new_comment['comment_published'] = time();
|
||||
$new_comment['comment_status'] = $comment_status;
|
||||
|
||||
// Текст комментария до очистки
|
||||
$comment_text_raw = $_POST['comment_text'] ?? '';
|
||||
|
||||
$comment_text_raw = $_POST['comment_text'] ?? '';
|
||||
|
||||
// Определяем максимальную длину символов для комментария
|
||||
$comment_max_chars = $this->_commentSettingsGet('comment_max_chars');
|
||||
$comment_max_chars = $settings['comment_max_chars'];
|
||||
$comment_max_chars = (!empty($comment_max_chars) && $comment_max_chars > 10) ? $comment_max_chars : 200;
|
||||
|
||||
// 1. Убираем HTML-теги для предотвращения XSS
|
||||
$comment_text_clean = strip_tags(stripslashes($comment_text_raw));
|
||||
|
||||
// 2. Обрезка
|
||||
|
||||
$comment_text_clean = strip_tags(stripslashes($comment_text_raw));
|
||||
|
||||
$comment_text_cut = mb_substr($comment_text_clean, 0, $comment_max_chars);
|
||||
$comment_text_cut .= (mb_strlen($comment_text_clean) > $comment_max_chars) ? '…' : '';
|
||||
|
||||
// 3. Экранирование текста перед вставкой в SQL
|
||||
|
||||
$new_comment['comment_text'] = addslashes($comment_text_cut);
|
||||
|
||||
// --- !!! КОНЕЦ БЕЗОПАСНОСТИ !!! ---
|
||||
|
||||
|
||||
// --- !!! КОНЕЦ БЕЗОПАСНОСТИ !!! ---
|
||||
|
||||
// Выполняем запрос к БД на добавление комментария
|
||||
$AVE_DB->Query("
|
||||
INSERT INTO " . PREFIX . "_module_comment_info
|
||||
@@ -479,51 +440,35 @@ class Comment
|
||||
");
|
||||
$new_comment['Id'] = $AVE_DB->InsertId();
|
||||
|
||||
// Получаем e-mail адрес из Общих настроек системы и формируем ссылку на комментарий в Публичной части
|
||||
// Получаем настройки и уведомляем админа (код без изменений...)
|
||||
$mail_from = get_settings('mail_from');
|
||||
$mail_from_name = get_settings('mail_from_name');
|
||||
$page_link = get_home_link() . urldecode(base64_decode($page)) . '&subaction=showonly&comment_id=' . $new_comment['Id'] . '#' . $new_comment['Id'];
|
||||
|
||||
// Формируем текст уведомления для отправки на e-mail
|
||||
$mail_text = $AVE_Template->get_config_vars('COMMENT_MESSAGE_ADMIN');
|
||||
// Используем stripslashes для очистки текста, который будет отправлен по почте
|
||||
$mail_text = str_replace('%COMMENT%', stripslashes($new_comment['comment_text']), $mail_text);
|
||||
$mail_text = str_replace('%N%', "\n", $mail_text);
|
||||
$mail_text = str_replace('%PAGE%', $page_link, $mail_text);
|
||||
$mail_text = str_replace('&', '&', $mail_text);
|
||||
|
||||
// Отправляем уведомление
|
||||
send_mail(
|
||||
$mail_from,
|
||||
$mail_text,
|
||||
$AVE_Template->get_config_vars('COMMENT_SUBJECT_MAIL'),
|
||||
$mail_from,
|
||||
$mail_from_name,
|
||||
'text'
|
||||
);
|
||||
send_mail($mail_from, $mail_text, $AVE_Template->get_config_vars('COMMENT_SUBJECT_MAIL'), $mail_from, $mail_from_name, 'text');
|
||||
|
||||
// Если данные были отправлены ajax-запросом, тогда выполняем автоматический показ комментария
|
||||
// на странице.
|
||||
if ($ajax)
|
||||
{
|
||||
// ---------------------------------------------------------------------
|
||||
// !!! НАЧАЛО: ИСПРАВЛЕНИЕ ДЛЯ AJAX-ОТВЕТА (ПОЛУЧЕНИЕ АВАТАРА) !!!
|
||||
// ---------------------------------------------------------------------
|
||||
if (isset($new_comment['comment_author_id']) && $new_comment['comment_author_id'] > 0)
|
||||
{
|
||||
// Вызываем глобальную функцию getAvatar с нужным размером (48px)
|
||||
$new_comment['avatar'] = getAvatar($new_comment['comment_author_id'], 48);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Для гостей
|
||||
$new_comment['avatar'] = '';
|
||||
}
|
||||
// ---------------------------------------------------------------------
|
||||
// !!! КОНЕЦ: ИСПРАВЛЕНИЕ ДЛЯ AJAX-ОТВЕТА !!!
|
||||
// ----
|
||||
$new_comment['comment_changed'] = 0;
|
||||
$new_comment['comment_published'] = ave_date_format($AVE_Template->get_config_vars('COMMENT_DATE_TIME_FORMAT'), $new_comment['comment_published']);
|
||||
|
||||
// Добавляем настройки полей в массив комментария, чтобы шаблон дерева мог их использовать
|
||||
$new_comment['settings'] = $settings;
|
||||
|
||||
$subcomments[] = $new_comment;
|
||||
$AVE_Template->assign('subcomments', $subcomments);
|
||||
$AVE_Template->assign('theme', defined('THEME_FOLDER') ? THEME_FOLDER : DEFAULT_THEME_FOLDER);
|
||||
@@ -531,7 +476,6 @@ class Comment
|
||||
}
|
||||
}
|
||||
|
||||
// Если же данные пришли НЕ ajax-запросом, тогда полностью обновляем страницу.
|
||||
if (! $ajax) header('Location:' . str_replace("//", "", $link) . '#end');
|
||||
exit;
|
||||
}
|
||||
@@ -940,7 +884,8 @@ class Comment
|
||||
$AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . $this->_admin_edit_link_tpl));
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
/**
|
||||
* Метод, предназначенный для управления настройками модуля
|
||||
*
|
||||
* @param string $tpl_dir - путь к шаблонам модуля
|
||||
@@ -953,33 +898,50 @@ class Comment
|
||||
$request_sub = $_REQUEST['sub'] ?? '';
|
||||
$post_max_chars = $_POST['comment_max_chars'] ?? 0;
|
||||
$post_user_groups = $_POST['comment_user_groups'] ?? array();
|
||||
// НОВОЕ: Получение данных для групп, которым разрешен просмотр
|
||||
|
||||
$post_user_groups_read = $_POST['comment_user_groups_read'] ?? array();
|
||||
// КОНЕЦ НОВОГО
|
||||
|
||||
$post_need_approve = $_POST['comment_need_approve'] ?? 0;
|
||||
$post_active = $_POST['comment_active'] ?? 0;
|
||||
$post_use_antispam = $_POST['comment_use_antispam'] ?? 0;
|
||||
$post_use_page_nav = $_POST['comment_use_page_nav'] ?? 0;
|
||||
$post_page_nav_count = $_POST['comment_page_nav_count'] ?? 0;
|
||||
|
||||
// Если в запросе содержится подзапрос на сохранение данных (пользователь нажал кнопку
|
||||
// сохранить изменения), тогда выполняем запрос к БД на обновление информации.
|
||||
// НОВОЕ: Получение данных для универсальных полей
|
||||
$post_show_f1 = $_POST['comment_show_f1'] ?? 0;
|
||||
$post_req_f1 = $_POST['comment_req_f1'] ?? 0;
|
||||
$post_name_f1 = $_POST['comment_name_f1'] ?? '';
|
||||
|
||||
$post_show_f2 = $_POST['comment_show_f2'] ?? 0;
|
||||
$post_req_f2 = $_POST['comment_req_f2'] ?? 0;
|
||||
$post_name_f2 = $_POST['comment_name_f2'] ?? '';
|
||||
|
||||
// Если в запросе содержится подзапрос на сохранение данных
|
||||
if ($request_sub == 'save')
|
||||
{
|
||||
$max_chars = (empty($post_max_chars) || $post_max_chars < 50) ? 50 : $post_max_chars;
|
||||
|
||||
// Очищаем названия полей вручную, так как EscapeString не поддерживается
|
||||
$clean_name_f1 = htmlspecialchars(stripslashes($post_name_f1), ENT_QUOTES);
|
||||
$clean_name_f2 = htmlspecialchars(stripslashes($post_name_f2), ENT_QUOTES);
|
||||
|
||||
$AVE_DB->Query("
|
||||
UPDATE " . PREFIX . "_module_comments
|
||||
SET
|
||||
comment_max_chars = '" . (int)$max_chars . "',
|
||||
comment_user_groups = '" . implode(',', $post_user_groups) . "',
|
||||
comment_user_groups_read = '" . implode(',', $post_user_groups_read) . "', /* <-- СОХРАНЕНИЕ НОВОГО ПОЛЯ */
|
||||
comment_user_groups_read = '" . implode(',', $post_user_groups_read) . "',
|
||||
comment_need_approve = '" . (int)$post_need_approve . "',
|
||||
comment_active = '" . (int)$post_active . "',
|
||||
comment_use_antispam = '" . (int)$post_use_antispam . "',
|
||||
comment_use_page_nav = '" . (int)$post_use_page_nav . "',
|
||||
comment_page_nav_count = '" . (int)$post_page_nav_count . "'
|
||||
comment_page_nav_count = '" . (int)$post_page_nav_count . "',
|
||||
comment_show_f1 = '" . (int)$post_show_f1 . "',
|
||||
comment_req_f1 = '" . (int)$post_req_f1 . "',
|
||||
comment_name_f1 = '" . $clean_name_f1 . "',
|
||||
comment_show_f2 = '" . (int)$post_show_f2 . "',
|
||||
comment_req_f2 = '" . (int)$post_req_f2 . "',
|
||||
comment_name_f2 = '" . $clean_name_f2 . "'
|
||||
WHERE
|
||||
Id = 1
|
||||
");
|
||||
@@ -990,9 +952,10 @@ class Comment
|
||||
|
||||
// Преобразуем поля с правами в массивы для удобства отображения в шаблоне
|
||||
$row['comment_user_groups'] = explode(',', $row['comment_user_groups']);
|
||||
$row['comment_user_groups_read'] = explode(',', $row['comment_user_groups_read']); /* <-- ПОЛУЧЕНИЕ НОВОГО ПОЛЯ */
|
||||
$row['comment_user_groups_read'] = explode(',', $row['comment_user_groups_read']);
|
||||
|
||||
// Передаем данные в шаблон и показываем страницу с настройками модуля
|
||||
|
||||
// Передаем данные в шаблон
|
||||
$AVE_Template->assign($row);
|
||||
$AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . $this->_admin_settings_tpl));
|
||||
}
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
function validate(formData, jqForm, options){
|
||||
function validate(formData, jqForm, options){
|
||||
$('.alert').remove();
|
||||
var form = jqForm ? jqForm[0] : $('#mod_comment_new form')[0];
|
||||
|
||||
@@ -156,6 +156,27 @@
|
||||
$(form.comment_author_email).focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
// --- НОВОЕ: Проверка динамических полей ---
|
||||
|
||||
// Проверка Поля №1 (website)
|
||||
if (typeof REQ_F1 !== 'undefined' && REQ_F1 == '1') {
|
||||
if (form.comment_author_website && !form.comment_author_website.value) {
|
||||
alert("Пожалуйста, заполните поле: " + NAME_F1);
|
||||
$(form.comment_author_website).focus();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Проверка Поля №2 (city)
|
||||
if (typeof REQ_F2 !== 'undefined' && REQ_F2 == '1') {
|
||||
if (form.comment_author_city && !form.comment_author_city.value) {
|
||||
alert("Пожалуйста, заполните поле: " + NAME_F2);
|
||||
$(form.comment_author_city).focus();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// ------------------------------------------
|
||||
|
||||
// Проверка текста
|
||||
if (!form.comment_text || !form.comment_text.value){
|
||||
|
||||
@@ -89,4 +89,6 @@ COMMENT_BUTTON_CANCEL = "Отменить"
|
||||
COMMENT_CHARS_LEFT = "Количество оставшихся символов"
|
||||
COMMENT_BUTTON_CANCEL = "Отменить"
|
||||
COMMENT_BUTTON_RESET = "Очистить"
|
||||
COMMENT_FOR_GROUPS_READ = "Группы пользователей, которым разрешен просмотр комментариев:"
|
||||
COMMENT_FOR_GROUPS_READ = "Группы пользователей, которым разрешен просмотр комментариев:"
|
||||
COMMENT_HEADER_NAME = "Значение"
|
||||
COMMENT_HEADER_PARAMETR = "Параметр"
|
||||
82
sql.php
82
sql.php
@@ -3,13 +3,7 @@
|
||||
/**
|
||||
* AVE.cms - Модуль Комментарии
|
||||
*
|
||||
* Данный файл является частью модуля "Комментарии" и содержит mySQL-запросы
|
||||
* к базе данных при операцих установки, обновления и удаления модуля через Панель управления.
|
||||
*
|
||||
* @package AVE.cms
|
||||
* @subpackage module_Comment
|
||||
* @since 1.4
|
||||
* @filesource
|
||||
* Обновленная структура с поддержкой произвольных полей
|
||||
*/
|
||||
|
||||
$module_sql_install = array();
|
||||
@@ -20,18 +14,25 @@ $module_sql_deinstall[] = "DROP TABLE IF EXISTS `%%PRFX%%_module_comments`;";
|
||||
$module_sql_deinstall[] = "DROP TABLE IF EXISTS `%%PRFX%%_module_comment_info`;";
|
||||
|
||||
// =================================================================================
|
||||
// 1. ИЗМЕНЕНИЯ ДЛЯ УСТАНОВКИ МОДУЛЯ
|
||||
// 1. УСТАНОВКА МОДУЛЯ (CREATE TABLE)
|
||||
// =================================================================================
|
||||
$module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comments` (
|
||||
`Id` tinyint(1) unsigned NOT NULL auto_increment,
|
||||
`comment_max_chars` smallint(3) unsigned NOT NULL default '1000',
|
||||
`comment_user_groups` text NOT NULL,
|
||||
`comment_user_groups_read` text NOT NULL, /* <-- НОВОЕ ПОЛЕ ДЛЯ ПРАВ НА ПРОСМОТР */
|
||||
`comment_user_groups_read` text NOT NULL,
|
||||
`comment_need_approve` enum('0','1') NOT NULL default '0',
|
||||
`comment_active` enum('1','0') NOT NULL default '1',
|
||||
`comment_use_antispam` enum('1','0') NOT NULL default '1',
|
||||
`comment_use_page_nav` enum('1','0') NOT NULL default '1',
|
||||
`comment_page_nav_count` varchar(5) NOT NULL,
|
||||
/* НОВЫЕ УНИВЕРСАЛЬНЫЕ ПОЛЯ НАСТРОЕК */
|
||||
`comment_show_f1` tinyint(1) NOT NULL default '1',
|
||||
`comment_req_f1` tinyint(1) NOT NULL default '0',
|
||||
`comment_name_f1` varchar(255) NOT NULL default '',
|
||||
`comment_show_f2` tinyint(1) NOT NULL default '1',
|
||||
`comment_req_f2` tinyint(1) NOT NULL default '0',
|
||||
`comment_name_f2` varchar(255) NOT NULL default '',
|
||||
PRIMARY KEY (`Id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;";
|
||||
|
||||
@@ -42,8 +43,8 @@ $module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comment_info` (
|
||||
`comment_author_name` varchar(255) NOT NULL,
|
||||
`comment_author_id` int(10) unsigned NOT NULL default '0',
|
||||
`comment_author_email` varchar(255) NOT NULL,
|
||||
`comment_author_city` varchar(255) NOT NULL,
|
||||
`comment_author_website` varchar(255) NOT NULL,
|
||||
`comment_author_city` varchar(255) NOT NULL, /* Маппим Field 2 сюда */
|
||||
`comment_author_website` varchar(255) NOT NULL, /* Маппим Field 1 сюда */
|
||||
`comment_author_ip` varchar(15) NOT NULL,
|
||||
`comment_published` int(10) unsigned NOT NULL default '0',
|
||||
`comment_changed` int(10) unsigned NOT NULL default '0',
|
||||
@@ -53,65 +54,36 @@ $module_sql_install[] = "CREATE TABLE `%%PRFX%%_module_comment_info` (
|
||||
PRIMARY KEY (`Id`),
|
||||
KEY `document_id` (`document_id`),
|
||||
KEY `parent_id` (`parent_id`),
|
||||
KEY `comment_status` (`comment_status`)
|
||||
KEY `comment_status` (`comment_status`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;";
|
||||
|
||||
// ИЗМЕНЕННАЯ СТРОКА: Устанавливаем права на просмотр по умолчанию для всех групп: 1, 2, 3, 4
|
||||
$module_sql_install[] = "INSERT INTO `%%PRFX%%_module_comments` VALUES (1, 1000, '1,3', '1,2,3,4', '0', '1', '1' , '0', '');";
|
||||
// ^ max chars, ^ write groups, ^ read groups (ИСПРАВЛЕНО), ^ need_approve ...
|
||||
// Начальные данные (добавлены дефолтные значения для новых полей в конце строки)
|
||||
$module_sql_install[] = "INSERT INTO `%%PRFX%%_module_comments` VALUES (1, 1000, '1,3', '1,2,3,4', '0', '1', '1' , '0', '', 1, 0, '', 1, 0, '');";
|
||||
|
||||
// =================================================================================
|
||||
// 2. ИЗМЕНЕНИЯ ДЛЯ ОБНОВЛЕНИЯ МОДУЛЯ (Добавление нового поля)
|
||||
// 2. ОБНОВЛЕНИЕ МОДУЛЯ (ALTER TABLE)
|
||||
// =================================================================================
|
||||
|
||||
// Обновление версии модуля (оставлено без изменений)
|
||||
$module_sql_update[] = "
|
||||
UPDATE
|
||||
`%%PRFX%%_module`
|
||||
UPDATE `%%PRFX%%_module`
|
||||
SET
|
||||
ModuleAveTag = '" . $modul['ModuleAveTag'] . "',
|
||||
ModulePHPTag = '" . $modul['ModulePHPTag'] . "',
|
||||
ModuleVersion = '" . $modul['ModuleVersion'] . "'
|
||||
WHERE
|
||||
ModuleSysName = '" . $modul['ModuleSysName'] . "'
|
||||
WHERE ModuleSysName = '" . $modul['ModuleSysName'] . "'
|
||||
LIMIT 1;
|
||||
";
|
||||
|
||||
// Добавление нового столбца comment_user_groups_read в существующую таблицу
|
||||
$module_sql_update[] = "
|
||||
ALTER TABLE
|
||||
`%%PRFX%%_module_comments`
|
||||
ADD
|
||||
`comment_user_groups_read` TEXT NOT NULL
|
||||
AFTER
|
||||
`comment_user_groups`;
|
||||
";
|
||||
// Добавление новых столбцов управления полями
|
||||
$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_show_f1` TINYINT(1) NOT NULL DEFAULT '1';";
|
||||
$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_req_f1` TINYINT(1) NOT NULL DEFAULT '0';";
|
||||
$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_name_f1` VARCHAR(255) NOT NULL DEFAULT '';";
|
||||
|
||||
// ИЗМЕНЕННАЯ СТРОКА: Заполнение нового столбца значением по умолчанию для всех групп: 1, 2, 3, 4
|
||||
$module_sql_update[] = "
|
||||
UPDATE
|
||||
`%%PRFX%%_module_comments`
|
||||
SET
|
||||
`comment_user_groups_read` = '1,2,3,4'
|
||||
WHERE
|
||||
`Id` = 1;
|
||||
";
|
||||
$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_show_f2` TINYINT(1) NOT NULL DEFAULT '1';";
|
||||
$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_req_f2` TINYINT(1) NOT NULL DEFAULT '0';";
|
||||
$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_name_f2` VARCHAR(255) NOT NULL DEFAULT '';";
|
||||
|
||||
$module_sql_update[] = "
|
||||
ALTER TABLE
|
||||
`%%PRFX%%_module_comments`
|
||||
ADD
|
||||
`comment_use_page_nav` ENUM('0','1') NOT NULL DEFAULT '1'
|
||||
AFTER
|
||||
`comment_use_antispam`;
|
||||
";
|
||||
$module_sql_update[] = "ALTER TABLE `%%PRFX%%_module_comments` ADD `comment_user_groups_read` TEXT NOT NULL AFTER `comment_user_groups`;";
|
||||
$module_sql_update[] = "UPDATE `%%PRFX%%_module_comments` SET `comment_user_groups_read` = '1,2,3,4' WHERE `Id` = 1;";
|
||||
|
||||
$module_sql_update[] = "
|
||||
ALTER TABLE
|
||||
`%%PRFX%%_module_comments`
|
||||
ADD
|
||||
`comment_page_nav_count` VARCHAR(5) NOT NULL
|
||||
AFTER
|
||||
`comment_use_page_nav`;
|
||||
";
|
||||
?>
|
||||
@@ -6,16 +6,15 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="breadCrumbHolder module">
|
||||
<div class="breadCrumb module">
|
||||
<ul>
|
||||
<li class="firstB"><a href="index.php" title="{#MAIN_PAGE#}">{#MAIN_PAGE#}</a></li>
|
||||
<li><a href="index.php?do=modules&cp={$sess}">{#MODULES_SUB_TITLE#}</a></li>
|
||||
<li><a href="index.php?do=modules&action=modedit&mod=comment&moduleaction=1&cp={$sess}">{#COMMENT_MODULE_NAME#}</a></li>
|
||||
<li><strong class="code">{#COMMENT_MODULE_SETTINGS#}</strong></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="breadCrumb module">
|
||||
<ul>
|
||||
<li class="firstB"><a href="index.php" title="{#MAIN_PAGE#}">{#MAIN_PAGE#}</a></li>
|
||||
<li><a href="index.php?do=modules&cp={$sess}">{#MODULES_SUB_TITLE#}</a></li>
|
||||
<li><a href="index.php?do=modules&action=modedit&mod=comment&moduleaction=1&cp={$sess}">{#COMMENT_MODULE_NAME#}</a></li>
|
||||
<li><strong class="code">{#COMMENT_MODULE_SETTINGS#}</strong></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="widget first">
|
||||
@@ -25,81 +24,99 @@
|
||||
</div>
|
||||
|
||||
<form action="index.php?do=modules&action=modedit&mod=comment&moduleaction=settings&cp={$sess}&sub=save" method="post" class="mainForm">
|
||||
<table cellpadding="0" cellspacing="0" width="100%" class="tableStatic">
|
||||
<tr class="noborder">
|
||||
<td width="240">{#COMMENT_ENABLE_COMMENT#}</td>
|
||||
<td><input name="comment_active" type="checkbox" value="1" {if $comment_active=='1'}checked{/if} /></td>
|
||||
</tr>
|
||||
<table cellpadding="0" cellspacing="0" width="100%" class="tableStatic">
|
||||
<thead>
|
||||
<tr>
|
||||
<td width="20%">{#COMMENT_HEADER_NAME#}</td>
|
||||
<td width="30%">{#COMMENT_HEADER_PARAMETR#}</td>
|
||||
<td width="20%">{#COMMENT_HEADER_NAME#}</td>
|
||||
<td width="30%">{#COMMENT_HEADER_PARAMETR#}</td>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr class="noborder">
|
||||
<td>{#COMMENT_ENABLE_COMMENT#}</td>
|
||||
<td><input name="comment_active" type="checkbox" value="1" {if $comment_active=='1'}checked{/if} /></td>
|
||||
<td>{#COMMENT_CHECK_ADMIN#}</td>
|
||||
<td><input name="comment_need_approve" type="checkbox" value="1" {if $comment_need_approve=='1'}checked{/if} /></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td width="240">{#COMMENT_CHECK_ADMIN#}</td>
|
||||
<td>
|
||||
<input name="comment_need_approve" type="checkbox" value="1" {if $comment_need_approve=='1'}checked{/if} />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{#COMMENT_SPAMPROTECT#}</td>
|
||||
<td><input name="comment_use_antispam" type="checkbox" value="1" {if $comment_use_antispam=='1'}checked{/if} /></td>
|
||||
<td>{#COMMENT_USE_PAGE_NAV#}</td>
|
||||
<td><input name="comment_use_page_nav" type="checkbox" value="1" {if $comment_use_page_nav=='1'}checked{/if} /></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td width="240">{#COMMENT_SPAMPROTECT#}</td>
|
||||
<td>
|
||||
<input name="comment_use_antispam" type="checkbox" value="1" {if $comment_use_antispam=='1'}checked{/if} />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{#COMMENT_PAGE_NAV_COUNT#}</td>
|
||||
<td><input name="comment_page_nav_count" type="text" value="{$comment_page_nav_count}" size="4" style="width: 50px;" /></td>
|
||||
<td>{#COMMENT_MAX_CHARS#}</td>
|
||||
<td><input name="comment_max_chars" type="text" id="comment_max_chars" value="{$comment_max_chars}" size="5" maxlength="5" style="width: 50px;" /></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td width="240">{#COMMENT_USE_PAGE_NAV#}</td>
|
||||
<td>
|
||||
<input name="comment_use_page_nav" type="checkbox" value="1" {if $comment_use_page_nav=='1'}checked{/if} />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td width="240">{#COMMENT_PAGE_NAV_COUNT#}</td>
|
||||
<td>
|
||||
<input name="comment_page_nav_count" type="text" value="{$comment_page_nav_count}" size="4" style="width: 50px;" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td width="240">{#COMMENT_FOR_GROUPS#}</td>
|
||||
<td>
|
||||
<select name="comment_user_groups[]" multiple="multiple" size="5" style="width:300px">
|
||||
{foreach from=$groups item=g}
|
||||
{assign var='sel' value=''}
|
||||
{if $g->user_group}
|
||||
{if (in_array($g->user_group,$comment_user_groups)) }
|
||||
{assign var='sel' value='selected'}
|
||||
{/if}
|
||||
{/if}
|
||||
<option value="{$g->user_group}" {$sel}>{$g->user_group_name|escape}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td width="240">{#COMMENT_FOR_GROUPS_READ#}</td>
|
||||
<td>
|
||||
<select name="comment_user_groups_read[]" multiple="multiple" size="5" style="width:300px">
|
||||
{foreach from=$groups item=g}
|
||||
{assign var='sel_read' value=''}
|
||||
{if $g->user_group}
|
||||
{if (in_array($g->user_group,$comment_user_groups_read)) }
|
||||
{assign var='sel_read' value='selected'}
|
||||
{/if}
|
||||
{/if}
|
||||
<option value="{$g->user_group}" {$sel_read}>{$g->user_group_name|escape}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="240">{#COMMENT_MAX_CHARS#}</td>
|
||||
<td><input name="comment_max_chars" type="text" id="comment_max_chars" value="{$comment_max_chars}" size="5" maxlength="5" style="width: 50px;" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"><input type="submit" value="{#COMMENT_BUTTON_SAVE#}" class="basicBtn" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<tr>
|
||||
<td style="vertical-align: top; padding-top: 15px;">{#COMMENT_FOR_GROUPS#}</td>
|
||||
<td style="vertical-align: top; padding-top: 10px;">
|
||||
<select name="comment_user_groups[]" multiple="multiple" size="6" style="width:90%">
|
||||
{foreach from=$groups item=g}
|
||||
{assign var='sel' value=''}
|
||||
{if $g->user_group}
|
||||
{if (in_array($g->user_group,$comment_user_groups)) }
|
||||
{assign var='sel' value='selected'}
|
||||
{/if}
|
||||
{/if}
|
||||
<option value="{$g->user_group}" {$sel}>{$g->user_group_name|escape}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</td>
|
||||
<td style="vertical-align: top; padding-top: 15px;">{#COMMENT_FOR_GROUPS_READ#}</td>
|
||||
<td style="vertical-align: top; padding-top: 10px;">
|
||||
<select name="comment_user_groups_read[]" multiple="multiple" size="6" style="width:90%">
|
||||
{foreach from=$groups item=g}
|
||||
{assign var='sel_read' value=''}
|
||||
{if $g->user_group}
|
||||
{if (in_array($g->user_group,$comment_user_groups_read)) }
|
||||
{assign var='sel_read' value='selected'}
|
||||
{/if}
|
||||
{/if}
|
||||
<option value="{$g->user_group}" {$sel_read}>{$g->user_group_name|escape}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="2" style="background: #f9f9f9; font-weight: bold; text-align: center; border-right: 1px solid #ddd;">Дополнительное поле №1</td>
|
||||
<td colspan="2" style="background: #f9f9f9; font-weight: bold; text-align: center;">Дополнительное поле №2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Заголовок поля 1:</td>
|
||||
<td style="border-right: 1px solid #ddd;">
|
||||
<input name="comment_name_f1" type="text" value="{$comment_name_f1|escape}" style="width: 90%;" placeholder="Напр: Веб-сайт" />
|
||||
<div style="margin-top: 5px;">
|
||||
<label><input name="comment_show_f1" type="checkbox" value="1" {if $comment_show_f1=='1'}checked{/if} /> Показывать</label>
|
||||
|
||||
<label><input name="comment_req_f1" type="checkbox" value="1" {if $comment_req_f1=='1'}checked{/if} /> Обязательное</label>
|
||||
</div>
|
||||
</td>
|
||||
<td>Заголовок поля 2:</td>
|
||||
<td>
|
||||
<input name="comment_name_f2" type="text" value="{$comment_name_f2|escape}" style="width: 90%;" placeholder="Напр: Город" />
|
||||
<div style="margin-top: 5px;">
|
||||
<label><input name="comment_show_f2" type="checkbox" value="1" {if $comment_show_f2=='1'}checked{/if} /> Показывать</label>
|
||||
|
||||
<label><input name="comment_req_f2" type="checkbox" value="1" {if $comment_req_f2=='1'}checked{/if} /> Обязательное</label>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4" class="submitArea">
|
||||
<input type="submit" value="{#COMMENT_BUTTON_SAVE#}" class="basicBtn" style="float: left; margin: 10px;" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
@@ -99,17 +99,27 @@
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{* Сайт и Город *}
|
||||
{* ДИНАМИЧЕСКИЕ ПОЛЯ (Field 1 и Field 2) *}
|
||||
<div class="row mb-3">
|
||||
{* Поле №1 *}
|
||||
{if $comment_show_f1 == 1}
|
||||
<div class="col-md-6 mb-3 mb-md-0">
|
||||
<label for="in_author_website" class="form-label">{#COMMENT_YOUR_SITE#} (необязательно)</label>
|
||||
<input name="comment_author_website" type="text" id="in_author_website" class="form-control" placeholder="{#COMMENT_YOUR_SITE#}" value="{$smarty.request.comment_author_website|default:''|escape|stripslashes}" />
|
||||
<label for="in_author_website" class="form-label">
|
||||
{$comment_name_f1|default:#COMMENT_YOUR_SITE#} {if $comment_req_f1 == 1}*{else}(необязательно){/if}
|
||||
</label>
|
||||
<input name="comment_author_website" type="text" id="in_author_website" class="form-control" placeholder="{$comment_name_f1|default:#COMMENT_YOUR_SITE#}" value="{$smarty.request.comment_author_website|default:''|escape|stripslashes}" />
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{* Поле №2 *}
|
||||
{if $comment_show_f2 == 1}
|
||||
<div class="col-md-6">
|
||||
<label for="in_author_city" class="form-label">{#COMMENT_YOUR_FROM#} (необязательно)</label>
|
||||
<input name="comment_author_city" type="text" id="in_author_city" class="form-control" placeholder="{#COMMENT_YOUR_FROM#}" value="{$smarty.request.comment_author_city|default:''|escape|stripslashes}" />
|
||||
<label for="in_author_city" class="form-label">
|
||||
{$comment_name_f2|default:#COMMENT_YOUR_FROM#} {if $comment_req_f2 == 1}*{else}(необязательно){/if}
|
||||
</label>
|
||||
<input name="comment_author_city" type="text" id="in_author_city" class="form-control" placeholder="{$comment_name_f2|default:#COMMENT_YOUR_FROM#}" value="{$smarty.request.comment_author_city|default:''|escape|stripslashes}" />
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
{* Текст комментария *}
|
||||
@@ -169,10 +179,7 @@
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
||||
{* ===================================================================== *}
|
||||
{* НОВОЕ: МОДАЛЬНОЕ ОКНО ПОДТВЕРЖДЕНИЯ УДАЛЕНИЯ КОММЕНТАРИЯ (Bootstrap 5) *}
|
||||
{* ===================================================================== *}
|
||||
{* Модальное окно удаления ... *}
|
||||
<div class="modal fade" id="deleteCommentModal" tabindex="-1" aria-labelledby="deleteCommentModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
@@ -192,9 +199,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{* ===================================================================== *}
|
||||
{* ПЕРЕМЕННЫЕ JAVASCRIPT И ПОДКЛЮЧЕНИЕ ФАЙЛА *}
|
||||
{* ===================================================================== *}
|
||||
{* ПЕРЕМЕННЫЕ JAVASCRIPT *}
|
||||
<script type="text/javascript">
|
||||
var COMMENT_SITE_CLOSE = '{#COMMENT_SITE_CLOSE#}';
|
||||
var COMMENT_SITE_OPEN = '{#COMMENT_SITE_OPEN#}';
|
||||
@@ -212,6 +217,13 @@
|
||||
var COMMENT_DATE_TIME_FORMAT = '{#COMMENT_DATE_TIME_FORMAT#}';
|
||||
var COMMENT_TEXT_CHANGED = '{#COMMENT_TEXT_CHANGED#}';
|
||||
var COMMENT_WRONG_CODE = '{#COMMENT_WRONG_CODE#}';
|
||||
|
||||
// Передаем настройки обязательности в JS
|
||||
var REQ_F1 = '{$comment_req_f1}';
|
||||
var REQ_F2 = '{$comment_req_f2}';
|
||||
var NAME_F1 = '{$comment_name_f1|default:#COMMENT_YOUR_SITE#}';
|
||||
var NAME_F2 = '{$comment_name_f2|default:#COMMENT_YOUR_FROM#}';
|
||||
|
||||
var UGROUP = '{$smarty.const.UGROUP}';
|
||||
var IS_IM = '{$im}';
|
||||
var DOC_ID = '{$doc_id}';
|
||||
@@ -220,6 +232,5 @@
|
||||
</script>
|
||||
<script src="{$ABS_PATH}modules/comment/js/comment.js" type="text/javascript"></script>
|
||||
|
||||
{/if} {* <-- Закрывает if $no_read_permission *}
|
||||
|
||||
{/if}
|
||||
{/if}
|
||||
@@ -1,18 +1,13 @@
|
||||
{foreach from=$subcomments item=c}
|
||||
|
||||
{* Контейнер комментария: Используем .card для блока, и ms-4 для вложенности *}
|
||||
<div class="card mb-3 mod_comment_comment{if $c.parent_id} ms-4{/if}">
|
||||
|
||||
{* Подсветка (Highlight) *}
|
||||
{if isset($smarty.request.subaction) && $smarty.request.subaction=='showonly' && isset($smarty.request.comment_id) && $smarty.request.comment_id==$c.Id}
|
||||
<div class="border border-warning border-3 rounded p-0">
|
||||
{/if}
|
||||
|
||||
<div id="{$c.Id}" class="mod_comment_box">
|
||||
|
||||
{* ===================================================================== *}
|
||||
{* ТЕЛО КОММЕНТАРИЯ (Включает Аватар, Автор, Метаданные и Текст) *}
|
||||
{* ===================================================================== *}
|
||||
<div class="card-body p-3 d-flex align-items-start">
|
||||
|
||||
{* ----- БЛОК АВАТАРА ----- *}
|
||||
@@ -24,24 +19,31 @@
|
||||
<div class="mod_comment_avatar flex-shrink-0 me-3">
|
||||
<img src="{$avatar_url}" alt="Аватар пользователя {$c.comment_author_name|stripslashes|escape}" class="rounded-circle" style="width: 48px; height: 48px;" loading="lazy" />
|
||||
</div>
|
||||
{* -------------------------- *}
|
||||
|
||||
<div class="flex-grow-1">
|
||||
{* Информация об авторе и дате *}
|
||||
<div class="mod_comment_meta mb-2 text-muted small">
|
||||
|
||||
{* Автор - ИКОНКА ОБНОВЛЕНА *}
|
||||
<i class="bi bi-person me-1"></i> {#COMMENT_USER_ADD#} <a title="{#COMMENT_INFO#}" href="javascript:void(0);" onclick="popup('{$ABS_PATH}index.php?module=comment&action=postinfo&pop=1&Id={$c.Id}&theme={$theme}','comment','500','300','1');" class="fw-bold link-dark">{$c.comment_author_name|stripslashes|escape}</a>
|
||||
|
||||
{* Дата публикации - ИКОНКА ОБНОВЛЕНА *}
|
||||
<span class="ms-2"><i class="bi bi-clock me-1"></i> {$c.comment_published}</span>
|
||||
|
||||
{* НОВОЕ: Динамические поля в мета-данных комментария *}
|
||||
{if $comment_show_f1 == 1 && $c.comment_author_website}
|
||||
<span class="ms-2 d-inline-block">
|
||||
<i class="bi bi-link-45deg"></i> <strong>{$comment_name_f1|default:#COMMENT_YOUR_SITE#}:</strong> {$c.comment_author_website|stripslashes|escape}
|
||||
</span>
|
||||
{/if}
|
||||
{if $comment_show_f2 == 1 && $c.comment_author_city}
|
||||
<span class="ms-2 d-inline-block">
|
||||
<i class="bi bi-geo-alt"></i> <strong>{$comment_name_f2|default:#COMMENT_YOUR_FROM#}:</strong> {$c.comment_author_city|stripslashes|escape}
|
||||
</span>
|
||||
{/if}
|
||||
|
||||
{* IP-адрес (для Админа) *}
|
||||
{if $smarty.const.UGROUP==1}
|
||||
<span class="ms-2 text-secondary">• IP:{$c.comment_author_ip}</span>
|
||||
{/if}
|
||||
|
||||
{* Метка "Изменено" *}
|
||||
<span class="mod_comment_changed">{if isset($c.comment_changed) && $c.comment_changed > 1} (<span class="text-secondary">{#COMMENT_TEXT_CHANGED#} {$c.comment_changed}</span>){/if}</span>
|
||||
</div>
|
||||
|
||||
@@ -51,21 +53,15 @@
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{* --------------------------------------------------------------------- *}
|
||||
|
||||
{* ===================================================================== *}
|
||||
{* ПАНЕЛЬ ДЕЙСТВИЙ (card-footer) *}
|
||||
{* ===================================================================== *}
|
||||
<div class="card-footer mod_comment_actions d-flex justify-content-end align-items-center bg-white border-top p-2">
|
||||
|
||||
{* Ссылка "Ответить" - ИКОНКА ОБНОВЛЕНА *}
|
||||
{if $c.comment_author_id!=$smarty.session.user_id|default:'*' && (($cancomment==1 && $closed!=1) || $smarty.const.UGROUP==1)}
|
||||
<a class="mod_comment_answer p-2 text-primary" href="javascript:void(0);" rel="{$c.Id}" title="{#COMMENT_ANSWER_LINK#}">
|
||||
<i class="bi bi-reply-fill me-1"></i> {#COMMENT_ANSWER_LINK#}
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
{* ИКОНКА РЕДАКТИРОВАНИЯ - ИКОНКА ОБНОВЛЕНА *}
|
||||
{if $smarty.const.UGROUP==1 || $c.comment_author_id==$smarty.session.user_id|default:'*'}
|
||||
<a class="mod_comment_edit p-2 text-secondary" href="javascript:void(0);" title="{#COMMENT_EDIT_LINK#}">
|
||||
<i class="bi bi-pencil-square me-1"></i> Редактировать
|
||||
@@ -73,7 +69,6 @@
|
||||
{/if}
|
||||
|
||||
{if $smarty.const.UGROUP==1}
|
||||
{* Замок (Разблокировать/Заблокировать) - ИКОНКИ ОБНОВЛЕНЫ *}
|
||||
{if $c.comment_status!=1}
|
||||
<a class="mod_comment_unlock p-2 text-success" href="javascript:void(0);" title="{#COMMENT_UNLOCK_LINK#}">
|
||||
<i class="bi bi-unlock-fill me-1"></i>
|
||||
@@ -84,30 +79,25 @@
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
{* Корзина (Удалить) - ИКОНКА ОБНОВЛЕНА *}
|
||||
<a class="mod_comment_delete p-2 text-danger" href="javascript:void(0);" title="{#COMMENT_DELETE_LINK#}">
|
||||
<i class="bi bi-trash me-1"></i>
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
</div>
|
||||
{* --------------------------------------------------------------------- *}
|
||||
</div>
|
||||
|
||||
{* Закрываем подсветку *}
|
||||
{if isset($smarty.request.subaction) && $smarty.request.subaction=='showonly' && isset($smarty.request.comment_id) && $smarty.request.comment_id==$c.Id}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{* Точка вставки формы ответа *}
|
||||
<span id="end{$c.Id}"></span>
|
||||
|
||||
{* Рекурсивный вызов дочерних комментариев *}
|
||||
{if isset($comments) && isset($comments[$c.Id])}
|
||||
<div class="mt-3">
|
||||
{include file="$subtpl" subcomments=$comments[$c.Id] sub=1}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
</div> {* Закрывает mod_comment_comment *}
|
||||
</div>
|
||||
{/foreach}
|
||||
Reference in New Issue
Block a user