Когда возникает проблема с данными, введенными в форму, необходимо напечатать сообщения об ошибках рядом с проблемными полями, вместо генерации сообщения об ошибке в начале формы. Также требуется сохранить значения, которые пользователь напечатал в форме сначала.
Cохраните сообщения в массиве $errors, индексируя их по именам полей.
if (! pc_validate_zipcode($_REQUEST['zipcode'])) {
$errors['zipcode'] = "This is is a bad ZIP Code. ZIP Codes must "
. "have 5 numbers and no letters.";
}
При повторном выводе формы можно показывать каждую ошибку с помощью поля, помещая в него исходное значение:
echo $errors['zipcode'];
$value = isset($_REQUEST['zipcode']) ?
htmlentities($_REQUEST['zipcode']) : '';
echo "<input type=\"text\" name=\"zipcode\" value=\"$value\">";
Если пользователи сталкиваются с ошибками при заполнении длинной формы, то можно повысить общее удобство и простоту использования формы, четко выделяя место, где нужно исправить ошибки.
Объединение всех ошибок в одном массиве дает много преимуществ.
Прежде всего, нетрудно определить, нашлись ли в результате проверки на достоверность информации какие-либо элементы, требующие
исправления; просто используйте функцию count($errors). Использовать такой метод проще, чем следить за этим событием с помощью отдельной переменной, особенно, если поток сложный или реализуется с
помощью множества функций. В примере: pc_validate_form() показана функция проверки на достоверность pc_validate_form(), которая использует массив $errors.
Пример pc_validate_form()
function pc_validate_form() {
if (! pc_validate_zipcode($_POST['zipcode'])) {
$errors['zipcode'] = "ZIP Codes are 5 numbers";
}
if (! pc_validate_email($_POST['email'])) {
$errors['email'] = "Email addresses look like user@example.com";
}
return $errors;
}
Это ясный код, поскольку все ошибки сохраняются в одной переменной. Переменную можно легко передать куда угодно, если вы не хотите, чтобы она находилась в глобальной области видимости.
Использование имени переменной в качестве ключа сохраняет связи
между полем, которое явилось причиной ошибки, и самим сообщением об ошибке. Эти связи также облегчают выполнение цикла по элементам при показе ошибок.
Можно автоматизировать скучную задачу вывода формы. Функция
pc_print_form() в примере: pc_print_form() показывает, как это сделать.
Пример pc_print_form():
function pc_print_form($errors) {
$fields = array('name' => 'Name',
'rank' => 'Rank',
'serial' => 'Serial');
if (count($errors)) {
echo 'Please correct the errors in the form below.';
}
echo '<table>';
// выводим ошибки и переменные формы
foreach ($fields as $field => $field_name) {
// открываем строку
echo '<tr><td>';
// печатаем ошибку
if (!empty($errors[$field])) {
echo $errors[$field];
} else {
echo ' '; // чтобы не портить внешний вид таблиц
}
echo "</td><td>";
// печатаем имя и введенную информацию
$value = isset($_REQUEST[$field]) ?
htmlentities($_REQUEST[$field]) : '';
echo "$field_name: ";
echo "<input type=\"text\" name=\"$field\" value=\"$value\">";
echo '</td></tr>';
}
echo '</table>';
}
Сложная часть функции pc_print_form() начинается с массива $fields.
Ключ – это имя переменной; значением является подходящее для показа имя поля. Определив их в начале функции, можно создать цикл
по значениям с помощью оператора foreach; в противном случае понадобятся три отдельные строки с идентичным кодом. К этому добавляется
использование имени переменной в качестве ключа в массиве $errors,
поскольку можно найти сообщение об ошибке внутри цикла, просто
проверяя элемент $errors[$field].
Если необходимо распространить этот пример на поля ввода, отличные от text, модифицируйте массив $fields, включив дополнительную
метаинформацию о полях формы:
$fields = array('name' => array('name' => 'Name', 'type' => 'text'),
'rank' => array('name' => 'Rank', 'type' => 'password'),
'serial' => array('name' => 'Serial', 'type' => 'hidden')
);