Белый сайт лучше?
RSS →    VK →

Форма обратной связи на одной странице -

На удивление мало в интернете статей, которые по существу разбирают создание формы обратной связи для сайта. То есть не то чтобы совсем не найти как создат форму обратной связи, но из того что есть особо не за что уцепиться: всё либо старо как мир, либо раздуто как воздущный шар.

Постановка задачи

Наша цель - получить форму обратной связи, которая:

  1. Получает от юзера данные: имя, контактный телефон или имейл;
  2. Проверяет валидность данных, и не сабмитится пока не будет заполнена полностью;
  3. Имеет защиту от спама и брутфорса (хотя-бы элементарную);
  4. Отправляет письма с данными из формы на нужный адрес;
  5. Умеет выводить ошибки;

При всём при том, нам также нужно постараться сделать скрипт максимально компактным. В общем поехали.

Получение POST запроса, отправка письма

Для начала нам нужно получить данные  из POST запроса со стороны браузера. Мы должны проверить: заполнены ли оба поля, проверить поле-ловушку на наличие данных. Если мы уверены что юзер заполнил оба поля, то можно отправлять почту.

<?php

//configs
$email_to ='ivan@d3signer.ru'; //адрес имейл, на который отправляются письма с уведомлениями
$email_subject_prefix ='Сообщение с сайта https://вашсайт.ru '; //Сабджект (тема) уведомления по имейлу
$email_from ='alice@d3signer.ru'; //имейл, от имени которого сервер отправляет почту
$email_from_nice ='Alice'; //имя отправителя имейла

//If the form is submitted
if(isset($_POST['submit'])) {

        //Проверяем: действительно ли заполнено поле "телефон"
        if(trim($_POST['phone']) == '') {
                $hasError = true;
        } else {
                $phone = trim($_POST['phone']);
        }
 
        //Проверяем: действительно ли заполнено поле "сообщение"
        if(trim($_POST['message']) == '') {
                $hasError = true;
        } else {
                if(function_exists('stripslashes')) {
                        $comments = stripslashes(trim($_POST['message']));
                } else {
                        $comments = trim($_POST['message']);
                }
        }

        //Проверяем: заполнено ли скрытое поле для отлова ботов
        if($_POST['spam_prevention_test']) {
                $isSpam = true;
        }

        //Если ошибок нет, то отправляем письмо
        if(!isset($hasError) AND !isset($isSpam)) {
                $emailTo = $email_to; //если что, то имейл также можно вписать сюда
                $body = "Новое сообщение через форму обратной связи\n Контактный телефон: $phone\n \n $comments";
                $headers = 'From: '.$email_from_nice.' <'.$email_from.'>';
                $subject = $email_subject_prefix;
                mail($emailTo, $subject, $body, $headers);
                $emailSent = true;
        }
}
?>

        //Сама форма обратной связи, сначала выводим ошибки

        <form action="" method="post" class="contact-form" id="contactform">
	     <h2>Форма обратной связи</h2>
	<?php if(isset($isSpam)) { //это точно не спам?>
	     <div class="error">Приветствую тебя, робот :3</div>
	<?php } ?>
	<?php if(isset($hasError)) { //и не ошибка ?>
	     <div class="error">Надо заполнить&nbsp;форму полностью</div>
	<?php } ?>

	<?php if(isset($emailSent) && $emailSent == true) { //определяем: это имейл или телефон?
        if (strpos($phone, '@') !== false) { ?>
	     <div class="error">Спасибо за&nbsp;обращение. <strong>Мы&nbsp;скоро&nbsp;вам&nbsp;напишем :3</strong></div>
	<?php } else { ?>
	     <div class="error">Спасибо за&nbsp;обращение. <strong>Мы&nbsp;скоро&nbsp;вам&nbsp;позвоним :3</strong></div>
	<?php }; ?>
	<?php } ?>

	<?php if(isset($emailSent) && $emailSent == false) { //Если имейл отправлен ?>
	     <div class="heading">Закажите услуги программистов</div>
	<?php } ?>
	<div class="field">
	     <label for="catch_cellph">Нам нужен ваш телефон или электронная почта (имейл):</label>
	     <input id="catch_cellph" name="phone" type="text" value="" />
	</div>

	<div class="field">
	     <label for="catch_desc">Что вам нужно?</label>
	     <textarea id="catch_desc" name="message"></textarea>
	</div>

	<div class="field hidden">
	     <label for="name">Name</label>
	     <input id="name" name="name" type="text" value="<?php echo $_POST['spam_prevention_test']; ?>" />
	</div>

	<div class="field">
	     <input type="submit" class="button" value="Обратиться в Десигнер" name="submit" title="Обратиться в Дэсигнер :3" />
	</div>
	</form>

По итогу получается форма обратной связи в виде PHP скрипта, работающая полностью независимо от цмс.

Написано 08.12.2013
Поделитесь ссылкой:

Не стесняйтесь высказываться :3