Отправить массивы в php с помощью dojo - PullRequest
0 голосов
/ 04 декабря 2011

Как мне передать массив из dojo в php.Я отправляю эти значения:

["a", "b", "c"]

Вот что я получил до сих пор:

 btn_send.onclick(function(){
            var name_array = name_looper();
            console.log(name_array);
            dojo.xhrPost({

                url: "dojo_phpform.php",
                content: {names: name_array},
                load: function(result) {
                    var x = dojo.byId('results');
                    x.innerHTML = result;
                }
            });
        });

        function name_looper(){
            var names = dojo.query('input[type=text]');
            var name_array = [];
            names.forEach(function(element, index, array){
                name_array[index] = dojo.attr(element, 'value');
            });

            return name_array;
        }

Я попытался отобразить $ _POST ['names'] из файла php (dojo_phpform.php) и не вернул никаких ошибок.Кажется, что массив на самом деле не представлен.Единственное, что возвращается, это последний элемент в массиве.Что мне делать? Пожалуйста, помогите, заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 04 декабря 2011

Я только что проверил это с Grails и PHP. В Grails у меня нет проблем с получением массива, переданного через dojo xhrPost: я получаю массив, правильно проанализированный со всеми его значениями, как и ожидалось.

Если я отправлю:

dojo.xhrPost({
    content : {
       names : ['foo', 'bar']
    },
    url : "mygrailscontroller"
});

Я получаю параметр массива с другой стороны. Что доказывает, что проблему нужно решать не на стороне додзё, а на стороне php.

В php, если вход формы имеет переменную типа array, его параметр name должен быть установлен в квадратных скобках, например: "names []", а не "names".

Итак ... в вашем случае решение состоит не в том, чтобы сгладить массив в строку (извините), а в названии аргумента массива в скобках. Так было бы:

dojo.xhrPost({
    content : {
       "names[]" : ['foo', 'bar']
    },
    url : "myphpcontroller"
});
2 голосов
/ 04 декабря 2011

Насколько я могу судить, xjo-функции dojo не поддерживают это.Я использую вспомогательную функцию для «выравнивания» параметров самостоятельно.

_flattenXhrParams: function(params)
{
    var newParams = {};
    for(var key in params)
    {
        if(dojo.isObject(params[key]))
        {
            for(var innerKey in params[key])
            {
                newParams[key + "[" + innerKey + "]"] =
                        params[key][innerKey];
            }
        }
        else if(dojo.isArray(params[key]))
        {
            for(var i = 0, l = params[key].length; i < l; i++)
            {
                newParams[key + "[]"] = params[key][i];
             }
        }
        else
        {
            newParams[key] = params[key];
        }
    }
    return newParams;
}

Это ужасно, я знаю, и, очевидно, работает только на одномерных массивах / объектах.В вашем случае вы должны сделать:

dojo.xhrPost({
    url: "dojo_phpform.php",
    content: _flattenXhrParams({names: name_array}),
    load: function(result) {
        var x = dojo.byId('results');
        x.innerHTML = result;
    }
});

.. и вы получите параметры POST, такие как names[]=a&names[]=b&names[]=c.Для объектов вы получите names[somekey]=a&names[otherKey]=b и т. Д. PHP отлично справится с обоими.

1 голос
/ 04 декабря 2011

Я почти уверен, что значения объекта содержимого принимают только строки.Если вы хотите отправить массив, вам нужно превратить его в JSON, а затем json_decode на сервере.

...