Сигурен съм че всички сме виждали лошо направени форми обратна връзка – когато объркаш нещо и си натиснал „потвърди” на нова страница виждаш грешка(разбира се без да се казва къде) и след връщането на предишната страница, за да поправиш незнайната грешка, се оказва че трябва да въведеш всичко наново, защото полетата не са запомнени! Това е едно от нещата, различаващи добре направеният уебсайт от аматьорската изработка. Тук ще ви предложа идея за реализирането на такава форма за обратна връзка с помощта на езика РНР бързо и гъвкаво.
Както във всеки друг език за програмиране, така и в РНР функциите са нещо много важно. Съветвам ви да ползвате функции – добре написаните такива са лесни за повторна употреба и реализацията става „чисто”. Няма да се спирам върху отделните оператори, тъй като тук предполагам че сте запознати със синтаксиса на този език.
Част І - инициализация
Тук поставяте обработката(ако има такава) на параметрите предавани с GET метод. Ползвайте mysql_escape_string() или real_mysql_escape_string() за да се предпазите от атаки. Преди всичко ако имате бутон „Върни се в началото” или „Отказ”, сложете първо неговата проверка.
if (isset($_POST[‘cancel’]))
{
header("location: index.php");
die();
}
Също така нека въведем два масива postFields и classFields. В първия описваме полетата и вида грешка, която трябва да се провери, а във втория ще запишем грешката, която трябва да се изведе.
$postFields = array(
array (
'field_name' => 'autor',
'validator'=> 'is_Empty' ,
'err_type' => 'AUTOR'
),
array (
'field_name' => 'text',
'validator' => 'is_Empty' ,
'err_type' => 'TEXT'
),
array (
'field_name' => 'title',
'validator' => 'is_Empty' ,
'err_type' => 'TITLE'
),
array (
'field_name' => 'mail',
'validator' => 'is_Email',
'err_type' => 'EMAIL'
)
);
$classFields = array();
Част ІІ - визуализация
Първата функция която правим е output_form. Целта и е да визуализира всичко, което е нужно да се види от потребителя. Тя ще изведе и това, което е записано в масива classFields, ако има нещо там.
function output_form()
{
global $classFields;
?>
<FORM method="post">
<strong> За запитвания и коментари:</strong><br><br>
<strong>Относно* </strong> :
<INPUT type="text" name="title" size="63" value="<?=(isset($_POST['title']))?$_POST['title']:'' ?>">
/* =============Тук e проверкатата на полето================= */
<? if (isset($classFields['title'])) echo "<br>".$classFields['title']; ? >
/* =============Край на проверката======================== */
<br><br>
<strong>Телефон </strong> :
<INPUT type="text" name="tel" size="63" value="<?=(isset($_POST['tel']))?$_POST['tel']:'' ?>">
<br><br>
<strong>Автор*</strong> :
<INPUT type="text" name="autor" size="24" value="<?=(isset($_POST['autor']))?$_POST['autor']:'' ?>">
<strong>e-mail*</strong> :
<INPUT type="text" name="mail" size="25" value="<?=(isset($_POST['mail']))?$_POST['mail']:'' ?>">
<br>
/* =============Тук e проверкатата на полето================= */
<? if (isset($classFields['autor'])) echo "<br>".$classFields['autor'];
if (isset($classFields['mail'])) echo "<br>".$classFields['mail']; ?>
/* =============Край на проверката======================== */
<br><br>
<strong>Текст*</strong> :<br>
<TEXTAREA name="text" cols="57" rows="10"><?=(isset($_POST['text']))?$_POST['text']:'' ?></TEXTAREA><br>
/* =============Тук e проверкатата на полето================= */
<? if (isset($classFields['text'])) echo "<br>".$classFields['text']; ? >
/* =============Край на проверката======================== */
<br>
<INPUT TYPE="submit" NAME="submit" VALUE="Публикувай">
<br> Забележка : Със * са означени полетата, задължителни за попълване при изпращане на запитването.
</FORM>
<?php
}
Пояснения: При извеждането, ако параметърът check не е зададен, т.е. е лъжа, нито една от проверките няма да се изпълни. Може да въведете допълнителни проверки в зависимост от естеството на формата за обратна връзка. Функцията err() ще дефинирам м следващата част.
Част ІІІ - проверки
Ще дефинирам 4 функции. Първата е is_correct () – тя ще служи за проверка за валидността на формата и ще връща лъжа ако нещо не е попълнено правилно. Също така тя обхожда масива postFields, като определя кое поле е сгрешено и ако има такова записва грешката, която трябва да се изведе в масива classFields.
Функцията err() връща при зададен тип грешка точния и HTML формат. Ползата от тази функция не е само намаляването на обема на програмния код, но също така тя може да направи проверката независима от избрания език. Ако текущият език се предава с GET метод, ползвайки променлива $lang, то може err(‘TEXT’) да извежда грешка на различен език в зависимост от $lang. Конкретната модификация оставям на читателя. Функциите is_Empty и is_Email проверяват съответно дали предаденият им стринг е празен или е коректен електронен адрес.
function is_Empty($str)
{
if (empty($str))
return true;
return false;
}
function is_Email($str)
{
if (@eregi('^[a-zA-Z0-9_-.]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$', $str) || empty($str))
return true;
return false;
}
function err($err)
{
if (isset($err))
switch ($err){
case 'TITLE' : return '<font color="red">Не е въведено заглавие</font>';
break;
case 'TEXT' : return '<font color="red">Не е въведен текст</font>';
break;
case 'EMAIL' : return '<font color="red">Не е въведен коректен e-mail</font>';
break;
case 'AUTOR' : return '<font color="red">Не е попълнен автор</font>';
break;
}
}
function is_correct()
{
global $postFields, $classFields;
$flag = true;
foreach($postFields as $postField)
if(isset($postField['validator']))
if (call_user_func($postField['validator'], $_POST[$postField['field_name']]))
{
$classFields[$postField['field_name']] = err($postField['err_type']);
$flag = false;
}
return $flag;
}
Част ІV - същинска част
Сега е време да се запознаем с основния алгоритъм. Важно е при първо стартиране на скрипта проверката да не се осъществи. След натискане на бутона всички попълнени полета да си останат такива и за некоректно попълнените да се визуализира грешка под тях. Много лоша практика е ако нещо е сгрешено да показвате на нова страница че е имало грешка, както и възможност за връщане. Дори да са запомнени полетата тази излишна страница дразни потребителя, като той трябва да запомни точно какво е сгрешил, връщайки се назад. За да нещата да се направят професионално е нужно единствено да се съобрази, че проверка е нужна само при натискате на бутона и в никой друг случай. Ето кода:
if (!isset($_POST['submit']))
output_form ();
else if (!is_correct())
output_form ();
else
{
/* Тук идва кода, който се изпълнява при вярно попълнени полета */
}
Пояснения: Ако не е натиснат бутон формата се показва за първи път и се стартира функцията output_form(), но тъй като функцията is_correct не е била стартирана няма да се изведат грешки. Ако е натиснат бутона "Публикувай" се проверява дали всичко е попълнено вярно и ако не е, се визуализира всичко отново, но вече с показване на грешките. Ако всичко е вярно попълнено, то е време да напишете какво всъщност ще изпълнява формата на мястото на коментара.
За да използвате повторно кода е нужно да промените 2 неща. Първо да зададете масива postField с новите полета и второ да промените кода в output_form() там където е нужно. Спокойно този метод може да се използва за големи и дълги форми за обратна връзка или за анкети.