Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Передача многомерного массива через Ajax (https://javascript.ru/forum/jquery/73854-peredacha-mnogomernogo-massiva-cherez-ajax.html)

igrshrn 22.05.2018 14:31

Передача многомерного массива через 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);
);
}

Метод ларавеля, выводит все, что пришло в посте.

Не понимаю, почему на сервер приходит пустой массив

laimas 22.05.2018 14:56

$(форма).serialize() без всяких each ... push

и проверить консоль

PS. А флажки именовать как name="manufacturer[]" и т.п.

igrshrn 22.05.2018 15:04

нашел проблему. В формировании массива var result = []; нужно использовать не квадратные скобки, а фигурные
var result = {};

laimas 22.05.2018 15:07

Цитата:

Сообщение от igrshrn
нужно использовать не квадратные скобки, а фигурные
var result = {};

Нужно просто правильно именовать поля формы, как элементы массива (читайте в руководстве РНР) и использовать один из методов jQuery - serialize или serializeArray, а не заниматься пустым.

igrshrn 22.05.2018 15:08

А поподробней, если не сложно?

laimas 22.05.2018 15:18

Цитата:

Сообщение от igrshrn
А поподробней

А какие еще подробности нужны? РНР отдает пользователю готовые данные формы в массивах, при этом если поля формы будут иметь одинаковые имена, то в массив будет помещено значение только последнего поля, так как массив не может иметь одинаковых ключей/индексов. Для того чтобы все поля получить имена полей формы нужно именовать как членов массива: name="manufacturer[]", name="amperage[]", ...

JQ же имеет две функции для сериализации данных формы для передачи их, serializeArray как раз дает на выходе то, что вы кучей строк и делаете. При этом как и браузер JQ не поместит в набор не выбранные флажки.

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

igrshrn 22.05.2018 15:23

Да, я пробовал так именовать - name="manufacturer[]". Не знал, как с этим работать, пришлось идти в обход. Массив формируется как надо теперь и передается на сервер.
Этот скрипт для фильтрации используется, данные заполняются по ключам
[manufacturer => [1,2,3],
amperage=> [...]]
на сервере принимаю этот массив, разбиваю на отдельные массивы
manufacturer => [1,2,3], amperage=> [...] и тд и уже с этими данными работаю

laimas 22.05.2018 15:31

Цитата:

Сообщение от igrshrn
Да, я пробовал так именовать - name="manufacturer[]". Не знал, как с этим работать, пришлось идти в обход.

Ваш обход, это лишнее и бесполезное занятие. А именование manufacturer[] не для JS, ему на это как-то пофигу, а вот РНР разложит значение выбранных флажков под индексами согласно последовательности в наборе и под ключами manufacturer и т.п.

Но почему foreach ($filters["manufacturers"] as $value => $m ) и id="<?=$m?>" value="<?=$value?>", что здесь все таки идентификатор, а что значение?

igrshrn 22.05.2018 15:41

Цитата:

Сообщение от laimas (Сообщение 485812)
Но почему foreach ($filters["manufacturers"] as $value => $m ) и id="<?=$m?>" value="<?=$value?>", что здесь все таки идентификатор, а что значение?

Согласен, тут слишком плохо написано, в данном случае $value - идентификатор, а $m - значение

laimas 22.05.2018 15:44

А что есть тогда ID флажков?

igrshrn 22.05.2018 15:54

value="<?=$value?>"

igrshrn 22.05.2018 15:59

Посмотри первый скрин в первом посте - https://ibb.co/dpQtWT
я в шаблон передаю массив значений $filters["manufacturers"], допустим возьмем производителя - ключи массива($value) - это 0,1,2, а $m - это Курск ОПТИ, МЕТАСОЛ КОРЕЯ, Франция EASY

laimas 22.05.2018 16:12

Я к тому спрашиваю, что если значение флажков это 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 отправят форму, а РНР вернет готовую структуру массива. При этом именование полей как элементов массива позволяет задать любую структуру/вложение.

igrshrn 22.05.2018 16:50

Спасибо за разъяснение! Перепишу код


Часовой пояс GMT +3, время: 18:51.