Клонированные динамические поля в файловом менеджере сохраняют предыдущее состояние изображения: как предотвратить дублирование изображений?

Вопросы и ответы

Контекст: Я пытаюсь создать функцию, которая обрабатывает несколько сообщений и медиа/файлы, используя файловый менеджер. Проблема в том, что хотя часть с сообщениями работает, секция медиа/файлов считывает только один файл, даже после добавления кода для обработки нескольких файлов.

Код

<div class="accordion-item">
                <h2 class="accordion-header" id="headingTextMedia">
                    <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTextMedia" aria-expanded="false" aria-controls="collapseTextMedia">
                        <?php _e("Текст & Медиа")?>
                    </button>
                </h2>
                <div id="collapseTextMedia" class="accordion-collapse collapse" aria-labelledby="headingTextMedia" data-bs-parent="#campaignAccordion">
                    <div class="accordion-body">

                        <label for="type_text_media" class="nav-link bg-active-primary text-gray-700 px-4 py-3 b-r-6 text-active-white <?php _ec( (get_data($result, "type") == 1 || get_data($result, "type") == "")?"active":"" ) ?> hidden-element" data-bs-toggle="pill" data-bs-target="#wa_text_and_media" type="button" role="tab"><?php _e("Тест")?></label>
                        <input class="d-none hidden-element" type="radio" name="type" id="type_text_media" <?php _ec( (get_data($result, "type") == 1 || get_data($result, "type") == "")?"checked='true'":"" ) ?> value="1">
                            <div class="d-flex justify-content-start mb-3">
                                <button type="button" class="btn btn-primary me-2" id="add-text-media">
                                    <?php _e("Добавить Текст & Медиа")?>
                                </button>
                                <button type="button" class="btn btn-primary" id="add-more-text">
                                    <?php _e("Добавить Дополнительный Текст")?>
                                </button>
                            </div>

                            <div id="dynamic-fields-container">
                                <div class="dynamic-field">
                                    <?php echo view_cell('\Core\Whatsapp\Controllers\Whatsapp::widget_content', ["result" => $result]) ?>
                                    <label class="form-label"><?php _e("Текстовое Сообщение / Подпись")?></label>
                                    <?php echo view_cell('\Core\Caption\Controllers\Caption::block', ['name' => 'caption[]', 'value' => get_data($result, "caption")]) ?>
                                    <p class="fs-12 text-danger mb-1">
                                        <span class="paramsDiv"></span>
                                    </p>
                                    <ul class="text-gray-400 fs-12">
                                        <li><?php _e("Случайное сообщение по Spintax")?></li>
                                        <li><?php _e("Например: {Привет|Здравствуйте|Х Hola}")?></li>
                                    </ul>
                                </div>
                            </div>

                            <div class="mt-3">
                                <label class="form-label"><?php _e("Отправить Тестовое Сообщение")?></label>
                                <div class="input-group">
                                    <input type="text" class="form-control" placeholder="<?php _e("Номер Тестового Получателя")?>" id="test-recipient-number">
                                    <button class="btn btn-primary" type="button" id="send-test-message"><?php _e("Отправить")?></button>
                                </div>
                                <small class="form-text text-muted"><?php _e("Номер WhatsApp для получения тестового сообщения (включая код страны).")?></small>
                            </div>
                        </div>
                    </div>
            </div>

            <script>
            $(document).ready(function() {
                $('#add-text-media').on('click', function() {
                    const newField = $('.dynamic-field:first').clone(true);
                    newField.find('textarea').val('');
                    newField.find('.emojionearea-editor').text('');
                    addRemoveButton(newField);
                    $('#dynamic-fields-container').append(newField);
                    updateRemoveButtons();
                });

                $('#add-more-text').on('click', function() {
                    const newField = $('.dynamic-field:first').clone(true);
                    newField.find('.fm-selected-media').remove();
                    newField.find('.btnOpenFileManager').remove();
                    newField.find('textarea').val('');
                    newField.find('.emojionearea-editor').text('');
                    addRemoveButton(newField);
                    $('#dynamic-fields-container').append(newField);
                    updateRemoveButtons();
                });

                function addRemoveButton(field) {
                    const removeButton = $('<button type="button" class="btn btn-danger btn-hover-scale remove-field mt-2"><i class="fas fa-times"></i> <?php _e("Удалить") ?></button>');
                    field.append(removeButton);
                }

                $(document).on('click', '.remove-field', function() {
                    $(this).closest('.dynamic-field').remove();
                    updateRemoveButtons();
                });

                function updateRemoveButtons() {
                    const fields = $('.dynamic-field');
                    if (fields.length > 1) {
                        fields.find('.remove-field').show();
                    } else {
                        fields.find('.remove-field').hide();
                    }
                }

                // Первоначальный вызов для настройки кнопок удаления
                updateRemoveButtons();
            });
            </script>

