Сайт WordPress — как сохранить event.target.файлы в jQuery при перемещении между несколькими ajax-вызовами PHP-скриптов?

#php #jquery #ajax #wordpress

#php #jquery #ajax #wordpress

Вопрос:

Я занимаюсь примерно 2 месяцами PHP и JQuery , поэтому, пожалуйста, потерпите меня. 🙂

У меня есть форма с кнопкой для добавления новой записи. При нажатии кнопки открывается модальное окно для записи, включая кнопку для загрузки файла, которая при нажатии запускает ajax-вызов PHP-скрипта для загрузки файла. При отправке модального я использую ajax для вызова PHP-скрипта для сохранения файла на сервере и записи в базу данных с URL-адресом файла, сохраненного на сервере.

Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку это новая запись, идентификатор записи неизвестен во время вызова PHP-скрипта для загрузки файла на сервер. У меня есть другие варианты использования для обработки загрузки файлов в edit record, которые работают должным образом, потому что идентификатор записи известен. Итак, я хотел бы избежать необходимости переупорядочивать существующий код.

После тонны исследований и пробования всевозможных рекомендаций за последние 2 недели я все еще не могу заставить эту функциональность работать.

Сейчас я нахожусь в том, что вызов ajax вызывается дважды для новых записей. При 1-м вызове, поскольку идентификатор пуст, он просто завершает работу функции. При 2-м вызове, когда идентификатор известен, происходит сбой, потому что теперь event.target.файлы не определены.

Одно из решений, которое, я полагаю, будет работать с существующим кодом, — это возможность сохранить event.target.файлы в глобальной переменной (что, как я думал, я делал), чтобы она по-прежнему была доступна для 2-го вызова ajax. Но ничего из того, что я пробовал, не сработало.

Вопрос — как я могу сохранить event.target.файлы в глобальной переменной должны быть доступны для 2-го ajax-вызова? Или есть лучшее решение, которое не нарушит уже работающий код для редактирования записей? Я просто неправильно передаю событие?

Любая помощь приветствуется!

Вот соответствующий JS-код

 jQuery(document).ready(function($) {
  var files;
  $('#file_input').on('change', function() { // 1st call after clicking 'upload file' in modal
    var files = document.getElementById('file_input').files[0];
    prepareUpload(e);
  });

  $(document.body).on("click", "#submit-btn-modal", function(e) {
    e.preventDefault();
    post_record(e);
  });

});
        
function prepareUpload(e, count, new_recid) {
  if (count === 2) {
    var id = new_recid;
  } else {
      var prefix = $("#master_form_wrapper #prefix").val();
      var recid = $("#master_form_wrapper #" prefix "id").val();
      var id = parseInt(recid);
    }
  files = e.target.files; // errors here on 2nd call (Cannot read property 'name' of undefined)
  var data = new FormData();
  data.append("action", "file_upload");
  data.append("id", id);
  $.each(files, function(key, value) {
    data.append("file_upload", value);
    });        
  $.ajax({
    url: general_globals.ajaxurl,
    type: 'POST',
    data: data,
    cache: false,
    dataType: 'json',
    processData: false, 
    contentType: false
  });
  } 
}

