++++++ проверки с файлами в режиме редактирования

This commit is contained in:
2026-01-08 20:43:07 +05:00
parent ce24d60b05
commit 8c75b0f9f6
3 changed files with 103 additions and 21 deletions

View File

@@ -744,7 +744,9 @@ function commentPostEdit($comment_id)
cmnt.comment_edit_time,
cmnt.comment_allowed_extensions,
cmnt.comment_max_file_size,
cmnt.comment_max_files
cmnt.comment_max_files,
cmnt.comment_allow_files,
cmnt.comment_allow_files_anon
FROM " . PREFIX . "_module_comment_info AS msg
JOIN " . PREFIX . "_module_comments AS cmnt ON cmnt.Id = 1
WHERE msg.Id = '" . $comment_id . "'
@@ -787,6 +789,26 @@ function commentPostEdit($comment_id)
// 5. Работа с изображениями (МУЛЬТИЗАГРУЗКА И УДАЛЕНИЕ)
// ПРОВЕРКА ПРАВ НА ЗАГРУЗКУ (Защита от взлома через POST)
$allow_files = (int)($row['comment_allow_files'] ?? 0);
$allow_anon = (int)($row['comment_allow_files_anon'] ?? 0);
// Определяем, имеет ли право текущий пользователь загружать файлы
$can_upload = false;
if ($allow_files === 1) {
if ($user_group == 2) { // Если гость
if ($allow_anon === 1) $can_upload = true;
} else { // Если зарегистрирован
$can_upload = true;
}
}
// Если файлы пытаются загрузить, но прав нет — просто очищаем массив файлов
if (!$can_upload && isset($_FILES['comment_image'])) {
unset($_FILES['comment_image']);
}
$upload_dir = BASE_DIR . '/uploads/comments/';
// Получаем текущие файлы из БД в массив
$current_files = !empty($row['comment_file']) ? explode(',', $row['comment_file']) : [];

View File

