PHP

Супер контактная форма на AJAX

В сегодняшнем уроке мы создадим очень красивую и функциональную форму обратной связи.

В данном уроке мы будем использовать силу PHP, CSS и jQuery. Кроме этого будут использованы плагины formValidator для проверки введенных данных и JQTransform для оформления полей и кнопок формы. Вдобавок ко всему этому будет использован класс PHPMailer для отправки сообщений.

Форма хороша тем, что прекрасно работает и с отключенным JavaScript.

Демо перенесено на наш сервер! Ура :)

Начнем!

Шаг №1 - XHTML
<div id="main-container">	<!-- Главный контейнер -->
<div id="form-container">	<!-- Контейнер формы -->
<h1>Fancy Contact Form</h1>	<!-- Заголовки -->
      <h2>Drop us a line and we will get back to you</h2>
<form id="contact-form" name="contact-form" method="post" action="submit.php">	<!-- The form, sent to submit.php -->
<table width="100%" border="0" cellspacing="0" cellpadding="5">
<tr>
      <td width="18%"><label for="name">Name</label></td>	<!-- Text label for the input field -->
      <td width="45%"><input type="text" class="validate[required,custom[onlyLetter]]" name="name" id="name" value="<?=$_SESSION[&apos;post&apos;][&apos;name&apos;]?>" /></td>
      <!-- Мы используем сессии для того, чтобы не потерять данные при редиректах -->
<td width="37%" id="errOffset"> </td>
      </tr>
<tr>
      <td><label for="email">Email</label></td>
      <td><input type="text" class="validate[required,custom[email]]" name="email" id="email" value="<?=$_SESSION[&apos;post&apos;][&apos;email&apos;]?>" /></td>
      <td> </td>
      </tr>
<tr>

      <td><label for="subject">Subject</label></td>
<!-- Этот элемент select полностью заменен jqtransorm plugin -->
<td><select name="subject" id="subject">
      <option value="" selected="selected"> - Choose -</option>
      <option value="Question">Question</option>
      <option value="Business proposal">Business proposal</option>
      <option value="Advertisement">Advertising</option>
      <option value="Complaint">Complaint</option>
      </select>          </td>
      <td> </td>
      </tr>
<tr>
      <td valign="top"><label for="message">Message</label></td>
      <td><textarea name="message" id="message" class="validate[required]" cols="35" rows="5"><?=$_SESSION[&apos;post&apos;][&apos;message&apos;]?></textarea></td>
      <td valign="top"> </td>
      </tr>
<tr>
      <td><label for="captcha"><?=$_SESSION[&apos;n1&apos;]?> + <?=$_SESSION[&apos;n2&apos;]?> =</label></td>
<!-- Простой пример каптчи -->
<td><input type="text" class="validate[required,custom[onlyNumber]]" name="captcha" id="captcha" /></td>
      <td valign="top"> </td>
      </tr>
<tr>
      <td valign="top"> </td>
      <!-- Эти кнопки также заменены с помощью плагина -->
      <td colspan="2"><input type="submit" name="button" id="button" value="Submit" />
      <input type="reset" name="button2" id="button2" value="Reset" />

      <?=$str?>
<!-- $str содержит ошибки, если форма обрабатывалась с выключенным JS -->
<img id="loading" src="img/ajax-load.gif" width="16" height="16" alt="loading" />
      <!-- the rotating gif animation, hidden by default -->

      </td></tr>
</table>
      </form>
<?=$success?>
      <!-- Переменная $success содержит сообщение об успехе, если форма успешно обработалась с выключенным JS -->
</div>
      </div>	<!-- Закрываем контейнеры-->

Как Вы видите на строке №8, мы передаем все данные формы в файл submit.php. Данный файл будет использоваться для обработки данных в обоих случаях (с включенным JS и нет).

Далее ВЫ можете увидеть, что используется массив $_SESSION для вывода данных, введенных в форму. Это сделано для того, чтобы не потерять данные во время редиректов со страницы на страницу.

Очень важный момент связан с классами полей ввода - classs=”validate[required,custom
]”. Эти классы используется плагином по проверке данных для определения правил проверки для каждого поля. В примере выше, мы указываем, что оно обязательное и разрешены только буквы.

Наша форма будет выглядеть вот так:

Шаг №2 - jQuery

demo.php
[HTML]<link rel="stylesheet" type="text/css" href="jqtransformplugin/jqtransform.css" />
      <link rel="stylesheet" type="text/css" href="formValidator/validationEngine.jquery.css" />
      <link rel="stylesheet" type="text/css" href="demo.css" />
<?=$css?> <!-- Специальное CSS правило, созданное с помощью PHP -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
      <script type="text/javascript" src="jqtransformplugin/jquery.jqtransform.js"></script>
      <script type="text/javascript" src="formValidator/jquery.validationEngine.js"></script>
      <script type="text/javascript" src="script.js"></script>

Выше представлен код, который находится в шапке файла demo.php. Подключаем все плагины и таблицу стилей. Строка №5 возможно будет Вам интересна - это специальный набор CSS правил, которые мы создадим с помощью PHP для показа подтверждающего сообщения. Об этом подробнее немного позже.

