Разработчику. Сборник рецептов 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). Использовать такой метод проще, чем следить за этим событием с помощью отдельной переменной, особенно, если поток сложный или реализуется с помощью множества функций. В примере: 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 '&nbsp;'; // чтобы не портить внешний вид таблиц

}

     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')
          );

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