2012-07-02 4 views
1

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

Это то, что моя система делает, как только вы отправляете форму, вся информация отправляется классу, который обладает всеми данными и проверяет его. Он также сохраняет значение этого поля $_SESSION['userUpdate']['firstName'][1] = $firstName;

Если есть ошибка, он создает переменную сеанса, такую ​​как $_SESSION['userUpdate']['firstName'][0] = 1;, 1 сообщает, что поле было пустым. Если нет ошибки, переменная сеанса будет равна 0.

Если ошибок, обнаруженных в процессе проверки, не отправлены в базу данных.

После этого страница форма перезагружается:

header('HTTP/1.1 303 See Other'); 
header('Location: '.curPageURL().''); 

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

Затем с большим количеством/else if/else я проверяю значения переменных сеанса и ошибки вывода, а также заполняю форму данными, введенными ранее.

Позвольте мне показать вам пример для поля firstname.

Это HTML код:

<label for="firstName" class="block">First Name</label> 
<span>Your first name goes here.</span><?php echo $text_first_name ?> 
<input type="text" id="firstName" class="mediaText" name="firstName" value="<?php echo $first_name2; ?>" onchange="needToConfirm=true" <?php echo $style_first_name ?> /> 

Это процесс проверки классом:

$_SESSION['ui']['first_name'][1] = $this->first_name; 
if (isset($this->first_name)) 
    { 
     if($this->first_name == NULL) 
     { 
      $_SESSION['ui']['first_name'][0] = 1; 
     } 
     else if(minRange(3, $this->first_name)) 
     { 
      $_SESSION['ui']['first_name'][0] = 2; 
     } 
     else 
     { 
      array_push($set, "FirstName = '".$db->sql_escape($this->first_name)."'"); 
     } 
    } 

Это код PHP, который обрабатывает возможные ошибки:

$error_bg = "style=\"background:#EE5C42\""; 

//FIRST NAME 
if($_SESSION['ui']['first_name'][0] == 1) 
{ 
    $style_first_name = $error_bg; 
    $first_name2 = $_SESSION['ui']['first_name'][1]; 
} 
else if($_SESSION['ui']['first_name'][0] == 2) 
{ 
    $style_first_name = $error_bg; 
    $first_name2 = $_SESSION['ui']['first_name'][1]; 
    $text_first_name = "<span class=\"errorText\">Your first name must consist of at least 3 characters.</span>"; 
} 
else 
{ 
    $first_name2 = $userdetails["FirstName"]; 
} 

В конце страницы есть небольшая функция для отмены переменных сеанса.

Мне интересно, есть ли способ сделать это проще и легче вставать и работать?

+2

"* perfect form *"? – Lion

+0

Возможно, не правильный термометр, который я выбрал там. Может быть, «хорошая форма» более уместна. –

+0

Ваш вопрос не подходит для так, так как так не оценил вопрос, который касается «что лучше» или «идеально» –

ответ

1

Если вы просите совет по оптимизации кода, вот как я бы это сделать:

// so you have bunch of error codes 
$possible_errors = array(
    '0' => '', // No error 
    '1' => '', // Error, but no error message 
    '2' => 'Your %s must consists of at least 3 characters', 
    ... 
); 

// then you have form fields stored in session 
// fields in session should be named like the keys in $userdetails 
// 'formName' => array('FirstName' => array(0, 'German'), 'LastName' => array('1', '')) 
$errors = $values = array(); 
foreach ($_SESSION['formName'] as $field => $element) { 
    if ($element[0] > 0) { // Has error 
     $error_code = $element[0]; 
     $error_message = $possible_errors[$error_code]; 
     if (!empty($error_message)) { 
      $errors[$field] = sprintf($error_message, $field); 
     } 
    } else { 
     $values[$field] = $userdetails[$field]; 
    } 
} 

// in here you end up with two arrays: 
// - $errors Error messages keyed by field name 
// - $values Values keyed by field name 
// You use them like this 
<label for="firstName" class="block">First Name</label> 
<span>Your first name goes here.</span><?php if (array_key_exists('FirstName', $errors)) echo $errors['FirstName']; ?> 
<input type="text" id="firstName" class="mediaText" name="firstName" 
    value="<?php echo $values['FirstName']; ?>" 
    onchange="needToConfirm=true" 
    <?php if(array_key_exists('FirstName', $errors)):?>style="background:#EE5C42"<?php endif;?> /> 
+0

Большое спасибо, это именно то, что я хотел :) –

0

Я бы рекомендовал добавить в какой-то стороне клиента проверки, используя очень хороший Bassistance jQuery Validate plugin.

+0

У меня уже есть это на месте, но я хочу, чтобы каждый пользователь имел большой опыт, с или без JQuery. –