Передача многомерного массива через Ajax
Добрый день!
Имеется форма с чекбоксами, ссылка на скрин ниже https://ibb.co/dpQtWT Код вывода чекбоксов <div class="row filter-selects"> <?php if(!empty($filters["manufacturers"])): ?> <div class="col-md-3 select"> <label>Производитель:</label><br /> <div class="search" name="manufacturer"> <?php foreach ($filters["manufacturers"] as $value => $m ): ?> <span> <input type="checkbox" class="manufacturer" name="manufacturer" id="<?=$m?>" value="<?=$value?>"> <label class="button-check-label" for="<?=$m?>"> <?=$m?> </label> </span> <?php endforeach; ?> </div> </div> <?php endif; ?> <?php if(!empty($filters["amperages"])): ?> <div class="col-md-3 select"> <label class="text-nowrap">Номинальный ток:</label><br /> <div class="search" name="amperage"> <?php foreach ($filters["amperages"] as $value => $a): ?> <span> <input type="checkbox" class="button-check" name="amperage" id="<?=$a?>" value="<?=$value?>"> <label class="button-check-label" for="<?=$a?>"> <?=$a?> </label> </span> <?php endforeach; ?> </div> </div> <?php endif; ?> ... </div> Получение значений с чекбоксов, а так же код передачи через ajax var result = []; result["manufacturer"] = []; result["amperage"] = []; result["type"] = []; result["charging"] = []; result["kz"] = []; result["protection"] = []; $('[name="manufacturer"]:checked').each(function() { result["manufacturer"].push($(this).val()); }); $('[name="amperage"]:checked').each(function() { result["amperage"].push($(this).val()); }); $('[name="type"]:checked').each(function() { result["type"].push($(this).val()); }); $('[name="charging"]:checked').each(function() { result["charging"].push($(this).val()); }); $('[name="kz"]:checked').each(function() { result["kz"].push($(this).val()); }); $('[name="protection"]:checked').each(function() { result["protection"].push($(this).val()); }); //result = JSON.stringify(result); console.log(result); $.ajax({ method: "POST", url: "index.php?route=extension/module/compare/filterCount", dataType: 'json', data: result, }) Так же, пробовал через функцию map var result =[]; result["manufacturer"] = $('[name="manufacturer"]:checked').map(function(id, element){return $(element).val();}); result["amperage"] = $('[name="amperage"]:checked').map(function(id, element){return $(element).val();}); result["type"] = $('[name="type"]:checked').map(function(id, element){return $(element).val();}); result["charging"] = $('[name="charging"]:checked').map(function(id, element){return $(element).val();}); result["kz"] = $('[name="kz"]:checked').map(function(id, element){return $(element).val();}); result["protection"] = $('[name="protection"]:checked').map(function(id, element){return $(element).val();}); В консоли строит массив нормально - https://ibb.co/gfLG38 А при передачи на сторону сервера - пустой массив. Работаю с ларавелем, на стороне сервера,В файле php принимаю методом public function filterCount() { var_dump($this->request->post); ); } Метод ларавеля, выводит все, что пришло в посте. Не понимаю, почему на сервер приходит пустой массив |
$(форма).serialize() без всяких each ... push
и проверить консоль PS. А флажки именовать как name="manufacturer[]" и т.п. |
нашел проблему. В формировании массива var result = []; нужно использовать не квадратные скобки, а фигурные
var result = {}; |
Цитата:
|
А поподробней, если не сложно?
|
Цитата:
JQ же имеет две функции для сериализации данных формы для передачи их, serializeArray как раз дает на выходе то, что вы кучей строк и делаете. При этом как и браузер JQ не поместит в набор не выбранные флажки. Но вот именование флажков у вас по самой сути очень странное, как вы на сервере разбираетесь что кому принадлежит? |
Да, я пробовал так именовать - name="manufacturer[]". Не знал, как с этим работать, пришлось идти в обход. Массив формируется как надо теперь и передается на сервер.
Этот скрипт для фильтрации используется, данные заполняются по ключам [manufacturer => [1,2,3], amperage=> [...]] на сервере принимаю этот массив, разбиваю на отдельные массивы manufacturer => [1,2,3], amperage=> [...] и тд и уже с этими данными работаю |
Цитата:
Но почему foreach ($filters["manufacturers"] as $value => $m ) и id="<?=$m?>" value="<?=$value?>", что здесь все таки идентификатор, а что значение? |
Цитата:
|
А что есть тогда ID флажков?
|
value="<?=$value?>"
|
Посмотри первый скрин в первом посте - https://ibb.co/dpQtWT
я в шаблон передаю массив значений $filters["manufacturers"], допустим возьмем производителя - ключи массива($value) - это 0,1,2, а $m - это Курск ОПТИ, МЕТАСОЛ КОРЕЯ, Франция EASY |
Я к тому спрашиваю, что если значение флажков это ID и у вас так и есть, то все Ок, ибо у вас и получится на сервере под ключами manufacturer и т.д. массивы с этими ID. При этом ведь не обязательно вот так:
<input type="checkbox" class="manufacturer" name="manufacturer" id="<?=$m?>" value="<?=$value?>"> <label class="button-check-label" for="<?=$m?>"><?=$m?><label> можно и так: <label class="button-check-label"><input type="checkbox" class="manufacturer" name="manufacturer[]" value="<?=$value?>"> <?=$m?><label> То есть связывать метку с флажком не требуется, и если $m, это описание то просто его в метке и прописывать. Но бывает необходимость связать массивы данных с их владельцем, то есть наборы флажков и иные поля ввода, тогда поступают так: name="manufacturer[идентификатор]" value="значение" для полей, и для флажков name="manufacturer[]" value="идентификатор". Выше указанные методы jQuery отправят форму, а РНР вернет готовую структуру массива. При этом именование полей как элементов массива позволяет задать любую структуру/вложение. |
Спасибо за разъяснение! Перепишу код
|
Часовой пояс GMT +3, время: 18:51. |