Сегодня рассмотрим как обрабатывать формы на сайте на примере формы отправки письма.
В итоге у нас получится автоматический скрипт генерации формы и обработки формы с отправкой письма администратору.
С помощью HTML текста формируем необходимую нам форму.
<h2>Запрос на обратную связь</h2> <form method="POST"> <input type="text" name="email" value="mail@mail.ru"> <input type="SUBMIT" name="send" value="Отправить"> <input type="HIDDEN" name="alform" value="form"> </form>
Этот HTML текст отобразит нам в браузере форму с помощью которой мы можем предоставить пользователю возможность оставлять данные, в данном случае email для обратной связи.
Чтобы мы могли получить оставленный пользователем email, нам необходимо обратиться к переменной $_POST это переменная которая создается при начале выполнения скрипта PHP и в нее вносятся данные из формы которую мы предоставили пользователю, см. в тэг form там есть атрибут method его значение POST. И в случае нашей формы эта переменная принимает значения (это можно посмотреть с помощью кода echo ‘<pre>’.print_r($_POST,1).'</pre>’;).
Array
(
[email] => mail@mail.ru
[send] => Отправить
[alform] => form
)
Здесь самое важное понять имя элементов массива $_POST это значения атрибутов HTML тэгов <input>, если вы их не укажите тогда в переменной $_POST не будет элементов массива.
При таком не большом количестве элементов формы можно обращаться к значениям полей формы через прямой обращению к элементу массива $_POST
$email = $_POST['email'];
Но если форма большая или мы хотим сделать универсальный обработчик форм, тогда лучше использовать цикл foreach для массива $_POST
$msg = '';
foreach($_POST as $key => $val){
$msg.=$key.' = '.$val.'<br>';
}
В переменной $msg мы получим данные формы в виде
email = mail@mail.ru<br> send = Отправить<br> alform = form<br>
Если мы хотим вместо email, send получать нормальный осмысленный текст в переменной $msg, то нам необходимо создать ассоциативный массив, к примеру
$alform = array('email'=>'Почта клиента','send'=>'','alform'=>'');
и теперь в цикл можно добавить условие
$msg='';
foreach($_POST as $key => $val){
if($alform[$key]!='') $msg.= $alform[$key].' = '.$val.'<br>';
}
что нам даст в переменной следующий текст
Почта клиента = mail@mail.ru<br>
таким образом лишнее убрали.
Весь код целиком:
<?php
echo '<!DOCTYPE html><html><head><title>Обработка писем</title><meta charset="utf-8"></head><body>';
$alform = array('email'=>'Почта клиента','send'=>'','alform'=>'');
?>
<h2>Запрос на обратную связь</h2>
<form method="POST">
<input type="text" name="email" value="mail@mail.ru">
<input type="SUBMIT" name="send" value="Отправить">
<input type="HIDDEN" name="alform" value="form">
</form>
<?php
//echo '<pre>'.print_r($_POST,1).'</pre>';
if (isset($_POST['alform'])){
$msg='Получили сообщение с сайта:<br>';
foreach($_POST as $key => $val){
if($alform[$key]!='') $msg.= $alform[$key].' = '.$val.'<br>';
}
}
?>
Дальше переменную $msg можно отправить на почту администратору
$to = 'example@example.com'; $subject = 'Запрос на обратную связь'; $header = "From: noreply@example.com\r\n"; $header.= "MIME-Version: 1.0\r\n"; $header.= "Content-Type: text/plain; charset=utf-8\r\n"; $header.= "X-Priority: 1\r\n"; mail($to, $subject, $msg, $header);
Также можно сделать автоматическое создание HTML формы. Для этого нам потребуется создать массив и его обработать. Сам массив:
$alform = array(
'name'=>array('type'=>'text','eml_name'=>'Имя клиента','hlp_name'=>'Введите Ваше имя','sml_name'=>'Ваше имя','obyaz'=>1,'value'=>''),
'email'=>array('type'=>'text','eml_name'=>'Почтовый адрес клиента','hlp_name'=>'Введите Ваш адрес электронной почты','sml_name'=>'Ваш email','obyaz'=>1,'value'=>''),
'messa'=>array('type'=>'textarea','eml_name'=>'Сообщение клиента','hlp_name'=>'Введите Ваше сообщение','sml_name'=>'Сообщение','obyaz'=>0,'value'=>''),
'send'=>array('type'=>'submit','value'=>'Отправить'),
'alform'=>array('type'=>'hidden','value'=>'form'),
);
здесь учтены многие моменты и placeholderы для полей и обязательные поля.
Цикл который из массива сделает HTML форму следующий
echo '<style>
body{font-size:14px;}
input[type=text]{width:99%;padding:4px;}
textarea{width:99%;padding:4px;height:80px;}
</style>';
echo '<form method="POST">';
echo '<table cellpadding=0 cellspacing=0 width=400 align=center>';
foreach($alform as $key => $val){
echo '<tr>';
switch ($val['type']) {
case 'text':
echo '<td><b>'.$val['sml_name'].'</b>';
if($val['obyaz']) echo ' <span style="color:red;">*</span>';
echo '</td>';
echo '<td><input type="'.$val['type'].'" name="'.$key.'" value="'.$val['value'].'" placeholder="'.$val['hlp_name'].'"></td>';
break;
case 'textarea':
echo '<td><b>'.$val['sml_name'].'</b>';
if($val['obyaz']) echo ' <span style="color:red;">*</span>';
echo '</td>';
echo '<td><textarea name="'.$key.'" placeholder="'.$val['hlp_name'].'">'.$val['value'].'</textarea></td>';
break;
case 'submit':
echo '<td colspan="2" align="center"><input type="'.$val['type'].'" name="'.$key.'" value="'.$val['value'].'"></td>';
break;
case 'hidden':
echo ' <input type="'.$val['type'].'" name="'.$key.'" value="'.$val['value'].'">';
break;
}
echo '</tr>';
}
echo '</table>';
echo '</form>';
На странице форма будет выглядеть вот так. Оформление формы с помощью таблицы (так нагляднее), все практически ровненько и красиво.
при отправке данной формы мы получим следующий $_POST массив
Array
(
[name] => Александр
[email] => mail@mail.ru
[messa] => Сообщение написанное через форму на сайте
[send] => Отправить
[alform] => form
)
Теперь обработаем полученный $_POST массив
if (isset($_POST['alform'])){
$msg='Получили сообщение с сайта:<br>';
foreach($_POST as $key => $val){
if(isset($alform[$key])){ //Проверим есть ли такой элемент у нас в массиве
if($val!='') //проверим заполнил ли клиент поле
if(isset($alform[$key]['eml_name'])) //проверим есть ли текст для письма, чтобы служебные поля не писались
$msg.= $alform[$key]['eml_name'].' = '.$val.'<br>';
}
}
$to = 'example@example.com';
$subject = 'Запрос на обратную связь';
$header = "From: noreply@example.com\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/plain; charset=utf-8\r\n";
$header.= "X-Priority: 1\r\n";
mail($to, $subject, $msg, $header);
}
Таким образом мы отправили письмо на адрес example@example.com с содержимым
Получили сообщение с сайта: Имя клиента = Александр Почтовый адрес клиента = mail@mail.ru Сообщение клиента = Сообщение написанное через форму на сайте
Вот такой простой скрипт который автоматически формирует форму HTML и обрабатывает ее. Для редактирования формы необходимо добавить в массив $alform нужные элементы )