вопрос по форме обратной связи

12 3
avatar2020
На сайте с 12.01.2017
Offline
23
1743

Коллеги, такой вопрос. Делаю форму обратной связи на лендинге. Использую язык РНР.

Вот такой код:


<form method="post" action="/scripts/send.php">
... ... ...
</form>

Вопрос: когда посетитель заполняет форму, нажимает кнопку "отправить", получается форма передаёт управление указанному выше РНР-скрипту (обработчику формы). Однако, вопрос в том, что указанный РНР-скрипт с помощью соответствующей функции mail() отправляет введённую в форму информацию владельцу сайта на его личную электронную почту. При этом, в конце работы скрипта форма обновляется и мне выводит именно новую страницу на экран браузера "send.php". А мне бы хотелось, чтобы страница оставалась прежней, то есть той, с которой эта форма и была отправлена...

Извините, если немного запутанно пояснил, но суть вот в чём: нормально ли такое поведение скрипта-обработчика формы обратной связи, когда в конце своей работы этот скрипт возвращает сам себя на вывод в браузер? Или это у меня какой-то косяк в самом скрипте?

---------- Добавлено 09.02.2018 в 08:25 ----------

Иными словами, страница обновляется и показана пустая страница обработчика "send.php". А мне бы хотелось, чтобы страница оставалась прежней, то есть, именно та, с которой и была заполнена эта форма. Где-то таким вот образом.

tommy-gung
На сайте с 22.11.2006
Offline
260
#1

редирект обратно

ajax

фрейм

Здесь не могла быть ваша реклама
avatar2020
На сайте с 12.01.2017
Offline
23
#2

Вот, кстати говоря, открыл сайт-справочник по CSS от Влада Мержевича. Вот что там написано по поводу атрибута "action" у тега "form":

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

Иными словами, ключевая фраза тут "...после выполнения обработчиком действий по работе с данными формы он возвращает новый HTML-документ..."

То есть, видимо, я не ошибся всё-таки в том, что это поведение РНР-скрипта по умолчанию - это именно возвращать новый HTML-документ. В моём случае этот документ является пустым, поскольку кроме самого РНР-скрипта (обработчика формы), в этом документе более ничего нет. Вот он после отправки формы и возвращается мне в браузер, тем самым сайт пропадает и вместо него белый фон и всё, поскольку РНР-скрипт не виден в браузере... Вот таким образом...

---------- Добавлено 09.02.2018 в 10:00 ----------

Кстати говоря, по поводу редирека обратно, как было написано коллегой выше. Я так думаю, в РНР-скрипте в самом конце кода скрипта можно прописать вывод редиректа через заголовок такого типа, сразу послу функции отправки почты:

mail("admin@mysite.com", "Новый заказ", $message, $headers);

header("Location: http://www.mysite.com/form.php");

Вот где-то таким образом. Правильно?

---------- Добавлено 09.02.2018 в 10:15 ----------

Коллеги, мысль проскользнула в голове по поводу этой ситуации!

А может, мне пойти другим путём:


<?php include "scripts/send.php"; ?>

<form method="post" action=" ">
... ... ...
</form>

То есть, я просто инклудю этот внешний скрипт на странице формы, до самой формы, чтобы он успел подгрузиться. После этого в атрибуте "action" формы я оставляю поле пустым, чтобы форма вызвала сама себя. Таким образом, поскольку сайт у меня на РНР (файл "form.php"), страничка запускается, интерпретатор РНР проходит по странице, видит перед формой подключение внешнего РНР-скрипта, вставляет этот скрипт на страницу и уже потом считывает HTML-код самой формы.

Затем, посетитель сайта заполняет эту форму, нажимает "Отправить", - поскольку атрибут "action" пустой, то страница вызывает сама себя (перезагружается), интерпретатор инклудит внешний РНР-скрипт до начала кода самой формы и, соответственно, отправляет данные заполненной формы на указанную почту владельцу сайта.

Я всё попробовал, как описал выше, всё отлично отрабатывает.

Как думаете, оставить такой вариант? Или всё-же нужно прописать (заполнить) атрибут "action"? Просто меня несколько смущает тот момент, что он у меня вообще пустой при таком раскладе. Может, хоть относительный адрес самой формы туда прописать (то есть, в форме ссылка на саму форму). Исключительно для того, чтобы этот атрибут не был пустым.

Простите за такое количество текста, просто пытаюсь разобраться с данным вопросом.

_
На сайте с 24.03.2008
Offline
357
#3

Вариант с ajax чем не устраивает ?

LH
На сайте с 26.09.2013
Offline
89
#4

form.php

handler.php

На форму вешаешь событие с e.preventDefault() и парсишь строки, отправляя далее полученные значения post/get запросом на handler.php, в котором ты и будешь работать с ними.

