Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.05.2018, 14:31
Интересующийся
Отправить личное сообщение для igrshrn Посмотреть профиль Найти все сообщения от igrshrn
 
Регистрация: 21.05.2018
Сообщений: 10

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

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

Не понимаю, почему на сервер приходит пустой массив
Ответить с цитированием
  #2 (permalink)  
Старый 22.05.2018, 14:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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

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

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

Последний раз редактировалось laimas, 22.05.2018 в 15:04.
Ответить с цитированием
  #3 (permalink)  
Старый 22.05.2018, 15:04
Интересующийся
Отправить личное сообщение для igrshrn Посмотреть профиль Найти все сообщения от igrshrn
 
Регистрация: 21.05.2018
Сообщений: 10

нашел проблему. В формировании массива var result = []; нужно использовать не квадратные скобки, а фигурные
var result = {};
Ответить с цитированием
  #4 (permalink)  
Старый 22.05.2018, 15:07
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от igrshrn
нужно использовать не квадратные скобки, а фигурные
var result = {};
Нужно просто правильно именовать поля формы, как элементы массива (читайте в руководстве РНР) и использовать один из методов jQuery - serialize или serializeArray, а не заниматься пустым.
Ответить с цитированием
  #5 (permalink)  
Старый 22.05.2018, 15:08
Интересующийся
Отправить личное сообщение для igrshrn Посмотреть профиль Найти все сообщения от igrshrn
 
Регистрация: 21.05.2018
Сообщений: 10

А поподробней, если не сложно?
Ответить с цитированием
  #6 (permalink)  
Старый 22.05.2018, 15:18
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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

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

Но вот именование флажков у вас по самой сути очень странное, как вы на сервере разбираетесь что кому принадлежит?
Ответить с цитированием
  #7 (permalink)  
Старый 22.05.2018, 15:23
Интересующийся
Отправить личное сообщение для igrshrn Посмотреть профиль Найти все сообщения от igrshrn
 
Регистрация: 21.05.2018
Сообщений: 10

Да, я пробовал так именовать - name="manufacturer[]". Не знал, как с этим работать, пришлось идти в обход. Массив формируется как надо теперь и передается на сервер.
Этот скрипт для фильтрации используется, данные заполняются по ключам
[manufacturer => [1,2,3],
amperage=> [...]]
на сервере принимаю этот массив, разбиваю на отдельные массивы
manufacturer => [1,2,3], amperage=> [...] и тд и уже с этими данными работаю
Ответить с цитированием
  #8 (permalink)  
Старый 22.05.2018, 15:31
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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

Но почему foreach ($filters["manufacturers"] as $value => $m ) и id="<?=$m?>" value="<?=$value?>", что здесь все таки идентификатор, а что значение?
Ответить с цитированием
  #9 (permalink)  
Старый 22.05.2018, 15:41
Интересующийся
Отправить личное сообщение для igrshrn Посмотреть профиль Найти все сообщения от igrshrn
 
Регистрация: 21.05.2018
Сообщений: 10

Сообщение от laimas Посмотреть сообщение
Но почему foreach ($filters["manufacturers"] as $value => $m ) и id="<?=$m?>" value="<?=$value?>", что здесь все таки идентификатор, а что значение?
Согласен, тут слишком плохо написано, в данном случае $value - идентификатор, а $m - значение
Ответить с цитированием
  #10 (permalink)  
Старый 22.05.2018, 15:44
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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

Последний раз редактировалось laimas, 22.05.2018 в 15:54.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров в url средствами jquery ajax sys Общие вопросы Javascript 19 10.10.2016 19:03
Передача через AJAX большого объема данных yambbkru AJAX и COMET 3 20.06.2015 15:18
Перестает работать галерея при загрузке через Ajax (Need help) Clodan jQuery 0 20.04.2015 20:18
Передача данных через Ajax (IE) byFahrenheit AJAX и COMET 5 01.03.2013 16:06
XMLHTTPRequest передача имя через POST dds AJAX и COMET 0 14.08.2008 14:44