07.02.2018, 23:21
|
Интересующийся
|
|
Регистрация: 27.01.2018
Сообщений: 29
|
|
Про JS я имел ввиду следующее:
$('.btn').click(function(){
locatio[/CSS]n.href = '#openModal';
});
при нажатии на кнопку, открывается страница по адресу - http://f0184040.xsph.ru/#openModal
Мне было интересно, можно ли вместо нажатия на кнопку, поставить проверку на обращение к файлу forms.php. То есть, когда человек заполняет форму обратной связи и нажимает "отправить", он же обращается к файлу form.php, который генерирует письмо и отправляет его на почту?
Судя по мануалу - http://php.net/manual/ru/function.header.php сделал вывод, что header('location... должен быть в самом вверху, а если установить его сверху и прописать exit;, то получается что дальше выполняться код не будет и сообщение не сгенерируется? А мне нужно, чтобы было отправлено сообщение и тому, кто отправил получил сообщение о том, что его заявка отправлена, а сообщение это можно получить по ссылке - http://f0184040.xsph.ru/#openModal
Последний раз редактировалось xlebosolniy, 07.02.2018 в 23:26.
|
|
07.02.2018, 23:48
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от xlebosolniy
|
сделал вывод, что header('location... должен быть в самом вверху, а если установить его сверху и прописать exit;, то получается что дальше выполняться код не будет и сообщение не сгенерируется?
|
Не обязательно в самом верху ведь может потребоваться передача заголовка и по условию в коде, но обязательно передача его должна быть до любого вывода в браузер.
Что касается сообщений. JS код показанный, это просто вывод панели сообщений. А форма отправляется естественным образом, то есть пользователь будет направлен на другую страницу, если action формы не является адресом текущей страницы.
В момент отправки формы нельзя тоже выдать сообщение, хотя отправку формы можно и задержать на время достаточное для прочтения сообщения. Просто на этот момент еще не известно примет ли сервер форму.
Заставить клиента показать сообщение, что форма принята, сервером можно, но так как это не асинхронная отправка формы, то это будет перенаправление пользователя, пусть даже на эту же страницу. Но в этом случае надо:
- запомнить данные формы
- обеспечить задержку перенаправления после прочтения пользователем сообщения (это не сложно сделать перенапраяляя через мета тег)
- после перенаправления обработать форму
Но ведь данные формы еще надо и проверить, а не так как у вас, и если будут ошибки ввода, это значит надо возвращать форму пользователю и с ошибками.
И так пока не будет ошибок. После этого отправить почту, опять куда-то перенаправить и выдать сообщение последнее.
Но как и кто должен определить текст сообщений если сервер просто заставляет клиента через хеш открывать панель?
Неужели так важно при получении формы выдать что она получена, чтобы столько скакать по страницам? Отправляйте форму асинхронным запросом, тогда и ошибки заполнения, и что форма принята, все это будет без перезагрузки страницы, и уже только после отправки почты одно перенаправление (но клиентом) с выдачей "ждите...".
И почитайте о формировании почтовых отправлений, такого - "From:admin", "Reply-To: Заявка", не может быть.
Последний раз редактировалось laimas, 07.02.2018 в 23:56.
|
|
08.02.2018, 00:00
|
Интересующийся
|
|
Регистрация: 27.01.2018
Сообщений: 29
|
|
так никто и не прыгает по страницам вроде) форма проверяется на ошибки, а перенаправление всего одно, чтобы открыть модальное окно. Ладно, буду разбираться, спасибо)
|
|
08.02.2018, 00:16
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от xlebosolniy
|
а перенаправление всего одно
|
Значит я запутался в описании .
Ну тогда так (без Ajax):
пришла форма - проверяем ошибки ввода и что прислали, обязательно, это:
$name=$_POST['name'];
$phone=$_POST['phone'];
$email=$_POST['email'];
$service=$_POST['service'];
....
не проверка, а рассадник спама или еще страшнее.
Если есть ошибки, страница forms.php выводит опять форму, но с заполненными полями и с сообщениями об ошибках.
А в самом конце, после отправки почты перенаправление на индексную страницу с хеш указанным - header(). Вот только где и как определяется текст ... Если панель присутствует уже на странице и с текстом, а скрипт ее вызывающий просто отображает ее, тогда можно текст на индексной странице определить через сессию.
|
|
08.02.2018, 00:52
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Ну если это окошко для вывода только одного этого сообщения тогда нет проблемы с текстом.
Я же писал как, вот такая логика у скрипта должна быть:
проверка формы
если есть ошибки возврат формы и ошибок
иначе - отправка почты и перенаправление на указанный адрес.
Проблемы как конкретно реализовать это?
|
|
08.02.2018, 01:27
|
Интересующийся
|
|
Регистрация: 27.01.2018
Сообщений: 29
|
|
Проверяется несколько пунктов, которые должны быть обязательные, если содержат ошибки или не заполнены- возврат. В данный момент мне нужно конкретно после отправки формы выводить это сообщение http://f0184040.xsph.ru/#openModal
С этим я мучаюсь уже второй день, поэтому если где-то даже есть косяки, которые не влияют на вывод этого текста, то хотелось бы сначала сделать текст, а потом уже все остальное разгребать)
пытался делать вот так:
if (mail($to, $subject, $msg, implode("\r\n", $headers) ))
{
//////////////////////////////////////////////
$txt="$name,$phone,$email";
$fp = fopen("mail.txt", "a+");
$fw = fwrite($fp, $txt);
fclose($fp);
/////////////////////////////////////////////
echo "location.href = '#openModal'";}
else { echo "False"; }
что перенаправить или хотя бы вывести текст через алерт
Есть одна форма у меня:
if(@mail($sendto, $subject, $msg, $headers)) {
echo "<script>alert('Заявка успешно отправлена. Ожидайте звонка в указанное Вами время.'); location.href='index.html';</script>";
} else {
echo "<center><img src='images/ne-otpravleno.png'></center>";
}
Которая после удачной отправки выдает текст и перезагружает страницу, вот по такому принципу пытался сделать и в этой форме)
по поводу header('Location:... тоже ничего не понял, где бы не разместил его, все равно никуда не перенаправляется)
|
|
08.02.2018, 09:38
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от xlebosolniy
|
Проверяется несколько пунктов, которые должны быть обязательные, если содержат ошибки или не заполнены- возврат.
|
Где это? if (!empty($name)) {$msg =$msg."\nИмя: ".$name;} - это что-ли проверка? Пробел переданный полем уже не является пустым значением. Если так проверять данные извне, я могу вам гарантировать, что превращу ваш домен в рассадник спама.
$post = array_map('trim', $_POST);
Только после этого можно проверить пусто ли значение $post['name']. А в поле адреса не должно быть лишнего. И формирование самой отправки никуда не годится. Например тему сообщения нужно кодировать, на нее не распространяется заголовок указывающий кодировку. Читайте, в интернете об этом столько написано, что читать и не перечитать.
У вас форма отдается клиенту на другой странице, и страница form.php в случае ошибки должна возвращать форму. Из этого следует, что форму удобно иметь в виде подключаемого шаблона и с учетом заполнения. То есть, в html шаблоне формы должны быть php вставки:
<input type="text" class="form-control" name="name" value="<?=htmlspecialchars($name)?>" placeholder="Контактное лицо" required>
и т.д. При подавлении вывода предупреждений (а на севере это должно быть так), на первой странице при подключении шаблона формы php-переменные будут раны null. А на странице form.php они определены и при ошибках, и подключении формы для возврата пользователю, поля форы будут заполнены данными введенными пользователем.
Логика кода:
if(@mail($sendto, $subject, $msg, $headers)) {
echo "<script>alert('Заявка успешно отправлена. Ожидайте звонка в указанное Вами время.'); location.href='index.html';</script>";
} else {
echo "<center><img src='images/ne-otpravleno.png'></center>";
}
вообще не понятна, вернее тут полное отсутствие логики. Никаких собачек для подавления функции mail не нужно, эта функция не отправляет почту, она только отдает сформированное отправление sendmail, и возвращает только true/false, в зависимости от того принял ли sendmail почту для отправки или нет.
Весь этот код заменим на:
header('location:/index.php#openModal');
А так как это последнее по логике в коде, значит exit можно не выполнять. В данном случае переход решает и проблему повторной отправки формы по F5.
Если у вас нет перенаправления, то структура кода, логика ее, у вас неверна.
Последний раз редактировалось laimas, 08.02.2018 в 10:55.
|
|
08.02.2018, 12:45
|
Интересующийся
|
|
Регистрация: 27.01.2018
Сообщений: 29
|
|
Я опять запутался.
Вот у меня сейчас вот так:
if (mail($to, $subject, $msg, implode("\r\n", $headers) ))
{
$txt="$name,$phone,$email
";
$fp = fopen("mail.txt", "a+");
$fw = fwrite($fp, $txt);
fclose($fp);
echo "Отправляется...";}
else { echo "False"; }
Это нужно заменить на header('location:/index.php#openModal'); ?
Или вот так (и правильно ли вообще):
if(mail($to, $subject, $msg, implode("\r\n", $headers) ))
{
$txt="$name,$phone,$email
";
$fp = fopen("mail.txt", "a+");
$fw = fwrite($fp, $txt);
fclose($fp);
echo header('location:/index.php#openModal'); }
else { echo "False"; }
|
|
08.02.2018, 13:13
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
А зачем писать $name,$phone,$email в файл, да еще таким образом задавать строку? Так и задавать - $txt=$name, $phone, $email; или через точку. Что базы нет?
echo "Отправляется...", это бесполезное, ибо никакого отправления вы не получите, отправление отдано sendmail, все, перенаправление. Но если обрабатывать непринятие почтового отправления, то так:
if(mail(...)) {
//какой-то код
header('location:/index.php#openModal'); //это передача заголовка, никаких echo header быть не может
//и учтите, что указывается относительный путь и он должен быть правильным
} else {
echo 'Ошибка отправления почты, попробуйте повторить позже.'
//если не было ошибок приема формы, то есть форма не подключалась, то подключить, иначе пользователь не сможет повторить отправление
if(!$error) include 'form.htm';
}
Последний раз редактировалось laimas, 08.02.2018 в 16:50.
|
|
|
|