2015-08-01 3 views
0

У меня есть функция jquery, которая принимает значения формы, сериализует их и передает их в php-функцию в плагине Wordpress. Когда я пытаюсь получить значения post, я могу получить только целую строку, а не каждое значение. Вот моя текущая функция JQuery:Невозможно разобрать значения одного сообщения из ajax

jQuery('.lesson_complete').change(function() { 
 
    if (jQuery(this).is(":checked")) { 
 
     //var module = jQuery(this).parent().find('.module-id').val(); 
 
     //alert(module); 
 
     var progress_post = jQuery(this).parent().serialize(); 
 
     
 
     jQuery.ajax({ 
 
      type: "POST", 
 
      url: submitprogress.ajaxurl, 
 
      data: { 
 
       action: 'submit_progress', 
 
       data: progress_post 
 
      }, 
 
      success: function (response) { 
 
       //alert(form_parent); 
 
       //alert('success'); 
 
       alert(progress_post); 
 
       alert("working" + response); 
 
       //jQuery("#feedback").html(data); 
 
      } 
 
     }); 
 
     
 
     return false; 
 
    }  
 
})
<form type="post" action="#" id="moduleProgressForm"> 
 
    <label for="lesson_complete">Finished with this lesson?</label> 
 
    <input type="checkbox" class="lesson_complete" value="1" name="lesson_complete" /> 
 
    <input type="hidden" name="user_id" value="'.get_current_user_id().'"/> 
 
    <input type="hidden" name="post_id" value="'.$current_post.'"/> 
 
    <input type="hidden" class="module-id" name="module_id" value=""/> 
 
</form>

я могу получить доступ к строке, используя это в функции:

$post_values = $_POST['data'] 

возвращает эту строку:

lesson_complete = 1 & user_id = 2 & post_id = 1 & module_id = 1

Но я не могу получить доступ к отдельным значениям сообщений. Что я делаю не так?

ответ

0

jQuery преобразует литерал объекта, который вы передали в настройку data, в строку запроса (и будет делать это рекурсивно). Это означает, что объект

var progress_post = { 
    lesson_complete: 1, 
    user_id: 2, 
    post_id: 1, 
    module_id: 1 
} 

станет

lesson_complete = 1 & user_id = 2 & post_id = 1 & MODULE_ID = 1

это именно строка, которую вы получили. Причина этого в том, что в этом случае вы загружаете данные в виде обычного текста. Но обратите внимание на структуру строки, которую вы получили. Все они, кажется, являются ключевыми парами ценностей, нет?

lesson_complete=1& 
user_id=2& 
post_id=1& 
module_id=1 

Все склеены друг с другом &. Parse_str на помощь:

parse_str($_POST['data'], $post_values); 

parse_str преобразует такую ​​строку запроса в ассоциативный массив (или отдельных переменных, если второй аргумент опущен), после чего вы можете получить доступ к его элементам, как и ожидалось:

echo $post_values['user_id']; // 2 
+1

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

0

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

var temp_post = jQuery(this).parent().serialize(); 
var progress_post = JSON.Stringify(temp_post); 

Это создаст объект JSON. Убедитесь, что ваш backend PHP-метод принимает объект JSON, а не только строку, и вы сможете получить доступ к свойствам объекта через стандартную нотацию OOP.

+0

Спасибо Даниил. Кажется, это нарушило функцию jquery. Даже после скрытия вызова Ajax и просто попытки вернуть значение progress_post в оповещении, я ничего не получаю. Я чувствую, что что-то упускаю. Должна ли функция PHP рассматривать сериализованную строку как сообщение и вытаскивать каждую переменную сообщения? –

+1

@BradC. Если вы отправляете строку JSON с XMLHttpRequest, для доступа к ней в PHP вам нужно будет использовать содержимое 'php: // input'. Этот вопрос может содержать некоторые подробности: http: // stackoverflow.com/questions/18371751/reading-json-input-in-php –

Смежные вопросы