script.js
$(document).ready(function(){
/* После загрузки страницы */
 $(&apos;#contact-form&apos;).jqTransform();
      /* Видоизменить форму с помощью плагина jqtransform */
 $("button").click(function(){
 $(".formError").hide();
      /* Спрятать все тултипы с ошибками */
      });
 var use_ajax=true;
      $.validationEngine.settings={};
      /* Инициализировать настройки для плагина formValidation */
 $("#contact-form").validationEngine({	/* Создать проверку введенных данных */
      inlineValidation: false,
      promptPosition: "centerRight",
      success :  function(){use_ajax=true},	/* если все OK включить AJAX */
      failure : function(){use_ajax=false}	/* если есть ошибка, выключить AJAX */
      })
 $("#contact-form").submit(function(e){
 if(!$(&apos;#subject&apos;).val().length)
      {

      $.validationEngine.buildPrompt(".jqTransformSelectWrapper","* This field is required","error")
      
 return false;
      }
 if(use_ajax)
      {
      $(&apos;#loading&apos;).css(&apos;visibility&apos;,&apos;visible&apos;);

      /* Показать вращающийся gif */
 $.post(&apos;submit.php&apos;,$(this).serialize()+&apos;&ajax=1&apos;,
      /* используя метод post jQuery отправить данные */
 function(data){
      if(parseInt(data)==-1)
      $.validationEngine.buildPrompt("#captcha","* Wrong verification number!","error");
      /* если есть ошибка, создать сообщение об ошибке в captcha */
      else
      {
      $("#contact-form").hide(&apos;slow&apos;).after(&apos;<h1>Thank you!</h1>&apos;);
      /* показать сообщение подтверждения */
      }
 $(&apos;#loading&apos;).css(&apos;visibility&apos;,&apos;hidden&apos;);
      /* Спрятать вращающийся gif */
      });
      }
e.preventDefault();	
      })
});

Весь скрипт исполняется только внутри метода $(document).ready, что гарантирует выполнение кода только после окончательной загрузки.

Ниже представлены изображения, которые показывают, как форма обрабатывается при включенном и выключенном Javascript.

Шаг №3 - CSS

demo.css
body,h1,h2,h3,p,quote,small,form,input,ul,li,ol,label{
/* reset some of the page elements */
margin:0px;
padding:0px;
}
body{
      color:#555555;
      font-size:13px;
      background: url(img/dark_wood_texture.jpg) #282828;
      font-family:Arial, Helvetica, sans-serif;

      }
.clear{
      clear:both;
      }
#main-container{
      width:400px;
      margin:30px auto;
      }
#form-container{
      background-color:#f5f5f5;
      padding:15px;
 /* rounded corners */
      -moz-border-radius:12px;
      -khtml-border-radius: 12px;
      -webkit-border-radius: 12px;
      border-radius:12px;
      }
td{
      /* prevent multiline text */

      white-space:nowrap;
      }
a, a:visited {
      color:#00BBFF;
      text-decoration:none;
      outline:none;
      }
a:hover{
      text-decoration:underline;
      }
h1{
      color:#777777;
      font-size:22px;
      font-weight:normal;

      text-transform:uppercase;
      margin-bottom:5px;
      }
h2{
      font-weight:normal;
      font-size:10px;
 text-transform:uppercase;
 color:#aaaaaa;
      margin-bottom:15px;
 border-bottom:1px solid #eeeeee;
      margin-bottom:15px;
      padding-bottom:10px;
      }
label{
      text-transform:uppercase;
      font-size:10px;
      font-family:Tahoma,Arial,Sans-serif;
      }
textarea{
      color:#404040;
      font-family:Arial,Helvetica,sans-serif;
      font-size:12px;
      }
td > button{

      /* Специальный селектор CSS для не-IE6 брайзеров */
      text-indent:8px;
      }
.error{
      /* этот класс используется, если JS выключен */
      background-color:#AB0000;
      color:white;
      font-size:10px;
      font-weight:bold;
      margin-top:10px;
      padding:10px;
      text-transform:uppercase;
      width:300px;
      }
#loading{
      /* loading (загрузка) gif спрятан при загрузке */
      position:relative;
      bottom:9px;
      visibility:hidden;
      }
.tutorial-info{
      color:white;
      text-align:center;

      padding:10px;
      margin-top:10px;
      }

Тут ничего особенного.

Шаг №4 - PHP

продолжение demo.php
session_name("fancyform");
      session_start();
$_SESSION[&apos;n1&apos;] = rand(1,20);	/* сгенерировать первую цифру */
      $_SESSION[&apos;n2&apos;] = rand(1,20);	/* потом вторую */
      $_SESSION[&apos;expect&apos;] = $_SESSION[&apos;n1&apos;]+$_SESSION[&apos;n2&apos;];	/* результат сложения */
/* Код ниже используется, если JS выключен */
      $str=&apos;&apos;;
      if($_SESSION[&apos;errStr&apos;])	/* если submit.php выдает строку с ошибкой в массиве session */

      {
      $str=&apos;<div class="error">&apos;.$_SESSION[&apos;errStr&apos;].&apos;</div>&apos;;
      unset($_SESSION[&apos;errStr&apos;]);	/* будет показан только 1 раз */
      }
$success=&apos;&apos;;
      if($_SESSION[&apos;sent&apos;])
      {
      $success=&apos;<h1>Thank you!</h1>&apos;;	/* Сообщение об успехе */
 $css=&apos;<style type="text/css">#contact-form{display:none;}</style>&apos;;
      /* специальное правило CSS, которое прячет форму */
 unset($_SESSION[&apos;sent&apos;]);
      }

Как Вы видите, мы используем массив $_SESSION для хранения 2-х случайных цифр и результата их сложения. Это будет далее использоваться в файле submit.php для captcha.

submit.php
<?php

/* начало конфига */

$emailAddress = &apos;СЮДА ВПИСЫВАЕМ ВАШ ЕМЕЙЛ&apos;;

/* конец */

require "phpmailer/class.phpmailer.php";
session_name("fancyform");	/* начинаем сессию */
      session_start();
foreach($_POST as $k=>$v)
      {
      /* если magic_quotes включены, очистить массив post */
      if(ini_get(&apos;magic_quotes_gpc&apos;))
      $_POST[$k]=stripslashes($_POST[$k]);
 $_POST[$k]=htmlspecialchars(strip_tags($_POST[$k]));
      /* удалить special chars */
      }
$err = array();
/* некоторые проверки на ошибки */
      if(!checkLen(&apos;name&apos;))
      $err[]=&apos;The name field is too short or empty!&apos;;
if(!checkLen(&apos;email&apos;))
      $err[]=&apos;The email field is too short or empty!&apos;;
      else if(!checkEmail($_POST[&apos;email&apos;]))
      $err[]=&apos;Your email is not valid!&apos;;
if(!checkLen(&apos;subject&apos;))
      $err[]=&apos;You have not selected a subject!&apos;;
if(!checkLen(&apos;message&apos;))
      $err[]=&apos;The message field is too short or empty!&apos;;
/* Сравнить полученный результат captcha с результатом в массиве session */
      if((int)$_POST[&apos;captcha&apos;] != $_SESSION[&apos;expect&apos;])

      $err[]=&apos;The captcha code is wrong!&apos;;
/* Если ошибки есть */
      if(count($err))
      {
      /* Если форма обработана с помощью AJAX */
      if($_POST[&apos;ajax&apos;])
      {
      echo &apos;-1&apos;;
      }
 /* в противном случае заполнить массив SESSION и редирект обратно на форму */
      else if($_SERVER[&apos;HTTP_REFERER&apos;])
      {
      $_SESSION[&apos;errStr&apos;] = implode(&apos;<br />&apos;,$err);
      $_SESSION[&apos;post&apos;]=$_POST;
 header(&apos;Location: &apos;.$_SERVER[&apos;HTTP_REFERER&apos;]);
      }
 exit;
      }
/* тело письма */
      $msg=
      &apos;Name:	&apos;.$_POST[&apos;name&apos;].&apos;<br />
      Email:	&apos;.$_POST[&apos;email&apos;].&apos;<br />
      IP:	&apos;.$_SERVER[&apos;REMOTE_ADDR&apos;].&apos;<br /><br />
Message:<br /><br />
&apos;.nl2br($_POST[&apos;message&apos;]).&apos;
&apos;;
$mail = new PHPMailer();	/* используя PHPMailer */
      $mail->IsMail();
$mail->AddReplyTo($_POST[&apos;email&apos;], $_POST[&apos;name&apos;]);
      $mail->AddAddress($emailAddress);
      $mail->SetFrom($_POST[&apos;email&apos;], $_POST[&apos;name&apos;]);
      $mail->Subject = "A new ".mb_strtolower($_POST[&apos;subject&apos;])." from ".$_POST[&apos;name&apos;]." | contact form feedback";
$mail->MsgHTML($msg);
$mail->Send();
unset($_SESSION[&apos;post&apos;]);	
/* Форма удачно была отправлена */
      if($_POST[&apos;ajax&apos;])

      {
      echo &apos;1&apos;;
      }
      else
      {
      $_SESSION[&apos;sent&apos;]=1;
 if($_SERVER[&apos;HTTP_REFERER&apos;])
      header(&apos;Location: &apos;.$_SERVER[&apos;HTTP_REFERER&apos;]);
 exit;
      }
/* дополнительные функции */
      function checkLen($str,$len=2)
      {

      return isset($_POST[$str]) && mb_strlen(strip_tags($_POST[$str]),"utf-8") > $len;
      }
function checkEmail($str)
      {
      return preg_match("/^[\.A-z0-9_\-\+]+[@][A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z]{1,4}$/", $str);
      }
?>

Обратите внимание на красный текст в коде. Без правильного адреса форма будет отправлять письма "в далекие глубины всемирной паутины :)"

Вот наша форма и готова. Получилась очень солидная, красивая и многофункциональная форма.

Спасибо за Ваше внимание.

P.S. Комментарии в коде переведены :)
Добавлено: 31 Декабря 2014 12:53:52 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...