2011-12-04 13 views
0

dojoからphpに配列を送信するにはどうすればいいですか?私は、これらの値を提出してい :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 PHPファイルから[ '名前'](dojo_phpform.php)をエコーし​​ようとしましたが、エラーは返されませんでした。配列が実際には提出されていないようです。返されるのは配列の最後の項目だけです。私は何をしますか?助けてください、ありがとうございます!

+0

'var_dump($ _ POST)'を使用して何が得られるかを確認 –

+0

ここにあなたのPHPフォームコードを投稿できますか? – Philippe

+0

@Philippe:私はprint_r($ _ POST ['names'])のみしました。私はコンテンツオブジェクトを使用しない場合、それを提出する方法を正確に –

答えて

2

私の知る限り見ることができましたように、DojoのXHR機能がそれをサポートしていません。私はヘルパー関数を使ってパラメータを "平坦化"しています。

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

私は知っている、明らかに1次元配列/オブジェクトでのみ動作します。

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

を...あなたはnames[]=a&names[]=b&names[]=cのようなPOSTパラメータを取得したい:あなたのケースでは、あなたは何だろう。オブジェクトの場合、names[somekey]=a&names[otherKey]=bなどを取得します。PHPは両方ともうまく処理します。

1

私はコンテンツオブジェクトの値が文字列を取ることを確信しています。配列を送信する場合は、配列をJSONに変換してから、サーバー上でjson_decodeに設定する必要があります。

+0

を参照してくださいPHPファイルで? –

4

これをgrailsとphpでテストしました。 grailsではdojo xhrPostで配列を取得するのに問題はありません。すべての値を適切に解析して配列を取得します。

私が投稿する場合:

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

を、私は反対側の配列のparamを取得します。これは、問題はDojo側で解決されるのではなく、PHP側で解決されることを証明します。

PHPでは、フォーム入力にarray型の変数がある場合、そのnameパラメータは "names"ではなく "names []"のように角括弧で設定する必要があります。

あなたの場合、解決策は配列を文字列に平坦化することではありませんが、配列引数に角括弧を付けることです。だから、次のようになります。

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

これを投稿していただきありがとうございます、私はそれが可能であることを認識していませんでした。 grailsは '{" names [] ":['foo'、 'bar']}'も扱っていますか? – Frode

+0

実際にはgrailsでは[[]は必要ありません... "names"という名前の引数を受け取りますが、サーバはそれを配列として取得します。 – Philippe

+0

もちろん、私はそれを完全に忘れてしまった。良くやった。 – DanMan

関連する問題