Когда я отправляю сериализованные данные в файл PHP, используя ajax, иногда это кодируется URL в зависимости от того, как я это делаю.
Первоначально у меня был следующий код, который работал нормально:
$.ajax({
type: 'POST',
url: 'ajax-process.php',
data: $("#sitestructure-form").serialize(),
success: function(d){$("#structureupdate").html(d);}
});
Данные были отправлены в мой файл PHP, и я мог повторить это, и это выглядело так.
[{"id":20,"children":[{"id":21}]},{"id":19},{"id":18,"children":[{"id":14}]},{"id":16},{"id":13,"children":[{"id":11}]},{"id":17},{"id":15},{"id":12}]
Я хотел отправить более одного фрагмента данных, я назвал сериализованные данные «заказ» и добавил «процесс», поэтому я обновил свой код следующим образом:
$.ajax({
type: 'POST',
url: 'ajax-process.php',
data: {
order: $("#sitestructure-form").serialize(),
process: "sitemap-reordernavigation"},
success: function(d){$("#structureupdate").html(d);}
});
Однако когда я получаю сериализованные данные, отправленные в порядке, вывод выглядит так:
data=%5B%7B%22id%22%3A20%2C%22children%22%3A%5B%7B%22id%22%3A21%7D%5D%7D%2C%7B%22id%22%3A19%7D%2C%7B%22id%22%3A18%2C%22children%22%3A%5B%7B%22id%22%3A14%7D%5D%7D%2C%7B%22id%22%3A16%7D%2C%7B%22id%22%3A13%2C%22children%22%3A%5B%7B%22id%22%3A11%7D%5D%7D%2C%7B%22id%22%3A17%7D%2C%7B%22id%22%3A15%7D%2C%7B%22id%22%3A12%7D%5D
Единственный способ решить эту проблему — использовать php для его кодирования, а затем использовать str_replace для удаления бита «data =» в начале, вот так.
$data = str_replace("data=","",urldecode($_POST['order']));
Как я могу заставить это работать с AJAX, хотя мне не нужно его кодировать?
Я попытался использовать переменную и установить для processData значение false, однако это не сработало.
var order = $("#sitestructure-form").serialize();
$.ajax({
type: 'POST',
url: 'ajax-process.php',
processData: false,
data: {
order: order,
process: "sitemap-reordernavigation"},
success: function(d){$("#structureupdate").html(d);}
});
Мои знания AJAX / Jquery довольно ограничены, поэтому любая помощь будет принята с благодарностью.
Это потому, что вы впервые вводите сериализованную текстовую строку в атрибут данных, а jQuery не преобразует ее в сериализованную строку. Во-вторых, вы назначаете объект атрибуту данных с атрибутом «order», имеющим сериализованную текстовую строку, поэтому jQuery в основном выполняет двойное кодирование. Чтобы он действовал так, как вам хотелось бы, вам необходимо преобразовать форму в объект и присвоить этому объекту свой атрибут порядка. Смотрите этот пост: Преобразование данных формы в объект JavaScript с помощью jQuery
// taking the example from the above link, you do this instead
order = $("#sitestructure-form"). serializeObject();
Исправлено следующим образом:
$.ajax({
type: 'POST',
url: 'ajax-process.php?',
data: $("#sitestructure-form").serialize() + "&action=sitemap-reordernavigation",
success: function(d){$("#structureupdate").html(d);}
});