Создание своего сайта на Processwire по шагам. Подключение формы обратной связи. Урок 7
В этом уроке мы подключим форму обратной связи - последнюю страницу из нашего шаблона. Для этих целей я создал в папке шаблонов файл contact.php и скопировал туда div с уникальной частью содержимого из файла contact.html. Не забываем задать этому блоку идентификатор id="main-content". В итоге у меня получилось следующее:
Вкратце опишу последовательность действий, если кто забыл: создаём шаблон в админке, привязываем к нему файл, а далее создаём страницу и уже к ней привязываем шаблон.
И если всё сделано правильно, то страница отобразится в меню и кликнув по ней, вы попадёте на страницу, которая будет выглядеть примерно следующим образом:
Однако, этого всё ещё недостаточно для того, чтобы сделать форму работоспособной. Сперва нам будет необходимо прописать полям формы атрибут name, который является своего рода идентификатором, по имени которого и будет в дальнейшем происходить обращение к полям формы. Кроме того, поскольку отправка формы будет производиться с помощью метода POST, я так же добавил тэгу form атрибут method.
В скриншоте ниже я выделил код, который добавил в HTML код формы:
Собственно, этих данных уже достаточно для того, чтобы отправлять данные формы. Теперь осталось лишь написать обработчик, который будет обрабатывать данные и отправлять их на почту. Поскольку у самой формы нет атрибута action, то все данные по умолчанию будут отправляться на текущую страницу. А это значит, что мы в этом же файле и напишем код, который будет заниматься обработкой данных. Сделать это можно так:
<? $contactFormRecipient = 'ваш почтовый адрес'; $contactPageID = '1033'; // ID страницы, на которую будет происходить переадресация if ($input->post->name) { $message = ' <p>Пришло письмо от '.$input->post->name.' со следующими контактными данными:</p> <p>Телефон: ' . $input->post->phone . '</p> <p>Email: ' . $input->post->email . '</p> <p>Текст сообщения: ' . $input->post->message . '</p> '; $mail = wireMail(); $mail->to($contactFormRecipient) ->from($input->post->email) ->subject('Contact form submission') ->bodyHTML($message) ->send(); $session->flashMessage = 'Спасибо за ваше сообщение! Вскоре ожидайте нашего звонка.'; $session->sent = true; $session->redirect($pages->get($contactPageID)->url); } ?>
Остановимся подробнее на самом коде. Поскольку сама страница находится на той же странице, что и форма, то код у нас должен срабатывать только в том случае, когда происходит отправка данных. Как мы можем это проверить? Давайте подумаем.
Метод отправки формы у нас называется POST. А когда происходит отправка данных, они попадают в объект $input->post, в котором уже непосредственно хранятся отправленные значения формы, которые можно получить следующим образом:
$input->post->name
Напомню, что name здесь является значением атрибута name поля формы. Если бы это было поле с телефоном, то обратиться, к нему можно было так:
$input->post->phone
Следовательно, если там у нас находятся какие-то данные, это значит что отправка формы уже произошла. То есть, осуществить проверку на то, были ли у нас отправлены данные, можно следующим образом:
if ($input->post->name) { … }
Затем в переменной $message мы формируем тело самого письма, а в переменной $mail получаем объект, методы которого будем использовать в дальнейшем, для работы с почтой:
$mail = wireMail(); $mail->to($contactFormRecipient) ->from($input->post->email) ->subject('Contact form submission') ->bodyHTML($message) ->send();
Здесь мы устанавливаем получателя, адрес отправителя, тему письма, тело письма и с помощью метода send() отправляем всё это на почту.
Следующие две строки кода я пропущу (к ним мы вернёмся позже) и начну с этой строки:
$session->redirect($pages->get($contactPageID)->url);
На основании ID страницы формируется её адрес и с помощью метода redirect происходит переадресация на эту страницу (в данном случае - текущую). Это нужно для того, чтобы предотвратить повторную отправку формы в том случае, если пользователь нажмёт кнопку «Обновить» в браузере.
После того как данные будут отправлены, неплохо бы вывести какое-то благодарственное сообщение. Однако, тут же возникает вопрос – а как же это сделать, если после отправки формы, сразу же срабатывает переадресация? Вот для таких случаев и придумали сессионные переменные. Грубо говоря, это данные, к которым можно обратиться и после перезагрузки страницы. Это как раз и происходит в тех двух строках кода, которые мы вначале опустили:
$session->flashMessage = 'Спасибо за ваше сообщение! Вскоре ожидайте нашего звонка.'; $session->sent = true;
Осталось только разобраться с местом в самом шаблоне, где эта сессионная переменная будет выводиться. Для этого дела в самом шаблоне предусмотрен div с идентификатором success
Значит сделать это можно с помощью следующего кода:
<div id="success"> <?php if($session->flashMessage):?> <div class="alert alert-success" role="alert"> <?php echo $session->flashMessage;?> </div> <?php endif;?> </div>
Думаю, в объяснении он не нуждается – происходит проверка на существование переменной и собственно её вывод.
Ну и в конце самого файла прописываем:
<?php $session->remove('flashMessage'); $session->sent = false; ?>
Здесь происходит удаление сессионной переменной, поскольку необходимости в ней уже нет.
На этом данный урок закончен. Конечно, форма получилась самой обычной и здесь есть ещё над чем поработать: прикрутить капчу, сделать проверку некоторых полей на пустоту и произвести валидацию данных. Однако, целью данного урока было не охватить всё, а лишь показать самые основы.
Код файла к данному уроку прикладываю. Не забываем в самом файле указать свои email и ID страницы, на которой находится форма обратной связи (переменные $contactFormRecipient и $contactPageID соответственно).