Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   На срабатывает ajax в модуле обратной связи (https://javascript.ru/forum/misc/62098-na-srabatyvaet-ajax-v-module-obratnojj-svyazi.html)

Ingener 24.03.2016 14:10

На срабатывает ajax в модуле обратной связи
 
Здравствуйте, пишу простенький модуль к joomla 3, вот код аякс, но он коробит шаблон при отправке и копирует форму

смотрите здесь tur-3d.ru

Код:

jQuery(document).ready(function($) {
        jQuery("#form").submit(function(event) {
    event.preventDefault();
                var str = $(this).serialize();
                $.ajax({
                        type: "POST",
                        url: "/index.php",
                        data: str,
                        success: function(data) {
                    // Вывод текста результата отправки
                $(result).html(data);
            },
            error: function (jqXHR, text, error) {
                // Вывод текста ошибки отправки
                $(result).html(error);
                }
                });
        });
});


Ingener 24.03.2016 14:13

Что здесь не так? по моему где то внизу!

ГОТОВ ЗАПЛАТИТЬ за помощь, немного, но все же.

Надо поправить код чтобы не вставлял страницу в страницу и выводил сообщения php обработчика.

laimas 24.03.2016 15:49

Цитата:

Сообщение от Ingener
о он коробит шаблон при отправке и копирует форму

Если речь о выдаче кода, который следует после обработчика приема формы, то значит нет завершения работы скрипта после ответа клиенту.

Ingener 24.03.2016 16:08

Поправьте пожалуйста код если не сложно

речь идет о ajax скрипте или php скрипте?

laimas 24.03.2016 16:31

Какой код, JS? Там править нечего не он виновник.

Кратко:

индексный файл, собственно, это может быть солянка из подключаемых файлов и шаблонов, но в любом случае это результирующий html-код страницы. Если асинхронный запрос обращается к индексному файлу, то обрабатывать этот запрос (или подключать файл обработчик его) нужно до любого вывода в браузер, то есть в самом начале. После того как все операции обработчиком будут выполнены и отправлен ответ клиенту, обязательно выход - exit; В противном случае клиенту будут отправляться все, что выполняется на этой странице.

Так понятно?

Ingener 24.03.2016 17:28

понятно то понятно но как это победить? я так понял что тут виноват пхп файл модуля, отвечающий за обработку

<?php
// No direct access
defined( '_JEXEC' ) or die;

$url = JURI::current();

$post = (!empty($_POST)) ? true : false;
if($post) {
	$email = $_POST['email'];
	$name = $_POST['name'];
	$email = $_POST['email'];
	$tel = $_POST["tel"];
	$message = $_POST['message'];
	$error = '';
	if(!$name) {$error .= 'Укажите свое имя. ';}
	if(!$email) {$error .= 'Укажите электронную почту. ';}
	if(!$tel) {$error .= 'Укажите тему обращения. ';}
	if(!$message || strlen($message) < 1) {$error .= 'Введите сообщение. ';}
	if(!$error) {
		$address = "homelux@yandex.ru";
		$mes = "Имя: ".$name."\n\nТема: " .$tel."\n\nСообщение: ".$message."\n\n";
		$send = mail ($address,$tel,$mes,"Content-type:text/plain; charset = UTF-8\r\nFrom:$email");
		if($send) {echo 'OK';}
	}
	else {echo '<div class="err">'.$error.'</div>';}
}
?>
<div class="module<?php echo $moduleclass_sfx; ?>">
<form id="contact" action="" method="post">
<H3>Форма обратной связи</H3>
<div id="note"></div>
<div id="fields">
	<p><input type="text" name="name" id="author" placeholder="Имя"> <label for="author">Как вас зовут</label></p>
	<p><input type="email" name="email" id="email" placeholder="E-mail"> <label for="email">Электронная почта</label></p>
	<p><input type="text" name="tel" id="url" placeholder="Тема"> <label for="url">Тема сообщения</label></p>
	<p><textarea name="message" cols="1" rows="10" id="comment" style="width:98%" placeholder="Введите сюда текст сообщения"></textarea></p>
	<p><button type="submit" id="submit" class="go">Отправить сообщение</button></p>
</div>
</form>
	</div>


Или проще тогда может сделать вывод не сообщений обработчика, а вывод сообщений самого аякса? а валидацию полей плагином сделать

Ingener 24.03.2016 17:29

если поможешь решить проблему 150 руб твои

laimas 25.03.2016 06:19

Если так:

defined( '_JEXEC' ) or die;

то на клиенте должно быть так:

success: function(data) { 
    if(!!data) $(result).html(data); // Вывод текста результата отправки
    else alert('Мол фигушки вам'); //нельзя оставлять клиента в неведении
}


Это $post = (!empty($_POST)) ? true : false; полнейшая глупость, ибо empty($_POST) и возвращает булево значение, а ! это всего лишь его инвертирование. Выбросить, и проще:

if(!empty($_POST)) { //или просто if($_POST) ибо это суперглобальный массив, который всегда есть, но пустой, если не было POST запросов 
     //здесь операции
     //а выдача ответа клиенту с выходом!!!
     //if($send) {echo 'OK';} - убрать
     //else {echo '<div class="err">'.$error.'</div>';} - убрать
     //ответ клиенту
     exit(!$error ? 'OK' : '<div class="err">'.$error.'</div>'); 
}


И да, почтовые отправления так не оформляют, читайте рекомендации RFC.

Ingener 25.03.2016 10:15

Привет, сегодня потестю - если пашет бабки твои

Ingener 25.03.2016 10:44

if(!empty($_POST)) {
	$name = $_POST['name'];
	$email = $_POST['email'];
	$tel = $_POST["tel"];
	$message = $_POST['message'];
	$error = '';
	if(!$name) {$error .= 'Укажите свое имя. ';}
	if(!$email) {$error .= 'Укажите электронную почту. ';}
	if(!$tel) {$error .= 'Укажите тему обращения. ';}
	if(!$message || strlen($message) < 1) {$error .= 'Введите сообщение. ';}
	if(!$error) {
		$address = "homelux@yandex.ru";
		$mes = "Имя: ".$name."\n\nТема: " .$tel."\n\nСообщение: ".$message."\n\n";
		$send = mail ($address,$tel,$mes,"Content-type:text/plain; charset = UTF-8\r\nFrom:$email");
			exit(!$error ? 'OK' : '<div class="err">'.$error.'</div>');
	}
}


Так выдает белый лист с надписью ок, прдскажи куда строку с exit ставить?


Часовой пояс GMT +3, время: 21:19.