Я добавил код для поддержки нескольких сообщений и медиа файлов в файловом менеджере. Часть с сообщениями работает как ожидается, позволяя отправлять несколько сообщений. Однако в секции медиа/файлов я ожидал, что она позволит загружать несколько файлов, но сейчас она считывает только первый файл, который я загружаю, даже когда я пытаюсь добавить больше.

Если вы хотите иметь одно поле ввода, позволяющее загружать несколько файлов, вам нужно установить атрибут multiple для него. Тем не менее, исходя из вашего кода, кажется, что у вас есть несколько загрузчиков файлов, и только первый файл загружается.

Если это ваша проблема, то вам нужно убедиться, что у разных полей загрузки файлов разные значения атрибута name.

Также, если вы хотите загружать файлы с помощью Javascript, прочитайте эту статью: https://imagekit.io/blog/uploading-multiple-files-using-javascript/

Ответ

Чтобы решить проблему с дублированием изображений и корректной работой расширяемой функции загрузки файлов в вашем менеджере файлов, вам следует внести несколько изменений в ваш код. Я опишу ключевые моменты, на которые нужно обратить внимание.

1. Добавление атрибута multiple

Если вы хотите, чтобы одно поле ввода позволяло загружать несколько файлов, просто добавьте атрибут multiple в ваше поле загрузки. Например:

<input type="file" class="form-control" id="media-file" name="media-files[]" multiple>

Если у вас есть несколько полей загрузки для разных файлов, убедитесь, что они имеют разные именевые атрибуты, чтобы сервер правильно обрабатывал каждое из них:

<input type="file" class="form-control" name="media-files[]" multiple>
<input type="file" class="form-control" name="media-files[]" multiple>

2. Уникальные идентификаторы для каждого поля

Убедитесь, что каждое созданное поле загрузки имеет уникальный идентификатор. Это поможет избежать конфликтов и гарантирует, что все файлы могут быть загружены корректно.

3. Обновление скрипта JavaScript

В вашем JavaScript-коде вы клонируете поле загрузки, а атрибуты имени и ID для поля загрузки должны быть динамически изменены. Пример обновления вашего скрипта:

$('#add-text-media').on('click', function() {
    const newField = $('.dynamic-field:first').clone(true);
    newField.find('input[type="file"]').attr('id', 'media-file-' + $('.dynamic-field').length);
    newField.find('input[type="file"]').attr('name', 'media-files[]');
    newField.find('textarea').val('');
    newField.find('.emojionearea-editor').text('');
    addRemoveButton(newField);
    $('#dynamic-fields-container').append(newField);
    updateRemoveButtons();
});

4. Удаление старых файлов

При добавлении новых полей загрузки, убедитесь, что предыдущие поля (если они были удалены) корректно обновляются. Для этого к нужным полям должен добавляться атрибут data-index, чтобы отследить количество полей:

function addRemoveButton(field) {
    const removeButton = $('<button type="button" class="btn btn-danger btn-hover-scale remove-field mt-2"><i class="fas fa-times"></i> Удалить</button>');
    field.append(removeButton);
}

5. Дополнительные советы

  • Убедитесь, что на стороне сервера вы обрабатываете массив файлов. Например, если вы используете PHP, ваши файлы будут доступны как $_FILES['media-files'].
  • Если ваша логика загрузки файлов включает в себя AJAX-запросы, убедитесь, что правильно формируете объект FormData для передачи на сервер.

Заключение

После внедрения этих изменений ваша система загрузки медиафайлов должна корректно обрабатывать множественные файлы и предотвращать дублирование изображений. Убедитесь в том, чтобы провести тестирование и убедиться, что все работает так, как вы планируете. Если возникнут дополнительные вопросы или понадобятся дальнейшие разъяснения, не стесняйтесь задавать!

Оцените материал
Добавить комментарий

Капча загружается...