Лучшая практика для обработки форм

Мне было интересно, что лучше всего подходит для обработки форм?

В моем случае я делаю что-то вроде этого:

  • если пользователь не отправил форму
    • отобразить форму
  • еще
    • если есть ошибки формы
      • ошибки отображения
      • отобразить форму снова
    • еще
      • отобразить сообщение об успешном завершении
      • (и) снова отобразить форму

Моя проблема в том, что я повторяю HTML-код для формы 3 раза, и я не думаю, что это хорошая практика (длинный файл, который трудно читать).

Solutions Collecting From Web of "Лучшая практика для обработки форм"

Вы должны следовать шаблону Post / Redirect / Get , чтобы предотвратить дублирование формы.

Вы можете интегрировать этот шаблон с обработкой ошибок и успешным отображением сообщений таким образом:

if POST_REQUEST: ERRORS = VALIDATE_FORM() if ERRORS IS EMPTY: PROCESS_REQUEST REDIRECT TO <Successful URL> DISPLAY_FORM(ERRORS) 

Это возможные сценарии:

  • Получить запрос по адресу формы:
    POST_REQUEST является ложным, и поэтому вы просто показываете форму без ошибок (так что обычная пустая форма)
  • Подача формы с ошибками:
    POST_REQUEST – это правда, вы подтверждаете форму. В этом случае некоторые ошибки будут возвращены в переменной ERRORS (возможно, в массиве). Переменная ERRORS не пуста, поэтому вы просто показываете форму с отображаемыми сообщениями об ошибках
  • Правильная подача формы:
    POST_REQUEST – это правда, и вы подтверждаете форму. Поскольку на этот раз форма действительна, переменная ERRORS будет пустой, и вы выполните перенаправление на <Успешный URL>, который отобразит успешное сообщение пользователю.

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

Django Framework предлагает обрабатывать формы таким образом.

Хорошим способом обработки ошибок в отображении формы является функция VALIDATE_FORM (), возвращающая ассоциативный массив ошибок, где каждый ключ является именем поля, а соответствующий элемент представляет собой массив сообщений об ошибках.

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

Таким образом, вы можете, например, отображать ошибки таким образом в функции DISPLAY_FORM ():

 <ul class="errors"><?php foreach(ERRORS['field_name'] as $error) { echo "<li>$error</li>"; } ?></ul> <input name="field_name" type="text" ... /> 

Ваш рабочий процесс выглядит правильно. Я не понимаю, почему вам нужно повторить HTML-код для формы. Реструктурируйте свой код, чтобы сообщение успеха отображалось в верхней части формы, если оно присутствует, и ошибки отображаются рядом с полями ввода, если они присутствуют. В верхней части вашего (PHP?) Файла обрабатывайте все и устанавливайте переменные, которые будут отображаться в форме ниже.

Вы можете использовать один и тот же код формы и просто отображать сообщение об ошибке / успехе над формой.

Послушай, это просто, как яйцо!
Просто выполните те же действия в другом порядке:

  • если пользователь отправил форму
    • если есть ошибки формы
      • заполнить массив ошибок
    • еще
      • записывать данные в базу данных
      • 302, как это требуется стандартом HTTP
      • Выход
  • если у нас есть некоторые ошибки
    • ошибки отображения
    • значения полей формы заполнения
  • отобразить форму

Если вы не можете жить без сообщения об успехе (совершенно бесполезная вещь, на мой взгляд), вы можете отобразить ее, используя параметр get (менее предпочтительный) или сеанс (оптимальный)

упс! это был старый.

вы можете разбить свой скрипт на две части:

  • один отображает форму

  • один получает данные формы, проверяет его и возвращает ошибки или сообщение об успешности

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

Учитывая, что в каждом случае вы показываете форму, можете ли вы просто отобразить ту же форму по умолчанию, а затем добавить дополнительные функции, такие как обмен сообщениями об ошибках и т. Д.?

Какие другие технологии вы используете?