Повторный вывод форм с информацией и сообщениями об ошибках

Задача
Когда возникает проблема с данными, введенными в форму, необходимо напечатать сообщения об ошибках рядом с проблемными полями, вместо генерации сообщения об ошибке в начале формы. Также требуется сохранить значения, которые пользователь напечатал в форме сначала.

Решение
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 "";

Обсуждение
Если пользователи сталкиваются с ошибками при заполнении длинной формы, то можно повысить общее удобство и простоту использования формы, четко выделяя место, где нужно исправить ошибки.

Объединение всех ошибок в одном массиве дает много преимуществ.


Прежде всего, нетрудно определить, нашлись ли в результате проверки на достоверность информации какие-либо элементы, требующие исправления; просто используйте функцию count($errors). Использовать такой метод проще, чем следить за этим событием с помощью отдельной переменной, особенно, если поток сложный или реализуется с помощью множества функций. В примере 9.4 показана функция проверки на достоверность pc_validate_form(), которая использует массив $errors.

Пример 9.4. 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() в примере 9.5 показывает, как это сделать.

Пример 9.5. 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 '';
// выводим ошибки и переменные формы
foreach ($fields as $field => $field_name) {
// открываем строку
echo '';
}
echo '
';
// печатаем ошибку
if (!empty($errors[$field])) {
echo $errors[$field];
} else {
echo ' '; // чтобы не портить внешний вид таблиц
}
echo "
";
// печатаем имя и введенную информацию
$value = isset($_REQUEST[$field]) ?
htmlentities($_REQUEST[$field]) : '';
echo "$field_name: ";
echo "";
echo '
';
}

Сложная часть функции 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')
);

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Защита от многократной отправки одной и той же формы
Использование элементов формы с несколькими вариантами значений
Кэширование запросов и результатов
Обработка внешних переменных с точками в именах
Обработка загруженных файлов

Вернуться в раздел: PHP / 9. Формы