Unlimited Wordpress themes, plugins, graphics & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Web Design
  2. Bootstrap
Webdesign

Создание Bootstrap контактной формы с использованием PHP и AJAX

by
Difficulty:BeginnerLength:LongLanguages:

Russian (Pусский) translation by Dmitriy Sirosh (you can also view the original English article)

Final product image
What You'll Be Creating

В этой инструкции я собираюсь пошагово рассказать о том, как создать рабочую контактную форму, с использованием самого популярного фреймворка для фронт-энда Bootstrap в комбинации с AJAX и PHP. Также здесь мы рассмотрим некоторые дополнительные возможности, как например, некоторые причудливые CSS-анимации с помощью листа стилей animate.css, последующую проверку формы через Javascript и улучшение общего впечатления конечных пользователей с помощью асинхронного контента.

На момент написания самой свежей версией фреймворка был Bootstrap 3.3.5 и стоит отметить, что в данной инструкции будет использоваться обычная сборка с двенадцатью колонками. В процессе чтения этой инструкции убедитесь, что используете самые последние фрагменты и части кода, как это показано в документации к Bootstrap.

Примерная структура файлов и папок

Первым делом, мы создаем корневую директорию и помещаем в нее следующие файлы и папки:

Нам будет нужно добавить несколько фронт-энд библиотек, которые нам помогут, так что не стесняемся и качаем (или добавляем внешние ссылки на следующие из них:

Предположим, что мы их скачали в локальное хранилище и положили в папку проекта, файловая структура нашего проекта теперь будет выглядеть так:

Задание Основ Формы

Открываем index.html, копируем следующую базовую структуру HTML:

Это наш базовый HTML шаблон, на основе которого мы будем создавать содержимое формы. Вы можете видеть, что мы связали все необходимые файлы CSS и JavaScript (обратите внимание, что для этого конкретного примера нам не нужен bootstrap.js). Мы включили метатег viewport для облегчения работы с медиа запросами в Bootstrap. JavaScript был прописан в нижней части файла, чтобы сначала загрузилась основная часть формы.

Внутри тега body мы включили div с классом col-sm-6 col-sm-offset-3. Это в основном означает, что на маленьких экранах sm (small) мы хотим отобразить столбец шириной 50% (максимум 12 столбцов). Класс col-sm-offset-3 добавляет отступ слева 25%, создавая таким образом макет, который занимает половину доступного экрана и выровнен по центру. Здесь мы добавили тег h3, и это начало основы нашей формы. Убедитесь, что вы применили ID к этой форме, чтобы мы могли позднее связать событие jQuery.

the offset will push our DIV 25 from the right

Кто не рискует, тот не пьет шампанское

Создавая элементы формы мы можем скопировать/вставить или написать следующий код в тегах <form></form>:

Пользователь будет взаимодействовать со всеми этими полями и кнопками. Родительский div с присвоенным классом row -  классический Bootstrap синтаксис, создает строку из элементов col. Столбцы в Bootstrap создают внутренние отступы или интервалы - добавление строки вокруг них приведет к удалению отступов слева и справа и столбцы идеально вписываются в основной контейнер.

Мы создали два столбца с классом col-sm-6 (50%), который мы будем использовать для разделения нашей формы. В первом столбце col-sm-6 мы создали метку и поле для имени, во втором столбце поле для электронной почты. Каждый из них включает метку с соответствующим атрибутом for, ссылающийся на соответствующее поле. Каждый из этих столбцов заключен в класс form-group который семантически группирует метку и поле вместе и также добавляет маленький внешний отступ снизу.

Displaying two fields inline

Типографика

Bootstrap позволяет вам использовать классы заголовков H1-H6. Эти классы помогают нам использовать строчные элементы без добавления дополнительных отступов или создания блочных элементов. Мы применили класс H4 к меткам, быстро увеличив их размер и сделав их более понятными.

Класс form-control применяемый к каждому полю ввода, позволяет ему охватывать всю длину контейнера (100%). Он также добавляет различные стили, улучшающие читаемость текста (увеличивая высоту текста, добавляя рамку и т.д.).

После этих столбцов мы добавляем текстовое поле сообщения. Опять же, мы заключаем это внутри класса form-group и применяем похожие стили к нашей метке и текстовому полю, как мы это делали раньше.

Призыв к действию

И наконец, мы добавляем кнопку. В Bootstrap имеется несколько классов для разных кнопок с различными цветами и состояниями. Мы решили использовать кнопку "успех" (btn-success), которая по умолчанию имеет зеленый цвет. Кроме того, нам необходимо добавить класс btn для сброса стандартных стилей кнопки (граница, отступы, выравнивание текста, насыщенность шрифта). Мы применили класс btn-lg который увеличивает кнопку и наконец класс pull-right для выравнивания кнопки по правому краю.

После нашей кнопки мы добавили div с идентификатором #msgSubmit и применили следующие классы: "h3 text-center hidden". h3 создает более крупный заголовок, text-center (как вы уже догадались) делает выравнивание текста по центру, и, наконец, мы установили класс hidden, который устанавливает оба свойства, display в значение none и свойство visibility в значение hidden (display: none; visibility: hidden;).

Completed Form

Добавляем функцию отправки

Как вы можете видеть это в своем браузере, мы создали основу Bootstrap формы. Но пока она абсолютно ничего не делает. Следующим шагом будет создание функции, которая принимает входные данные пользователей и отправляет их асинхронно в наш класс PHP mailer.

Откройте scripts.js и скопируйте следующий код:

Этот кусок кода является jQuery фрагментом, который принимает функцию отправки в нашем id #contactForm  (как задано ранее). По этой функции мы парсим переменную event, в которой хранится действие отправки формы в функцию. Событие event.preventDefault(); останавливает отправку данных формы, как обычно, чтобы обновить страницу, поскольку не задано действие формы. Наконец, вызывается функция submitForm();.

submitForm();

Затем мы создадим функцию submitForm();:

Три переменные содержат значения всех входных данных из формы и присваивают их переменной JavaScript, которая будет использована позднее.

Инициализируем AJAX объект в jQuery и устанавливаем тип запроса post, URL– ссылка на PHP файл, данные которые мы хотим отправить, и при успешной отработке срабатывает функция success. Данные включают все три объединенные переменные с соответствующим идентификатором/меткой. Функция обратного вызова вызывается, когда объект Ajax успешно получает информацию из сценария PHP. Функция сравнивает возвращаемый текст и проверяет, равен ли он строке "success". Если все верно, то запускается функция formSuccess.

Функция formSuccess удаляет класс hidden из div с id #msgSubmit, который мы применили ранее, тем самым показывая текст.

Подключаем PHP функцию mail

Нам осталось написать PHP скрипт для получения данных и отправки нашей информации с помощью встроенной php функции mail. Откройте process.php и добавьте следующий код:

Похоже на фрагмент кода JQuery выше, мы создаем и храним переменные, которые мы хотим использовать. Из функции post мы получаем три input переменные и записываем их значения в такие же переменные PHP. Переменная $EmailTo – заранее определенный email адрес, который указывается в скрипте и отправляется на вашу почту из формы. $Subject – это строка, которая используется в качестве темы письма.

Основа сообщения создается из трех переменных. Сначала указывается от кого сообщение “Name:”, затем добавляется символ перехода на новую строку /n. (новая строка/разрыв строки). Это повторяется и объединяется с переменной $body.

Чтобы окончательно отправить сообщение мы пишем функцию отправки сообщения. В переменную $success мы возвращаем результат отправки, в которую входит: получатель, тема, основной текст и отправитель.

Чтобы инициировать процесс отправки электронной почты, мы можем вызвать его в операторе if. Это также помогает проверить прошло ли всё успешно или нет. Если функция mail вернула значение “true”, скрипт вернет значение “success”, а если false соответственно “invalid”.

Данный результат будет возвращен в AJAX объект и обработан обратно на стороне клиента. Красота AJAX заключается в том, что все это выполняется асинхронно на клиентской стороне, позволяя клиенту пользоваться сайтом во время отправки сообщения.

Идеальный порядок

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

Еще раз, для валидации формы мы будем использовать некоторые инструменты. К ним относятся:

Добавьте их также в проект, как мы делали ранее с Bootstrap и jQuery. Эти инструменты помогут обеспечить обратную связь с пользователем при отправке формы. Существует множество инструментов и фреймворков для проверки форм (включая встроенный HTML5 валидатор), но я использовал «Bootstrap Validator», так как он прекрасно интегрируется с нашей текущей формой.

Теперь структура проекта должна выглядеть примерно так:

Проверка нашей формы

Начнем с создания валидатора, чтобы проверить форму при нажатии кнопки. Вернемся к файлу scripts.js, нам нужно отредактировать первый кусок кода, который вызывает функцию submitForm(), когда форма отправлена.

Теперь код выглядит так:

Этот новый фрагмент кода проверяет, нашел ли Bootstrap Validator какие-то ошибки и остановил процесс. Если это не так, мы продолжим. Нам все равно нужно предотвратить действие по умолчанию (обновление страницы) при успешной отправке формы, поэтому сохраним это.

Теперь, при нажатии на кнопку отправки формы, когда она не заполнена полностью, сработает проверка правильности заполнения формы и поля будут выделены красным цветом, показывая, что нужно вводить, это просто!

В процессе добавления этой проверки мы удалили или запретили нативную HTML5 проверку. Можно улучшить нашу валидацию, включив сообщения об ошибках. В Bootstrap Validator есть отличная функция, позволяющая довольно легко отображать сообщения об ошибках возле каждого поля ввода. Чтобы добавить ее, необходимо написать дополнительный HTML-код.

В каждой form-group под полями ввода необходимо разместить следующий html-код:

Например, вот дополнительный блок div, добавленный к полям Name и E-mail:

Теперь при повторной отправке формы, если поля оставлены пустыми, по умолчанию, должно появляться сообщение об ошибке “Please fill in this field.”. Добавив атрибут “data-error” к полю ввода, вы можете добавить пользовательское сообщение об ошибке. Например:

Существует целый ряд других функций, таких как шаблоны регулярных выражений, которые можно применить к валидатору Bootstrap. Вы можете увидеть больше на Github.

Добавляем анимацию

Наша клиентская валидация выглядит очень хорошо; у нас есть изящная подсветка пустых полей красным цветом. Однако было бы неплохо добавить в форму дополнительную анимацию и добавить дополнительные сообщения, позволяющие пользователю знать, что происходит. В настоящее время у нас есть сообщение "Message Submitted!", которое появляется при успешной отправке, но как насчет сообщения об ошибке?

Мы изменим наш код, чтобы он стал более универсальным, изменим успешное сообщение так, чтобы оно принимало и сообщения об ошибках.

Прежде всего, давайте удалим текст “Message Submitted!” из HTML-кода и просто оставим пустой блок div:

Теперь нам необходимо создать новую функцию для обработки статуса сообщения. Добавьте эту функцию в конец сценария scripts.js

Эта функция принимает два аргумента. valid будет булева [логическая] переменная: если это истина тогда показывается успешное сообщение, если ложь то показывается сообщение об ошибке. msg содержит сообщение для отображения в блоке div.

Во-первых, функция проверяет, имеет ли она успех или сообщение об ошибке, проверяя значение valid. В любом случае в переменную записываются необходимые имена CSS классов (нужно еще раз подключить h3 и text-center, так как позже мы удалим их по умолчанию).

Примечание: мы используем некоторые классы animate.css. Класс tada применит анимацию при успешной отправке сообщения.

Наконец, функция удаляет все классы из #msgSubmit (избегайте конфликтующих классов), затем добавляет классы, установленные ранее, а затем добавляет текст сообщения внутри элемента div.

В нашей форме валидации, которую мы обновили в начале этого раздела, мы можем добавить следующий вызов функции внутри оператора if, когда он равен true.

При отправке формы с пустыми полями должно появиться сообщение об ошибке “Did you fill in the form properly?"

Последним шагом для этой новой submitMSG функции - это вызвать ее при успешной отправке сообщения. Обновите функцию formSuccess() следующим образом:

Во-первых, мы хотим сбросить данные формы и очистить значения полей при успешной отправке, затем как и прежде, вызываем нашу функцию submitMSG. При успешной отправке теперь должно отображаться сообщение с эффектом анимации tada из animate.css.

Встряска

Еще одна анимация, верно? Давайте добавим еще одну анимацию для всей формы при сообщении об ошибке, анимационное "дрожание" должно выглядеть очень хорошо!

Создайте новую функцию сразу после formSuccess() и назовите ее formError()

Эта функция использует подход, найденный на демо странице animate.css, который позволяет добавить анимацию к элементу, а затем повторно вызывать/добавлять ее снова и снова. С CSS анимациями связана одна небольшая проблема, если один раз добавить анимацию к элементу и потом удалить стили, а затем добавить их по новой, то анимация не повториться. Эта функция помогает сбросить классы по завершению анимации, а затем позволяет повторно добавить их. Когда пользователь нажимает кнопку "Отправить" в не до конца заполненной форме, мы хотим, чтобы анимация дрожала. И в случае если форма все еще заполнена неправильно, нужно чтобы анимация также срабатывала снова.

Мы можем вызвать эту функцию formError() над функцией submitMSG(). К примеру:

Теперь, когда мы отправляем пустую форму, она будет дрожать, чтобы пользователь знал, что что-то пошло не так.

Дополнительная проверка

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

Откройте наш файл process.php, нам необходимо немного его изменить, добавить проверку на пустоту полей; Если они не пусты, отправляем сообщение обратно на front-end. Мы создадим переменную с именем $errorMSG, в которую будем записывать ошибки, а затем включим дополнительную проверку $_POST.

Этот PHP код проверяет, не пусты ли поля перед записью в соответствующие переменные (заменяет существующий код, устанавливая переменные из $_POST). Если они пустые, мы формируем базовое сообщение для отправки обратно клиенту. Мы можем проверять еще более тщательно, чем просто проверять поля на пустоту (если значение слишком короткое/длинное, то проверяем его регулярными выражениями) в PHP и JavaScript. Однако, ради простоты, мы ограничимся лишь проверкой на пустоту.

Необходимо вернуть сообщение в функцию AJAX, который будет отображаться в браузере. Мы отредактируем условие if, которое мы создали ранее в нижней части файла PHP.

В нашем условии if мы также проверяем не является ли переменная $errorMSG пустой ( "" ), которую мы использовали в переменной $success. В нашем условии else мы включили дальнейшую проверку. Здесь просто проверка, если в переменную $success вернулся результат false, то возвращается “Something went wrong :(“. В противном случае отображаем сообщение, которое было скомпилировано при проверке на наличие пустых значений.

Последний шаг - принять новое сообщение в AJAX и отобразить его в форме. Нам нужно обновить объекта Ajax в файле scripts.js следующим образом:

Мы только что обновили условие else, которое проверяет если text == success. В нашем else мы вызвали функцию formError(), которая активирует анимацию встряхивания, функция submitMSG() отображает текст сообщения из файла PHP. Возвращаемый текст будет либо “Something went wrong :(”, либо данные о пустых полях.

Заключение

Перейдите на Github, чтобы посмотреть на весь код, который мы написали!

Теперь наша форма обеспечивает обратную связь с пользователями и показывает, какие поля заполнены неправильно или пустые. В форме мы предоставили контекстные сообщения, основанные на статусе возвращенного значения из PHP файла и реализовали дополнительный уровень проверки на стороне сервера, вылавливая тех пользователей, которые захотели обойти front-end валидацию.

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.