24.10.2018, 01:32
|
Аспирант
|
|
Регистрация: 07.07.2017
Сообщений: 41
|
|
Не могу передать данные из формы в php
Здравствуйте уважаемые, не получается решить простую задачу, мне нужно передать данные полей html-формы в php-скрипт, там обработать и вернуть новые значения. Нужно чтобы страница не перегружалась. Приложение (онлайн конвертер) делаю как плагин для вордпреса, два файла js и php находятся в одной папке. Форма на страницу добавляется шорткодом. У меня кое-что получилось, но скрипт не хочет передавать данные ни в какую, поэтому прошу вашей помощи, ниже код:
Часть php-файла:
//получаем ссылку на файл для html-формы
function request_url()
{
$result = ''; // Пока результат пуст
$default_port = 80; // Порт по-умолчанию
// А не в защищенном-ли мы соединении?
if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS']=='on')) {
// В защищенном! Добавим протокол...
$result .= 'https://';
// ...и переназначим значение порта по-умолчанию
$default_port = 443;
} else {
// Обычное соединение, обычный протокол
$result .= 'http://';
}
// Имя сервера, напр. site.com или www.site.com
$result .= $_SERVER['SERVER_NAME'];
// А порт у нас по-умолчанию?
if ($_SERVER['SERVER_PORT'] != $default_port) {
// Если нет, то добавим порт в URL
$result .= ':'.$_SERVER['SERVER_PORT'];
}
// Последняя часть запроса (путь и GET-параметры).
$result .= $_SERVER['REQUEST_URI'];
// Уфф, вроде получилось!
return $result;
}
add_shortcode('lbkggetfishbychmil', 'lb_kg_getfish');
function lb_kg_getfish($atts) {
wp_enqueue_script('lb-kg-script', plugins_url('lb-kg.js', __FILE__), array('jquery'));
wp_enqueue_style('lb-kg-styles', plugins_url('style.css', __FILE__));
echo '<div class="form-lb-kg">';
echo '<form action="' . request_url() . '" method="POST" id="lbkg_form">';
echo '<fieldset>';
echo '<legend>Онлайн конвертер (фунты & килограммы)</legend>';
echo '<p><input type="kg" id="kg" placeholder="кг"></p>';
echo '<p><input type="lb" id="lb" placeholder="lb"></p>';
echo '<input id="btn_submit" type="button" value="Посчитать" />';
echo '</fieldset>';
echo '</form>';
echo '<div class="messages"></div>';
echo '</div>';
}
if (isset($_POST["kg"])) {
$arr = array('result' => '123456789');
echo json_encode($arr);
}
Файл javascript :
jQuery(document).ready(function($){
$('#btn_submit').click(function(){
//берем из формы метод передачи данных
var m_method=$('#lbkg_form').attr('method');
//получаем адрес скрипта на сервере, куда нужно отправить форму
var m_action=$('#lbkg_form').attr('action');
// отправляем данные
$.ajax({
type: m_method,
url: m_action,
dataType: "json", // тип передачи данных
data: $("lbkg_form").serialize(),
// после получения ответа сервера
success: function(data){
$('.messages').html(data.result); // выводим ответ сервера
}
});
});
});
Прошу помочь разобраться, спасибо
|
|
24.10.2018, 02:01
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
$('#btn_submit').click(function(){ - заменить на
$('#lbkg_form').submit(function(e) {
e.preventDefault();
$.ajax({
type: this.method,
url: this.action,
dataType: "json", // тип передачи данных - это тип ожидаемых данных от сервера
data: $(this).serialize(),
.....
Последний раз редактировалось laimas, 24.10.2018 в 02:24.
|
|
24.10.2018, 19:01
|
Аспирант
|
|
Регистрация: 07.07.2017
Сообщений: 41
|
|
laimas,
спасибо за ответ, изменил как Вы указали, но увы данные не передаются((( не работает
|
|
24.10.2018, 19:17
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Значит не принимаете их должным образом или иные косяки допускаете.
PS. Если асинхронный запрос производится к тому же файлу, что порождает форму, то прием этого запроса должен быть самым первым в структуре кода. Так как показано:
вывод формы
затем
if (isset($_POST["kg"])) {
$arr = array('result' => '123456789');
echo json_encode($arr);
}
это ошибка, не должно быть до и после ответа в формате json никаких выводов в браузер. Меняйте структуру кода.
Последний раз редактировалось laimas, 24.10.2018 в 19:22.
|
|
24.10.2018, 19:24
|
Аспирант
|
|
Регистрация: 07.07.2017
Сообщений: 41
|
|
выше в коде описано как я проверяю наличие переменной, вот повторю:
if (isset($_POST["kg"])) {
$arr = array('result' => '123456789');
echo json_encode($arr);
}
|
|
24.10.2018, 19:29
|
|
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 641
|
|
надо посмотреть в консоле разработчика, в разделе "сеть", что отправилось, и что принялось.
|
|
24.10.2018, 22:31
|
Аспирант
|
|
Регистрация: 07.07.2017
Сообщений: 41
|
|
в консоли нечего не передается, пробовал и на локальном пк (open server) и на хостинге, вот загрузил на хостинг http://muz-bar.ru/zemfira-poobeshhal...vyj-albom.html
в исходном коде подключается правильно, после jQuery
<script type='text/javascript' src='http://muz-bar.ru/wp-includes/js/jquery/jquery.js?ver=1.12.4'></script>
<script type='text/javascript' src='http://muz-bar.ru/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script>
<script type='text/javascript' src='http://muz-bar.ru/wp-content/plugins/lb-kg/lb-kg.js?ver=4.9.8'></script>
Последний раз редактировалось Chmil, 24.10.2018 в 22:36.
|
|
24.10.2018, 23:25
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Chmil
|
выше в коде описано как я проверяю наличие переменной
|
Нельзя так проверить передачу в json формате, ибо клиент в вашем случае JSON не получает! А JQ его явно ожидает, что вы ему предписали, и не получив из ответа json, вернет в success пустую data. Если вы не проанализируете другие параметры функции success, то даже знать не будете, что произошла ошибка.
Выбрасывайте из своего кода строки с 1 по 32, что это, зачем, в общем пока эта абракадабра не нужна. Будем считать, что далее в коде будет нормальный вызов функции lb_kg_getfish и клиент получит форму. Если вы проверяете получение формы тут же, то значит и запрос клиента к этому файлу. В этом случае структура кода на сервере может быть только такой для JSON (для запроса самой себя она всегда должна быть такой, а для json тем более):
if($_POST) { //можно проверить действительно ли асинхронный запрос и т.п.
ответ клиенту и обязательный exit
}
далее код обрабатывающий GET запрос - формирование страницы и вывод ее, собственно форма.
Ищите у себя косяки, ибо если я простой тестовый код со структурой описанной напишу, то он будет работать на все 100.
|
|
24.10.2018, 23:46
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
А на клиенте запроса вообще нет, хотя обработчик установлен.
|
|
25.10.2018, 01:07
|
Аспирант
|
|
Регистрация: 07.07.2017
Сообщений: 41
|
|
немного поправил код (ниже выкладываю полностью 2 файла), но он также не рабочий (((. В JS я не силен, поэтому обратился к Вам за помощью и исходя из выше изложенного есть вопросы, заранее извините если они слишком элементарны:
Цитата:
|
Нельзя так проверить передачу в json формате, ибо клиент в вашем случае JSON не получает!
|
почему нельзя проверить переменную на существование и если она существует выполнить определенный код?
$arr = array('result' => '123456789');
echo json_encode($arr);
ето не формирование JSON ответа?
Цитата:
|
Если вы не проанализируете другие параметры функции success
|
я думал что ето масив $arr = array('result' => '123456789'); и он же и есть ответ клиенту
строка add_shortcode('lbkggetfishbychmil', 'lb_kg_getfish'); добавляет шорткод - lbkggetfishbychmil, который потом используется для вставки формы и ответа в запись.
Цитата:
|
ответ клиенту и обязательный exit
|
зачем exit?
Цитата:
|
далее код обрабатывающий GET запрос
|
для чего? я ж не использую GET запросы
Ниже выкладываю 2 файла полностью, они размещены в папке плагинов wordpress - /wp-content/plugins/lb-kg/ . Для вызова формы в самой записи, например как тут http://muz-bar.ru/zemfira-poobeshhal...vyj-albom.html нужно сначала в админке вордпрес активировать данный плагин, а потом во время редактирования записи вставить в нее шорткод в таком формате [lbkggetfishbychmil]. Все работает кроме скрипта отправки данных полей формы на JS.
php-файл:
<?php
/*
* Plugin Name: Lb & Kg
* Description: Перевод веса фунтов в килограммы и наоборот
* Author: Chmil
* Version: 1.0
*/
add_shortcode('lbkggetfishbychmil', 'lb_kg_getfish');
function lb_kg_getfish($atts) {
wp_enqueue_script('lb-kg-script', plugins_url('lb-kg.js', __FILE__), array('jquery'));
wp_enqueue_style('lb-kg-styles', plugins_url('style.css', __FILE__));
echo '<div class="form-lb-kg">';
echo '<form action="' . plugins_url('lb-kg/lb-kg.php') . '" method="POST" id="lbkg_form">';
echo '<fieldset>';
echo '<legend>Онлайн конвертер (фунты & килограммы)</legend>';
echo '<p><input type="kg" id="kg" placeholder="кг"></p>';
echo '<p><input type="lb" id="lb" placeholder="lb"></p>';
echo '<input id="btn_submit" type="button" value="Посчитать" />';
echo '</fieldset>';
echo '</form>';
echo '<div class="messages"></div>';
echo '</div>';
}
if (isset($_POST["kg"])) {
//добавил чтобы увидеть передаются ли данные
$file = "text.txt";
if (!file_exists($file)) {
$fp = fopen($file, "w");
fwrite($fp, $_POST["kg"]);
fclose($fp);
}
$arr = array('result' => '123456789');
echo json_encode($arr);
}
?>
js-файл:
jQuery(document).ready(function($){
$('#lbkg_form').submit(function(e) {
e.preventDefault();
$.ajax({
type: this.method,
url: this.action,
dataType: "json", // тип передачи данных - это тип ожидаемых данных от сервера
data: $(this).serialize(),
// после получения ответа сервера
success: function(data){
$('.messages').html(data.result); // выводим ответ сервера
}
});
});
});
Последний раз редактировалось Chmil, 25.10.2018 в 01:12.
|
|
|
|