Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.10.2018, 01:32
Аспирант
Отправить личное сообщение для Chmil Посмотреть профиль Найти все сообщения от Chmil
 
Регистрация: 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); // выводим ответ сервера
					}
				});
			});
		});


Прошу помочь разобраться, спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 24.10.2018, 02:01
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

$('#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.
Ответить с цитированием
  #3 (permalink)  
Старый 24.10.2018, 19:01
Аспирант
Отправить личное сообщение для Chmil Посмотреть профиль Найти все сообщения от Chmil
 
Регистрация: 07.07.2017
Сообщений: 41

laimas,
спасибо за ответ, изменил как Вы указали, но увы данные не передаются((( не работает
Ответить с цитированием
  #4 (permalink)  
Старый 24.10.2018, 19:17
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Значит не принимаете их должным образом или иные косяки допускаете.

PS. Если асинхронный запрос производится к тому же файлу, что порождает форму, то прием этого запроса должен быть самым первым в структуре кода. Так как показано:

вывод формы
затем

if (isset($_POST["kg"])) {

$arr = array('result' => '123456789');

echo json_encode($arr);

}

это ошибка, не должно быть до и после ответа в формате json никаких выводов в браузер. Меняйте структуру кода.

Последний раз редактировалось laimas, 24.10.2018 в 19:22.
Ответить с цитированием
  #5 (permalink)  
Старый 24.10.2018, 19:24
Аспирант
Отправить личное сообщение для Chmil Посмотреть профиль Найти все сообщения от Chmil
 
Регистрация: 07.07.2017
Сообщений: 41

выше в коде описано как я проверяю наличие переменной, вот повторю:
if (isset($_POST["kg"])) {	
	
	$arr = array('result' => '123456789');
	
	echo json_encode($arr);
	
}
Ответить с цитированием
  #6 (permalink)  
Старый 24.10.2018, 19:29
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

надо посмотреть в консоле разработчика, в разделе "сеть", что отправилось, и что принялось.
Ответить с цитированием
  #7 (permalink)  
Старый 24.10.2018, 22:31
Аспирант
Отправить личное сообщение для Chmil Посмотреть профиль Найти все сообщения от Chmil
 
Регистрация: 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.
Ответить с цитированием
  #8 (permalink)  
Старый 24.10.2018, 23:25
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Chmil
выше в коде описано как я проверяю наличие переменной
Нельзя так проверить передачу в json формате, ибо клиент в вашем случае JSON не получает! А JQ его явно ожидает, что вы ему предписали, и не получив из ответа json, вернет в success пустую data. Если вы не проанализируете другие параметры функции success, то даже знать не будете, что произошла ошибка.

Выбрасывайте из своего кода строки с 1 по 32, что это, зачем, в общем пока эта абракадабра не нужна. Будем считать, что далее в коде будет нормальный вызов функции lb_kg_getfish и клиент получит форму. Если вы проверяете получение формы тут же, то значит и запрос клиента к этому файлу. В этом случае структура кода на сервере может быть только такой для JSON (для запроса самой себя она всегда должна быть такой, а для json тем более):

if($_POST) { //можно проверить действительно ли асинхронный запрос и т.п.
ответ клиенту и обязательный exit
}

далее код обрабатывающий GET запрос - формирование страницы и вывод ее, собственно форма.

Ищите у себя косяки, ибо если я простой тестовый код со структурой описанной напишу, то он будет работать на все 100.
Ответить с цитированием
  #9 (permalink)  
Старый 24.10.2018, 23:46
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

А на клиенте запроса вообще нет, хотя обработчик установлен.
Ответить с цитированием
  #10 (permalink)  
Старый 25.10.2018, 01:07
Аспирант
Отправить личное сообщение для Chmil Посмотреть профиль Найти все сообщения от Chmil
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передать данные со ссылки в input type hidden j0hnik Общие вопросы Javascript 7 29.12.2016 15:05
Передать элементы php массива в js переменную zav Элементы интерфейса 3 22.11.2016 14:35
Как подключить данные с PHP по средствам JS на удаленный сервер. Nyam Элементы интерфейса 13 11.04.2014 17:14
Как вывести данные из PHP Sherminator Events/DOM/Window 2 07.08.2012 20:11
Не могу передать скриптом значение формы youko Элементы интерфейса 1 06.07.2009 19:52