добавлена проверка на смену имен Анонимом - если сменит имя пока жива кука получит плашку с подставновкой всех предыдущих имен

This commit is contained in:
2026-01-01 14:51:24 +05:00
parent f4c9a5f363
commit c7627d699d
4 changed files with 127 additions and 34 deletions

View File

@@ -138,6 +138,34 @@ function __construct()
}
}
/**
* Получение всех уникальных имен, использованных анонимом
* * @param string $anon_key уникальный ключ
* @param string $exclude_name исключить это имя из результата (текущее)
* @return array
*/
private function _getAnonNamesHistory($anon_key, $exclude_name = '')
{
global $AVE_DB;
$names = [];
$exclude_sql = !empty($exclude_name) ? " AND comment_author_name != '" . addslashes($exclude_name) . "'" : "";
$sql = $AVE_DB->Query("
SELECT DISTINCT comment_author_name
FROM " . PREFIX . "_module_comment_info
WHERE anon_key = '" . addslashes($anon_key) . "'
" . $exclude_sql . "
ORDER BY Id DESC
");
while ($row = $sql->FetchAssocArray()) {
$names[] = stripslashes($row['comment_author_name']);
}
return $names;
}
function _commentSettingsGet($param = '')
{
global $AVE_DB;
@@ -239,6 +267,9 @@ function commentListShow($tpl_dir)
$read_groups = explode(',', $settings['comment_user_groups_read']);
$assign['no_read_permission'] = 0;
// Чтобы Smarty не ругался, создаем пустую заглушку
$assign['saved_anon'] = ['name' => '', 'email' => '', 'exists' => false];
if (!in_array($user_group, $read_groups))
{
$assign['no_read_permission'] = 1;
@@ -323,6 +354,18 @@ if ($settings['comment_use_page_nav'] == 1)
while ($row = $sql->FetchAssocArray())
{
// --- ВОТ ЭТОТ БЛОК ---
if ($assign['saved_anon']['exists'] == false && !empty($row['anon_key']) && $row['anon_key'] == $anon_key) {
$assign['saved_anon'] = [
'name' => stripslashes($row['comment_author_name']),
'email' => stripslashes($row['comment_author_email']),
'exists' => true
];
}
// --- КОНЕЦ БЛОКА ---
// 1. Получаем аватар через стандартную функцию системы
if (isset($row['comment_author_id']) && $row['comment_author_id'] > 0)
{
@@ -377,6 +420,13 @@ if ($settings['comment_use_page_nav'] == 1)
$row['is_my_own'] = $is_author;
// -------------------------------------------------------
// --- НОВОЕ: Получаем историю имен для анонима ---
$row['past_names'] = [];
if (!empty($row['anon_key'])) {
$row['past_names'] = $this->_getAnonNamesHistory($row['anon_key'], $row['comment_author_name']);
}
// --- КОНЕЦ НОВОГО ---
$row['comment_published_raw'] = $row['comment_published'];
$row['comment_published'] = ave_date_format($date_time_format, $row['comment_published']);
$row['comment_changed'] = ave_date_format($date_time_format, $row['comment_changed']);
@@ -410,31 +460,47 @@ if ($settings['comment_use_page_nav'] == 1)
*
* @param string $tpl_dir - путь к шаблонам модуля
*/
function commentPostFormShow($tpl_dir)
{
global $AVE_DB, $AVE_Template;
function commentPostFormShow($tpl_dir)
{
global $AVE_DB, $AVE_Template;
// Используем оператор объединения с null для PHP 8.4
$docid = (int)($_REQUEST['docid'] ?? 0);
$user_group = UGROUP ?? 0;
// Получаем список комментариев на которые запрещены ответы
$geschlossen = $AVE_DB->Query("
SELECT comments_close
FROM " . PREFIX . "_module_comment_info
WHERE document_id = '" . $docid . "'
LIMIT 1
")->GetCell();
$docid = (int)($_REQUEST['docid'] ?? 0);
$user_group = UGROUP ?? 0;
// --- НОВОЕ: Автоподстановка для анонима ---
$anon_data = ['name' => '', 'email' => '', 'exists' => false];
if ($user_group == 2) { // Если гость
$anon_key = $this->_getAnonKey();
$last_post = $AVE_DB->Query("
SELECT comment_author_name, comment_author_email
FROM " . PREFIX . "_module_comment_info
WHERE anon_key = '" . $anon_key . "'
ORDER BY Id DESC LIMIT 1
")->FetchAssocArray();
if ($last_post) {
$anon_data['name'] = stripslashes($last_post['comment_author_name']);
$anon_data['email'] = stripslashes($last_post['comment_author_email']);
$anon_data['exists'] = true;
}
}
$AVE_Template->assign('saved_anon', $anon_data);
// --- КОНЕЦ НОВОГО ---
// Формируем ряд переменных для использования в шаблоне
$AVE_Template->assign('closed', $geschlossen);
$AVE_Template->assign('cancomment', ($this->_commentSettingsGet('comment_active') == 1 && in_array($user_group, explode(',', $this->_commentSettingsGet('comment_user_groups')))));
$AVE_Template->assign('comment_max_chars', $this->_commentSettingsGet('comment_max_chars'));
$AVE_Template->assign('theme', defined('THEME_FOLDER') ? THEME_FOLDER : DEFAULT_THEME_FOLDER);
$geschlossen = $AVE_DB->Query("
SELECT comments_close
FROM " . PREFIX . "_module_comment_info
WHERE document_id = '" . $docid . "'
LIMIT 1
")->GetCell();
// Отображаем форму для добавления комментария
$AVE_Template->display($tpl_dir . $this->_comment_form_tpl);
}
$AVE_Template->assign('closed', $geschlossen);
$AVE_Template->assign('cancomment', ($this->_commentSettingsGet('comment_active') == 1 && in_array($user_group, explode(',', $this->_commentSettingsGet('comment_user_groups')))));
$AVE_Template->assign('comment_max_chars', $this->_commentSettingsGet('comment_max_chars'));
$AVE_Template->assign('theme', defined('THEME_FOLDER') ? THEME_FOLDER : DEFAULT_THEME_FOLDER);
$AVE_Template->display($tpl_dir . $this->_comment_form_tpl);
}
/**
* Метод, предназначенный для записи в БД нового комментария.

View File

@@ -235,6 +235,12 @@ if (action === 'unlock' || action === 'lock') {
$(this).next('.invalid-feedback').fadeOut(200, function() { $(this).remove(); });
});
// Инициализация тултипов для всех элементов с data-bs-toggle="tooltip"
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl)
})
// Счетчик: Количество оставшихся символов 1000 для формы создания комментария
$('#in_message').limit(1000, '#charsLeft_new');

View File

@@ -77,18 +77,29 @@
</div>
<input name="comment_author_name" type="hidden" id="in_author_name" value="{$smarty.session.user_name|default:''|escape|stripslashes}" />
<input name="comment_author_email" type="hidden" id="in_author_email" value="{$smarty.session.user_email|default:''|escape|stripslashes}" />
{else}
<div class="row mb-3">
<div class="col-md-6 mb-3 mb-md-0">
<label for="in_author_name" class="form-label">{#COMMENT_YOUR_NAME#}*</label>
<input name="comment_author_name" type="text" id="in_author_name" class="form-control" placeholder="{#COMMENT_YOUR_NAME#}" value="{$smarty.request.comment_author_name|default:''|escape|stripslashes}" />
</div>
<div class="col-md-6">
<label for="in_author_email" class="form-label">{#COMMENT_YOUR_EMAIL#}*</label>
<input name="comment_author_email" type="email" id="in_author_email" class="form-control" placeholder="{#COMMENT_YOUR_EMAIL#}" value="{$smarty.request.comment_author_email|default:''|escape|stripslashes}" />
</div>
</div>
{/if}
{else}
{* Блок для Анонимных пользователей (Гостей) *}
<div class="row mb-3">
<div class="col-md-6 mb-3 mb-md-0">
<label for="in_author_name" class="form-label">{#COMMENT_YOUR_NAME#}*</label>
<input name="comment_author_name" type="text" id="in_author_name" class="form-control"
placeholder="{#COMMENT_YOUR_NAME#}"
value="{(isset($saved_anon.name)) ? $saved_anon.name : ($smarty.request.comment_author_name|default:''|escape|stripslashes)}"
{if isset($saved_anon.exists) && $saved_anon.exists}readonly style="background-color: #f8f9fa;"{/if} />
{if isset($saved_anon.exists) && $saved_anon.exists}
<div class="form-text small text-muted">Имя зафиксировано по вашему ключу доступа.</div>
{/if}
</div>
<div class="col-md-6">
<label for="in_author_email" class="form-label">{#COMMENT_YOUR_EMAIL#}*</label>
<input name="comment_author_email" type="email" id="in_author_email" class="form-control"
placeholder="{#COMMENT_YOUR_EMAIL#}"
value="{(isset($saved_anon.email)) ? $saved_anon.email : ($smarty.request.comment_author_email|default:''|escape|stripslashes)}"
{if isset($saved_anon.exists) && $saved_anon.exists}readonly style="background-color: #f8f9fa;"{/if} />
</div>
</div>
{/if}
<div class="row mb-3">
{if $comment_show_f1 == 1}

View File

@@ -29,6 +29,16 @@
<span class="d-flex align-items-center">
<i class="bi bi-person me-1"></i>
<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 text-decoration-none">{$c.comment_author_name|stripslashes|escape}</a>
{* ПРОВЕРКА ИСТОРИИ ИМЕН АНОНИМА *}
{if !empty($c.past_names)}
<span class="badge rounded-pill bg-light text-danger border border-danger ms-1"
style="font-size: 0.65rem; cursor: help;"
data-bs-toggle="tooltip"
data-bs-html="true"
title="Ранее этот гость использовал имена:<br/>{foreach $c.past_names as $pname}{$pname|escape}<br/>{/foreach}">
<i class="bi bi-exclamation-triangle-fill"></i> менял имя
</span>
{/if}
</span>
<span class="d-flex align-items-center"><i class="bi bi-clock me-1"></i> {$c.comment_published}</span>