PHP

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

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

Решение
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). Использовать такой метод проще, чем следить за этим событием с помощью отдельной переменной, особенно, если поток сложный или реализуется с помощью множества функций. В примере 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 '<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')
);
Теги:
формы
Добавлено: 22 Июля 2018 10:45:58 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...