#php #ajax #json #wordpress #json_encode
С помощью плагина добавляю в WordPress шорткод, который вставляет форму для расчета
на страничку. Серверной частью формы является вот такая функция:
function ajax_calc(){
// Прием и обработка POST запроса
if(isset($_POST['action']) && $_POST['action'] == 'ajax_calc'){
//ширина, экранируем все лишнее, убираем пробелы и заменяем "," на ".", т.к. пользователь
может ввести любой из знаков
$width = str_replace(',','.',trim(htmlspecialchars($_POST['width'])));
//длина
$length = str_replace(',','.',trim(htmlspecialchars($_POST['length'])));
//высота
$height = str_replace(',','.',trim(htmlspecialchars($_POST['height'])));
$m_rul = str_replace(',','.',trim(htmlspecialchars($_POST['m_rul'])));
$k_zap = str_replace(',','.',trim(htmlspecialchars($_POST['k_zap'])));
// возвратим ошибку, если пришедший к нам параметр не число
if(!(float)$width || $width ==''){
echo implode(array('loadmsgerr'=>'Error! Width should be number only!'));
}
elseif(!(float)$length || $length ==''){
echo implode(array('loadmsgerr'=>'Error! Lenght should be number
only!'));
}
elseif(!(float)$height || $height ==''){
echo implode(array('loadmsgerr'=>'Error! Height should be number
only!'));
}
else{
// иначе вернем результат
$Perimeter = ($width + $length) * 2 ; //периметр
$Square = $Perimeter * $height; //площадь боковых поверхностей
// другие вычисления, предобразования...
// возвращаемы массив с данными
$it_test = 10*$k_zap + $m_rul;
$answers = array('S' => $Square, 'P' => $Perimeter, 'it_test' =>
$it_test);
echo json_encode($answers);
}
}
}
А JS при этом вот такой:
jQuery(document).ready(function(){
// ловим клик по кнопке калькулятора
jQuery('#calc #form_calc_id').on('submit', function(e){
jQuery('#calc .result').show().text(ajax_calc_object.loadingmessage);//Обработка...
//AJAX запрос методом POST на указанный url. Тип данных определяем как json
jQuery.ajax({
type: 'POST',
dataType: 'json',
url: ajax_calc_object.ajaxurl,
data: { //принимаем данные из формы в шаблоне
'action': 'ajax_calc', //вызов нашей функции
'width': jQuery('#calc #width').val(),
'length':jQuery('#calc #length').val(),
'height': jQuery('#calc #height').val(),
// 'security': jQuery('#security').val()
'm_rul': jQuery('#pa_м-в-рулоне').text(),
'k_zap': jQuery('#pa_k-zap').text(),
},
success: function(data){
var resperr = data.loadmsgerr;//получаем заначение ошибки
if(!resperr){//если нет ошибок
json.parse(data);
jQuery('#calc .result').html(data.S + data.P); //вставляем в
тег с классом .result полученный ответ
jQuery('#Обои').val();
}
else{
jQuery('#calc .result').text(resperr); //или туда же выводим ошибку
}
},
error: function(xhr, textStatus, errorThrown) {//обработка и вывод в
консоль ошибок
if (xhr.status != 0) {
var msg = ' (' + xhr.status + ') ';
if (textStatus) msg += ': ' + textStatus;
if (xhr.status < 200) {
msg = 'AJAX Informational ' + msg;
} else if (xhr.status < 300) {
msg = 'AJAX Success ' + msg;
} else if (xhr.status < 400) {
msg = 'AJAX Redirection ' + msg;
} else if (xhr.status < 500) {
msg = 'AJAX Client Error' + msg;
} else {
msg = 'AJAX Server Error' + msg;
}
console.log(msg);
} else {
console.log(errorThrown);
}
}
});
e.preventDefault();
});
});
Проблема в том, что это все не выводит ничего на страничку.
В консоль пишется ошибка
AJAX Success (200) : parsererror
А в переданных от функции данных я вижу строчку
{"S":"","P":"","it_test":"19"}0
Так вот, я подозреваю, что вся проблема именно вот в этом 0 в конце json строки.
Но вот откуда он там берется - не понимаю вообще. Может кто знаком с механизмом?
Ответы
Ответ 1
Чтобы не получать нуля в конце ajax-ответа, в самом конце функции ajax_calc() вызывайте wp_die()
Комментариев нет:
Отправить комментарий