S
На сайте с 13.10.2014
Offline
148
#5
_SP_:
Вариант с ajax чем не устраивает ?

Подозреваю, что для ТС (который плавает в таких простых вещах как редирект и get/post) Аякс и прочий джейсон, будет языком планеты Нибиру.

...

хотя, имхо, аякс был бы просто идеальным решением этой проблемы

paveldvlip
На сайте с 16.01.2007
Offline
155
#6
avatar2020:
Как думаете, оставить такой вариант? Или всё-же нужно прописать (заполнить) атрибут "action"?

Оставляйте так. Это абсолютно нормально. Пустой action отправляет данные на этот же адрес. Можно ещё разделить GET и POST, поставив

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

// Обработка формы
}
А здесь сама форма.
TopSite (/ru/forum/comment/15645635) - программа определения позиций сайта, массовой проверки всех видов частотности, сбора позиций конкурентов и кластеризации запросов. HTML-отчёты.
avatar2020
На сайте с 12.01.2017
Offline
23
#7
paveldvlip:
Оставляйте так. Это абсолютно нормально. Пустой action отправляет данные на этот же адрес. Можно ещё разделить GET и POST, поставив

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Обработка формы
}
А здесь сама форма.

Спасибо огромное за ваш комментарий, по сути и без издёвок, как порой бывает. Отдельно спасибо за мысль разделить GET и POST, действительно отличная идея, нужно будет поразмыслить...

Тут вверху говорили, что для меня Ajax - это как полёт на планету Нибиру. Ну чтож, спасибо, хоть дальше меня не "послали" :)

---------- Добавлено 09.02.2018 в 15:35 ----------

Кстати говоря, я разделю GET и POST в самом РНР-обработчике формы, который затем проинклудю в коде перед самой формой, вот таким примерно образом.


/* Файл handler.php */

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Обработка формы, отправка полученных данных на почтовый ящик владельца сайта
}

Далее, подключаю вышеуказанный файл-обработчик формы к основной странице сайта:


/* Файл form.php */

<?php include_once "scripts/send.php"; ?>
<form method="post" action="">
... ... ...
</form>

При этом атрибут "action" у формы оставляю полностью пустым, тем самым форма вызывает сама себя. Хотя, по правде сказать, на этот случай я уже встречал такое вот решение, чтобы атрибут "action" не оставлять пустым, а скажем так, сделать более элегантное решение:


<form method="post" action=" <?php echo $_SERVER['REQUEST_URI']; ?> ">
... ... ...
</form>

Но по своей сути - это одно и то-же, потому наверное просто оставлю атрибут "action" пустым и не буду переживать по данному вопросу...

S
На сайте с 13.10.2014
Offline
148
#8

2 ТС

AJAX решение

JS


<script type="text/javascript">
$(document).ready(function(){

/*
** Очистка формы
*/
function cleanCallForm()
{
$('form input[type="text"]').val('');
$('form input[type="email"]').val('');
$('form input[type="phone"]').val('');
$('form textarea').val('');
}

/*
** Обработчик передачи и приема
*/
function sendCallForm()
{
var formData = $('form').serialize();

$.ajax({
url: '/json/callForm.php', /* <-- адрес к обработчику */
type: 'POST',
data: formData,

/* -transmit succes - */
success: function(data, textStatus, jqXHR)
{
/* -transmit succes data error - */
if (data.status == 'error')
{
alert(data.errors);
}

/* -transmit succes data succes - */
if (data.status == 'ok')
{
alert('Спасибо за ваше сообщение.');
cleanCallForm();
}
},

/* - transmit error - */
error: function(jqXHR, textStatus, errorThrown)
{
alert('Ой, кажется что-то пошло не так! Произошла ошибка :' + '<b>' + jqXHR.status+':'+jqXHR.statusText +'</b><br/> Обратитесь к администраторам с информацие об ошибке. Они вам помогут');
}
});
}
<!-- // -->


/* submit action */
$('form').bind('submit',function(e){
sendCallForm();
return false;
});

})
</script>

Серверная часть

выдача ответа

<?php 
$content_error = array('status'=>'error','errors'=>'описание ошибки');
$content_ok = array('status'=>'ok');

header("Content-type: application/json");
print json_encode($content_ok);
// или
// print json_encode($content_error);
avatar2020
На сайте с 12.01.2017
Offline
23
#9

silicoid

Спасибо вам большое, буду далее разбираться.

PS. Всем ответившим - большая благодарность!

MS
На сайте с 19.01.2018
Offline
5
#10

https://habrahabr.ru/sandbox/93363/ - просмотрите, готовое простое решение. С объяснениями и комментариями

3 месяца хостинга бесплатно (https://enjoyweb.net/3-months-of-hosting-from-mchost/)
12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий