Форма Контакты для нашей CMS

 

Почти на каждой интернет страничке вы можете встретить подобную форму. Для чего она нужна не особо то известно, ведь в случае если кто-то хочет связаться с Вами, для этого обычно оглашают свой почтовый ящик, и как говорится: "Дело в шляпе". Как мне кажется, такая форма существует лишь для удобства, и не более того. Несмотря, как мне кажется, на бесполезность данной формы, она нужна почти на каждом проекте, стало быть нам нужно уметь ее реализовывать. Я практиковал как минимум два типа таких форм.

 

 

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


Для этого модуля нам потребуется создать шаблон с формой, и обработчик. Так же подправить наш файл index.php и все

В шаблон формы (contacts.html) будет входить четыре поля: автор, мыло, тема и текст. Приступим к реализации этой формы:

<center><p style="width:500px;">Если Вам нужно, по какой то причине связаться со мной, то Вы можете это сделать через форму обратной связи, которую Вы видите ниже.</p></center><br>
<form action="index.php?contact=1" method="post" name="form2">
<input style="width:500px;" name="author_contact" type="text" value="Введите ник*">
<br>
<input style="width:500px;" name="email_contact" type="text" value="E-mail*">
<br>
<input style="width:500px;" name="them_contact" type="text" value="Тема*">
<br>
<textarea style="width:500px;" name="txt_contact" rows="10">Введите текст*</textarea>
<br>
<p><input type="submit" value="Отправить сообщение"></p>
</form>

Ничего сложно тут нет, обычна форма для отправки информации.

Далее нам потребуется написать модуль вывода этой формы. Как Вы могли заметить, мы не использовали код-слова, поэтому сам модуль вывода формы будет выглядеть неприлично коротким в тоже время у нашего модуля будет два назначения, первый - вывод формы, а второй - вывод сообщения об отправки, вот код с комментариями:

<?
function contact($contact)
{
if($contact == 1)//Если пользователь еще не отправлял сообщение
{
$sm_read = file("templates/contacts.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
}

if($contact == 2)//Если пользователь уже отправил сообщение
$sm_read = "<p align='center'>Ваше сообщение отправлено</p>";//Пользователь увидит следующее сообщение

return $sm_read;//Выводим с генерированный html код
}
?>

Тут все должно быть понятно Как Вы могли заметить, переменная $contact определяет какое результат выдаст нам функция. Я назвал этот файл contact.php и поместил в папку moduls

Думаю пришло время подправить наш файл index.php и посмотреть выводится ли наша форма. Что стоит исправить в нашем главном файле? Первое что стоит сделать, это определить переменную $contact. Вставляем следующий код сразу после определения переменной $blog, вот как это выглядит:

if($_GET['blog'])$blog = $_GET['blog'];
if($_GET['contact'])$contact = $_GET['contact'];//Новая строчка

Далее, нам стоит исправить условие вывода нашего модуля "мини новостей", вот как должно выглядеть условие подключение этого модуля

//МОДУЛЬ МИНИ НОВОСТЕЙ
if(!$blog AND !$contact)//Новое условие
{
include("moduls/news.php");
$txt = index_page();//Выводим результат функции в переменную, которая отобразится на экране пользователя
}
//МОДУЛЬ МИНИ НОВОСТЕЙ

После чего подключаем наш новый модуль. Я его подключил перед модулем "мини новостей", Вот кусочек кода:

//МОДУЛЬ КОНТАКТЫ
if($contact)//Если существует переменная
{//то
include("moduls/contact.php");//подключаем модуль
$txt = contact($contact);//Выводим результат функции в переменную, которая отобразится на экране пользователя
}
//МОДУЛЬ КОНТАКТЫ

Проделывание этих операций вполне должно хватить для того чтобы увидеть нашу форму. Если Вы все сделали правильно, то по адресу index.php?contact=1 она должна отобразится.

Если Вы видите созданную форму, значит пора создать обработчик для нее.. Перед тем как я вывешу код с комментариями, хотел бы кое что пояснить. В коде будет два метода отправки сообщения, по почте и в базу данных. Отправку сообщения на почту будем реализовывать с помощью функции mail(); Что касается второго способа отправки. Для корректной записи в базу данных, Вам следует создать таблицу, вот ее sql запрос:

CREATE TABLE IF NOT EXISTS `mess_admin` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`login` varchar(255) NOT NULL,
`them` varchar(255) NOT NULL,
`date_g` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`text` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

Так, продолжу... Обработчик я писал непосредственно в файле contact.php перед функцией contact($contact), вот код с комментариями:

//--------------ОБРАБОТЧИК КОНТАКТОВ
$date_day = date("d");//Определяем день
$date_month = date("m");//Определяем месяц
$date_year = date("Y");//Определяем год
$date_time = date("H:i");//Определяем часы и минуты
$date_cont = $date_day."/".$date_month."/".$date_year." ".$date_time;//Склеим все переменные в одну
//получим дату для записи в формате день/месяц/год часы:минуты

//Определяем посланные переменные из формы
if(isset($_POST['author_contact']))$author_contact = $_POST['author_contact'];
if(isset($_POST['email_contact']))$email_contact = $_POST['email_contact'];
if(isset($_POST['them_contact']))$them_contact = $_POST['them_contact'];
if(isset($_POST['txt_contact']))$txt_contact = $_POST['txt_contact'];

if($author_contact & $email_contact & $them_contact & $txt_contact)//Если посланные переменные определены как существующие
{
//Переводим html код (если есть) в каракозябры =)
//Вообщем то тут несколько лишних строк, но у меня параноя, поэтому я проверяю ВСЕ переменные

$author_contact = htmlspecialchars($author_contact);
$email_contact = htmlspecialchars($email_contact);
$them_contact = htmlspecialchars($them_contact);
$txt_contact = htmlspecialchars($txt_contact);

//Избавляемся от кавычки
$author_contact = str_replace("'","&#039",$author_contact);
$email_contact = str_replace("'","&#039",$email_contact);
$them_contact = str_replace("'","&#039",$them_contact);
$txt_contact = str_replace("'","&#039",$txt_contact);

$txt_contact = str_replace("\n","<BR>",$txt_contact);//Заменяем переносы строки на тег <BR>

//ДОБАВЛЯЕМ СООБЩЕНИЕ В БАЗУ ДАННЫХ
$result_add_cont = mysql_query ("INSERT INTO mess_admin (login,them,date_g,email,text)
VALUES ('$author_contact','$them_contact','$date_cont','$email_contact','$txt_contact')");
//ДОБАВЛЯЕМ СООБЩЕНИЕ В БАЗУ ДАННЫХ
//ИЛИ
//ООТПРАВЛЯЕМ СООБЩЕНИЕ ПО ПОЧТЕ
$to = "test@test.ru";//Ваш почтовый адрес
$txt_contact = $author_contact." <".$email_contact."> Вам пишет: ".$txt_contact;//Приклеиваем к тексту сообщения
//контактную информацию отправителя
mail($to,$them_contact,$txt_contact);//Собственно сама отправка
//ООТПРАВЛЯЕМ СООБЩЕНИЕ ПО ПОЧТЕ

header("location: index.php?contact=2");//Перенаправляем пользователя
exit;//к сообщениею об успешной отправки
}
//--------------ОБРАБОТЧИК КОНТАКТОВ

В коде нет никаких условий по отправки, так что если вы скопируете его без изменений, то он будет отправлять сообщения и в базу данных и на почту (test@test.ru) Так что выберите один из способов и удалите лишний Так же хочу заметить, что отправка по почте происходит по самой простейшей форме. Надеюсь Вам статья оказалась хоть немного полезной, у меня все, удачи Вам!

Исходник
 

Комментарии (13)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Алексей, 22 Апреля 2012 г. 16:50 пишет:
Читатель
А нельзя сразу два? Ну, на всякий случай?)
Rio-Shaman, 22 Апреля 2012 г. 17:43 пишет:
Автор
Почтовый ящик только смените на свой ( вместо test@test.ru ). Я не пробовал, но думаю, что будет отправлять и в БД и на почту.
Ответ для пользователя: Алексей
Анастасия, 24 Июля 2012 г. 22:37 пишет:
Читатель
А сама форма с главной страницей связывается? У меня на главной никакой ссылки, и форма появляется только если вбиваешь непосредственно index.php?contact=1
Rio-Shaman, 25 Июля 2012 г. 08:11 пишет:
Автор
В админ модуле меню можно будет создавать пункты с прямыми ссылками. То есть Вам необходимо будет создать в админ панели пункт "Контакты" а в ссылке к пункту прописать адрес " index.php?contact=1"
Ответ для пользователя: Анастасия
Юрий, 09 Октября 2012 г. 11:14 пишет:
Гость
НА почту не приходит сообщение после отправки
Rio-Shaman, 09 Октября 2012 г. 13:06 пишет:
Автор
Вполне возможно что на сервере отключена работа с mail()
Ответ для пользователя: Юрий
RS-userZzz, 02 Февраля 2013 г. 20:09 пишет:
Гость
Rio-Shaman, помоги пожалуйста, я сейчас переделываю твой блог(по урокам, в них изменяю код).Я хочу установить на сайт(точнее уже начал, сейчас на 1 этапе) возможность регистрации пользователей(вот уроки: http://ruseller.com/project.php?id=5).Мне нужно что-бы пользователь не вводил имя в строку, а там был-бы его ник из таблицы users(он автоматически-бы ставился).Мне это нужно на форму Контакты, а так-же модуль комментарии.Я прошу помоги, пожалуйста:(
Rio-Shaman, 04 Февраля 2013 г. 10:42 пишет:
Автор
Для этого Вам понадобится в модуле вывода формы (Функция contact()) организовать поиск и замену код-слов, которые Вы вставите в шаблон. Выводите пользователя из БД после чего вставляйте вместо код-слов либо данные пользователя, либо какой либо стандартный текст, или пустоту...
Ответ для пользователя: RS-userZzz
Андрей, 17 Ноября 2013 г. 16:03 пишет:
Гость
Напишите пожалуйста как сделать проверку на правильность заполнение поля: email, и на пустоту других полей, например "Имя*", пожалуйста напишите.
Алексей, 18 Ноября 2013 г. 10:20 пишет:
Автор
Вот такую функцию, для проверки email использую я:
function check_email($email)
    {
        if (preg_match("/^[-_\.A-Za-z0-9]{1,25}@[-_\.A-Za-z0-9]{1,25}\.[a-z]{2,5}$/", $email))
            return TRUE;
        else
            return FALSE;        
    }
По поводу имени, можно использовать вот такую функцию:
function check_field($field)
    {
        if (!empty($field))
            return TRUE;
        else
            return FALSE;        
    }
Ответ для пользователя: Андрей
я, 08 Марта 2014 г. 15:38 пишет:
Гость
а у меня при переходе на index.php?contact=1 пишет, что обнаружена циклическая переадресация,и не выводит форму
Алексей, 11 Марта 2014 г. 10:10 пишет:
Автор
С исходниками которые я выложил в этой статье, у Вас такая же проблема?
Ответ для пользователя: я
я, 22 Марта 2014 г. 17:20 пишет:
Гость
все нормально, получилось