function post_record(e) {
  var counter = 1;
  var post = $("#master_form_wrapper form").serialize();
  var id = $("#master_form_wrapper #" prefix "id").val();
  var action = 'update_record';
  $.ajax({
    url: general_globals.ajaxurl,
    data: { action : action, post : post},
    type: "post",
    success: function(response){
    if (response.search("ERROR: ") === -1) {
      record = JSON.parse(response);
      var recordID = record.record_id;
      var recid = recordID.split('_').pop();
      var counter = 2;
      prepareUpload(e, counter, recid); // 2nd call after clicking 'submit' in modal
    }
  });
}
  

Вот соответствующий HTML

 <body>
  <div id='modal_cover'>
    <div id='master_form_wrapper'>
      <span class='close'><button class='close-modal'> </button></span>
      <form name='$table' id='$table' method='post' action='' class='upload_form' enctype='multipart/form-data'>
        <input type='hidden' name='prefix' id='prefix' value='$prefix'>
        <div class='field_wrapper'>
          <div id='file_upload' class='file-upload'>
            <input type='file' id='file_input' style='opacity:0;' />
            <p class='file_upload_text'>Click to upload file</p>
          </div>
          <div id='file_upload_preview' class='file-upload file-preview' style='display:none;'>
            <div class='file_preview'></div>
              <button id='fileurl' data-fileurl='' class='file_delete'>Delete</button>
          </div>
          <button id='submit-btn-modal' class='submit-btn-modal'>Submit</button>
        </div>
      </form>
    </div>
  </div>
</body>
  

Комментарии:

1. Можете ли вы также добавить соответствующий HTML-код.

2. prepareUpload(e); вы передаете здесь только один аргумент, но функция ожидает три аргумента при выборе файла.

3. @AlwaysHelping, готово! Я подтвердил, что передача параметров не является проблемой, поскольку консоль prepareUpload правильно регистрирует идентификатор при втором вызове. Дайте мне знать, если вам нужно что-нибудь еще.

4. Мой ответ решил ваш вопрос?

5. Да, это так! Мне пришлось внести изменения в одну строку существующего кода. Тогда это сработало как по волшебству. Я действительно ценю ваши усилия!

Ответ №1:

Вам нужно, чтобы store вы file , которую вы выбираете onChnage , выполняли функцию в массиве. У меня есть имя, которое filesToUpload . Как только вы выберете, file это будет pushed в это array .

Когда вы нажмете на submit-btn-modal кнопку, вы передадите это array через post_record(filesToUpload) , и в этом function вы получите это argument .

Как только post_record есть successfully , и вы получили id (recid) с сервера. Затем вы можете вызвать prepareUpload(myFiles) передачу этого массива в вашу функцию загрузки вместе с id и counter

В функции подготовки загрузки мы просто loop пройдем this через массив и добавим фактическое значение к formData объекту.

Я также добавил примечания к каждой строке кода для вас.

Замените свой код следующим: (Код протестирован и работает)

 jQuery(document).ready(function($) {

  //array to store file
  var filesToUpload = []

  //Store File on select
  $('#file_input').on('change', function(e) { // 1st call after clicking 'upload file' in modal
    //get the file
    var files = e.target.files[0]
    //Push your file to an array
    filesToUpload.push(files);

  });

  //Upload button
  $(document.body).on("click", "#submit-btn-modal", function(e) {
    e.preventDefault();
    //send you array to upload in prepare upload
    post_record(filesToUpload);
  });
});

function prepareUpload(file, count, new_recid) {
  if (count === 2) {
    var id = new_recid;
  } else {
    //var prefix = $("#master_form_wrapper #prefix").val();
    // var recid = $("#master_form_wrapper #" prefix "id").val();
    //var id = parseInt(recid);
  }

  //Initialize formData
  var data = new FormData();
  data.append("action", "file_upload");
  data.append("id", id);

  //prepare each file
  for (var i = 0; i < file.length; i  ) {
    data.append("file_upload", file[i]); //actual file
  }

  //Final ajax call
  $.ajax({
    url: general_globals.ajaxurl
    type: 'POST',
    data: data,
    cache: false,
    dataType: 'json',
    processData: false,
    contentType: false
  });

  //Set the array to empty again once the record is created and file uploaded
  filesToUpload = []
}

function post_record(myFiles) {

  //counter
  var counter = 1;

  //Just need these two variable for getting the ID
  var action = 'update_record';
  var post = $("#master_form_wrapper > form").serialize();

  //Ajax to get the ID
  $.ajax({
    url: general_globals.ajaxurl,
    data: {
      action: action,
      post: post
    },
    type: "post",
    success: function(response) {
      var record = JSON.parse(response);
      var recordID = record.record_id;
      var recid = recordID.split('_').pop();
      var counter = 2;

      //Call prepareUpload() and pass ID and counter and file array 
      //which we have recieved from submit button
      prepareUpload(myFiles, counter, recid);
    }
  });
}
  

Комментарии:

1. Добро пожаловать — Рад, что я смог вас — счастливого кодирования 🙂