@Roman1290

Как передать массив POST с помощью Ajax, где есть одинаковые name у input?

Есть форма, где идут текстовые input-ы с разными name и input-ы, которые появляются динамически с одинаковыми name.

Проблема в том, что когда формируется массив для передачи POST посредством AJAX, в массив попадает только последнее значение поля, где name одинаковые:

Поля формы такие:
<form name="zayavka" method="post" enctype="multipart/form-data">
<input type="text" name="FIO" placeholder="Иван">
<input type="text" name="GOROD" placeholder="Москва">
<input id="file-doc308" type="hidden" name="FOTO[]" value="308">
<input id="file-doc309" type="hidden" name="FOTO[]" value="309">
<input id="file-doc310" type="hidden" name="FOTO[]" value="310">
<div id="error"></div>
<button class="btn btn-primary" type="submit">Отправить</button>
</form>


Ajax скрипт передачи данных вот такой:
$('form[name=zayavka]').submit(function () {
var o = new Object();
 $(this).find('input, textarea').each(function () {
  o[$(this).attr('name')] = $(this).val();
  });

 $.post('/bitrix/templates/site/js/form.php', o,
  function (data) {
  if (data == '1') {
  document.getElementById("error").innerHTML = "Спасибо за Вашу заявку! Она направлена на модерацию.";
  $('.md-close').click();
  }
  else document.getElementById("error").innerHTML = "Произошла ошибка! Повторите попытку позже.";
  });
  //}
  return false;
  });


Как я понимаю, проблема в этой строке:
o[$(this).attr('name')] = $(this).val();
Видимо, происходит замена друг другом данных с одинаковым name="FOTO[]", вместо того, чтобы собирать их в массив.

Массив выводится вот таким, где указан только последний файл:
Array
(
    [FIO] => 
    [GOROD] => 
    [P30] => Array
        (
            [0] => 310
        )

)


Подскажите, пожалуйста, кто разбирается в AJAX, как правильно обработать поля с одинаковыми name, чтобы в пост формировался массив, а не брался только последний файл. Спасибо!
  • Вопрос задан
  • 384 просмотра
Решения вопроса 1
@Roman1290 Автор вопроса
Получилось сделать.
Так как у нас есть уникальный ID, то сделали следующим образом:

Отлавливаем все input с одинаковым name и присваиваем им уникальные значения:
var o = new Object();
 $(this).find('input, textarea').each(function () {
	 if ($(this).attr('name') == 'FOTO[]') {
		o['PASSPORT_'+$(this).attr('id')] = $(this).val();
	 }
	 else {
		o[$(this).attr('name')] = $(this).val();
	 }
  });


А потом уже объединяем эти данные в массив по маске, перебирая наш $_POST в php-файле:
$result = [];
$i = 0;
foreach($_POST as $k => $v){
    if(preg_match("/^PASSPORT_file-doc\d+$/", $k)){
        $result[$i] = $v;
		$i++;
    }
}
$_POST['FOTO'] = $result;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы