Wern Ancheta
Wern Ancheta

Reputation: 23297

Submit arrays to php using dojo

How do I submit an array from dojo to php. I'm submitting these values:

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

Here's what I got so far:

 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;
        }

I tried to echo $_POST['names'] from the php file(dojo_phpform.php) and it didn't return any errors. It seems like the array isn't actually submitted. The only thing that's returned is the last item in the array. What do I do?Please help, Thanks in advance!

Upvotes: 0

Views: 1566

Answers (3)

Philippe
Philippe

Reputation: 6828

I just tested this with grails and php. In grails I have no problem getting an array submitted through a dojo xhrPost : I retrieve the array properly parsed with all its values as expected.

If I post :

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

I get an array param on the other side. Which proves the problem hasn't to be solved on the dojo side, but on the php side.

In php, if a form input has a variable of type array, its name parameter has to be set with square brackets, like : "names[]" rather than "names".

So... in your case the solution is not to flatten the array into a string (sorry), but to name your array argument with brackets. So it would be :

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

Upvotes: 4

Frode
Frode

Reputation: 5710

As far as I've been able to see, dojo's xhr functions don't support it. I'm using a helper function to "flatten" parameters myself.

_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;
}

It's butt ugly, I know, and obviously only works on one dimensional arrays/objects. In your case, you'd do:

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

.. and you'd get POST parameters like names[]=a&names[]=b&names[]=c. For objects, you'd get names[somekey]=a&names[otherKey]=b etc. PHP handles both nicely.

Upvotes: 2

DanMan
DanMan

Reputation: 11561

I'm pretty sure the values of the content object only take strings. If you want to submit an array, you'd have to turn it into JSON and then json_decode it on the server.

Upvotes: 1

Related Questions