2015-05-08 2 views
0

Я хочу отправить как Ajax запрос с массивом (который может быть любой длины) в качестве 1 параметра, что-то вроде:Отправка массива для каждого запроса Ajax

mandatoryFields = []; 
for (i = 1; i <= post_type_max_elements; i++) { 
    ... 
    var mandatoryItem = [] 
    mandatoryItem['optionName'] = optionName; 
    mandatoryItem['optionValue'] = optionValue; 
} 


var data = { 
    action: 'update_mandatory_fields', 
    post_type: select_post_type, 
    mandatoryFields: mandatoryFields 
}; 
jQuery.ajax({ 
    type: 'POST', 
    dataType: "json", 
    data: data, 
    ... 

Кажется, что это не работает, так как от параметра сервера Обязательные поля не определены. Каков наилучший способ?

Спасибо!

+0

Возможный дубликат [передать массив в ajax-запрос в $ .ajax()] (http://stackoverflow.com/questions/8890524/pass-array-to-ajax-request-in-ajax) – maja

ответ

2

Вы можете использовать JSON.stringify(), чтобы преобразовать массив в строку.

JSON.stringify() Метод преобразует значение JavaScript в строку JSON, необязательно, заменяя значения, если задана функция заменителя, или, необязательно, в том числе только указанные свойства, если указан массив заменителя.

В вашем примере:

$.ajax({ 
    type: "POST", 
    url: url, 
    data: {yourData: JSON.stringify(data)}, 
    success: function(response){ 
     //Callback function - do something if the request succeeded 
    } 
}); 

Обратите внимание, что вы можете также использовать $.post() вместо $.ajax().

Чтобы восстановить массив с php, вы можете использовать json_decode($_POST['yourData']);

1

JQuery, по умолчанию, упорядочивает массив в PHP образом:

$.ajax({ 
    url: "http://example.com/", 
    data: { 
    foo: [1, 2] 
    } 
}) 

будет сериализовать в http://example.com/?foo[]=1&foo[]=2. Если ваша инфраструктура serveride поддерживает этот стиль передачи параметров, вы должны получить массив, восстановленный в объекте параметров.

Если нет, и если ваш сервер поддерживает несколько значений параметров для одного и того же имени, вы можете $.ajaxSetup({ traditional: true });; это сделает ajax сериализовать до http://example.com/?foo=1&foo=2.

Третий вариант, как упоминалось maja, заключается в явном JSON-кодировании (и на серверах, JSON-декодировании) всех составных значениях.

Поскольку вы не указали, что у вас есть для решения вашего сервера, я не могу сказать вам, какие из первых двух элегантных сценариев вы можете использовать; третий, ручной, является надежным.

0

Я сделал на клиенте:

mandatoryFields[mandatoryFields.length]= JSON.stringify( {optionName: optionName, optionValue: optionValue} ) 

и на сервере я вижу, что $ _POST (PHP) вар имеет значение:

update_mandatory_fields $_POST::Array 
(
    [action] => update_mandatory_fields 
    [post_type] => post 
    [mandatoryFields] => Array 
     (
      [0] => {\"optionName\":\"post_type_mandatory_selection:post::element_1\",\"optionValue\":\"post_type_mandatory_selection:post::element_1:C\"} 
     ) 

)

В круге я не нашел правый способ, как со струной [0] =>

{\"optionName\":\"post_type_mandatory_selection:post::element_1\",\"optionValue\":\"post_type_mandatory_selection:post::element_1:C\"} 
foreach($mandatoryFields as $nextMandatory) { 
    $optionValue= json_decode($nextMandatory['optionValue']); // NULL 
    $optionName= json_decode($nextMandatory['optionName']); // NULL 

Это правильный путь?