@@ -586,19 +586,43 @@ if ($foundItems.length > 0) {
}
// --- СБОРКА ФОРМЫ ---
// --- ПРОВЕРКА ПРАВ НА ЗАГРУЗКУ ---
var canUploadFiles = false;
if (typeof ALLOW_FILES !== 'undefined' && ALLOW_FILES == '1') {
if (typeof UGROUP !== 'undefined' && UGROUP == '2') {
if (typeof ALLOW_FILES_ANON !== 'undefined' && ALLOW_FILES_ANON == '1') canUploadFiles = true;
} else {
canUploadFiles = true;
}
}
var uploadBlockHtml = '';
if (canUploadFiles) {
uploadBlockHtml = `
<div class="mb-2 border-top pt-2">
<label class="small text-muted mb-1 d-block fw-bold">${COMMENT_JS_ADD_NEW_FILES}</label>
<div id="file_error_${cid}" class="js-file-error text-danger small fw-bold mb-1" style="display:none;"></div>
<input type="file" name="comment_image[]" id="new_file_${cid}" class="form-control form-control-sm mb-1" multiple>
<div class="text-muted" style="font-size: 0.7rem;">
<i class="bi bi-info-circle"></i> ${ALLOWED_EXTENSIONS.replace(/,/g, ', ')} | до ${MAX_FILE_SIZE_KB} KB
</div>
</div>`;
}
var editHtml = `
<div class="edit-form-container border rounded p-3 bg-light mt-2 mb-2" data-cid="${cid}">
<textarea rows="5" id="ta_${cid}" class="form-control mb-3">${cleanText}</textarea>
${starsEditBlock}
<p class="small text-muted mb-1">${COMMENT_JS_LOADED_FILES}</p>
${existingImagesHtml}
${existingImagesHtml !== '' ? `
<p class="small text-muted mb-1">${COMMENT_JS_LOADED_FILES}</p>
${existingImagesHtml}
` : ''}
${uploadBlockHtml}
<div class="mb-2">
<label class="small text-muted mb-1">${COMMENT_JS_ADD_NEW_FILES}</label>
<div id="file_error_${cid}" class="js-file-error text-danger small fw-bold mb-1" style="display:none;"></div>
<input type="file" name="comment_image[]" id="new_file_${cid}" class="form-control form-control-sm" multiple>
</div>
<input type="hidden" name="delete_files" id="delete_files_${cid}" value="">
<div class="d-flex gap-2 mt-3 align-items-center">
@@ -624,6 +648,9 @@ $wrapper.find('.mod_comment_attached_images, .comment-files').hide();
$wrapper.find('.edit-form-container').data('pendingFiles', pendingFiles);
// Проверяем права, прежде чем вешать обработчик
if (canUploadFiles) {
$('#new_file_' + cid).on('change', function() {
var files = this.files;
var $input = $(this);
@@ -678,6 +705,8 @@ $('#new_file_' + cid).on('change', function() {
});
}
});
}
// Обработчик удаления НОВОГО файла из превью (до сохранения)
$doc.off('click', '.remove-new-file').on('click', '.remove-new-file', function() {
@@ -789,12 +818,24 @@ $doc.on('click', '.cancelButton', function() {
$container.remove();
});
$doc.on('click', '.saveButton', function() {
// Кнопка сохранить редактирование
$doc.off('click', '.saveButton').on('click', '.saveButton', function() {
var $btn = $(this);
var cid = $btn.data('id');
var $container = $btn.closest('.edit-form-container');
// Достаем накопительный массив файлов
// 1. Повторно определяем права внутри кнопки (чтобы избежать undefined)
var canUploadFilesLocal = false;
if (typeof ALLOW_FILES !== 'undefined' && ALLOW_FILES == '1') {
if (typeof UGROUP !== 'undefined' && UGROUP == '2') {
if (typeof ALLOW_FILES_ANON !== 'undefined' && ALLOW_FILES_ANON == '1') canUploadFilesLocal = true;
} else {
canUploadFilesLocal = true;
}
}
// 2. Достаем накопительный массив файлов
var pendingFiles = $container.data('pendingFiles') || [];
var fd = new FormData();
@@ -808,13 +849,14 @@ $doc.on('click', '.saveButton', function() {
fd.append('delete_files', $('#delete_files_' + cid).val());
// --- берем файлы из массива ---
pendingFiles.forEach(function(file) {
if (file !== null) { // Проверяем, что файл не был удален крестиком
fd.append('comment_image[]', file);
}
});
// ------------------------------------
// 3. Добавляем файлы из массива (используем локальную проверку прав)
if (canUploadFilesLocal && pendingFiles.length > 0) {
pendingFiles.forEach(function(file) {
if (file !== null) {
fd.append('comment_image[]', file);
}
});
}
$.ajax({
url: aveabspath + 'index.php?ajax=1',
@@ -827,14 +869,31 @@ $doc.on('click', '.saveButton', function() {
xhr.upload.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
var pct = Math.round((evt.loaded / evt.total) * 100);
$('#edit_progress_container_' + cid).removeClass('d-none');
$('#edit_progress_bar_' + cid).css('width', pct + '%');
// Проверяем наличие контейнера прогресса, если его нет в HTML — создаем или пропускаем
var $pBar = $('#edit_progress_bar_' + cid);
if ($pBar.length) {
$('#edit_progress_container_' + cid).removeClass('d-none');
$pBar.css('width', pct + '%');
}
}
}, false);
return xhr;
},
beforeSend: function() { $btn.prop('disabled', true).text('...'); },
success: function() { location.reload(); }
beforeSend: function() {
$btn.prop('disabled', true).text('...');
},
success: function(response) {
// Если PHP вернул ошибку лимита, выведем её вместо перезагрузки
if (response === 'MAX_FILES_LIMIT_EXCEEDED') {
alert('Превышен лимит количества файлов!');
$btn.prop('disabled', false).text('Сохранить');
} else {
location.reload();
}
},
error: function() {
$btn.prop('disabled', false).text('Ошибка');
}
});
});

View File

@@ -320,6 +320,7 @@
var ALLOWED_EXTENSIONS = '{$comment_allowed_extensions|default:"jpg,jpeg,png,gif,webp"}';
var MAX_FILE_SIZE_KB = '{$comment_max_file_size|default:2048}';
var MAX_FILES_COUNT = '{$comment_max_files|default:5}';
var ALLOW_FILES = '{$comment_allow_files|default:0}';
</script>
<script src="{$ABS_PATH}modules/comment/js/comment.js" type="text/javascript"></script>