Поиск

Многостраничная форма для сбора информации

Проведение опросов и сбор информации в Internet — прекрасные примеры многостраничных форм. Как правило, объем содержимого таких форм слишком велик, чтобы вся информация смогла уместиться на одной странице, поэтому его делят на несколько страниц по некоторому принципу, например по категориям.

Ниже рассматриваются примеры форм для проведения простого опроса, предназначенного для выяснения некоторых аспектов индивидуальности пользователей. Этот опрос состоит из четырех различных форм, но при желании их число можно легко изменить. Итак, вот как распределены функции между этими четырьмя формами.

  1. Ряд вопросов общего характера, которые иногда используются для выяснения типа личности.
  2. Некоторые конкретные вопросы о привычках и вопрос, основанный на ответах, содержащихся на первой странице исследования.
  3. Форма, позволяющая ввести имя и комментарии относительно данного исследования.
  4. Сообщение, содержащее благодарность, которое выводится по завершении исследования.

Для реализации всех четырех функций используется одна и та же CGI-программа. Именно она (в зависимости от номера текущей страницы) принимает решение о том, какая страница будет открыта следующей. Ядро программы представлено в листинге 19.1.

Включение в текст программы директивы
use CGI:: Carp qw(fatalsToBrowser);
заставляет CGI-программу выдавать сообщения, являющиеся частью Web-страницы, но которые обычно относятся к файлу системного журнала Web-сервера. При написании больших CGI-программ подобные директивы могут облегчить процесс отладки.

Результаты опроса сохраняются в текстовом файле, но не отображаются этой программой. Данная программа просто собирает ответы и сохраняет их в файле для дальнейшего использования. А для отображения результатов вам придется написать другую CGI-программу.

Проведем анализ программы.

  • Строки 6—8. Во время проведения опроса каждая HTML-форма содержит поля ввода. Имена всех полей собраны в используемом здесь массиве. Этот массив имен позже будет использован в функциях save() и repeat hidden().
  • Строки 12—13. Если эта CGl-программа вызывается без параметров, т.е. не для обработки данных формы, вызывается функция page_one(), предназначенная для вывода первой формы для проведения опроса.
  • Строки 14—17. Если этой CGI-программе передается параметр HTML-формы, именуемый pageone, вызывается функция page_two(). Если же передается параметр pagetwo, вызывается функция page_three().
  • Строка 19. Если этой CGI-программе передаются параметры HTML-формы, но они не являются параметрами pageone или pagetwo, то это означает, что нужно завершить выполнение опроса. В этом случае с помощью функции survey_done() сохраняются результаты опроса, и его участнику выводится сообщение с благодарностью.

На каждой странице предусмотрены кнопки, обеспечивающие загрузку следующей формы, как показано на рис. 19.4. Поскольку имя кнопки передается CGI-программе как параметр, его можно использовать для отображения номера страницы, данные которой были только что переданы программе.

В листинге 19.2 вы найдете продолжение CGI-программы для проведения опроса.

  • Строки 22~44 представляют собой новую конструкцию языка Perl, с которой вы еще не встречались. Она называется встроенным документом (inline document). Эта конструкция позволяет определить текстовую строку, которая служит признаком конца документа в программе. Примечательно то, что встроенные документы можно помещать прямо в программы на Perl, располагать их на нескольких физических строках, включать в них переменные Perl, которые замещаются как и в обычных строках, заключенных в двойные кавычки. Чтобы начать встроенный документ, используйте символы «, за которыми должно следовать любое слово или текстовая строка. Документ продолжается до тех пор, пока не встретится следующее вхождение указанного слова, расположенного в начале строки, как показано в следующем примере:

    За словом, идентифицирующим начало встроенного документа (в предыдущем примере — это строка END_OF_QUOTE, а в листинге 19.2 — END_PAGE_ONE), должна стоять точка с запятой. В конце встроенного документа это слово должно начинаться с первой колонки и не должно иметь "в хвосте" никаких символов типа пробелов или точек с запятой. Внутри встроенного документа переменные ведут себя так же, как и в обычных строках, заключенных в двойные кавычки ("")- Таким образом, во встроенных документах нужно осторожно использовать символы $ и @.

    С помощью встроенных документов в программы на Perl можно встраивать большие фрагменты HTML-кода, что избавит вас от необходимости возиться с символами двойных кавычек, множеством операторов PRINT и т.п.

Функция, представленная в листинге 19.2, просто выводит HTML-форму. В дескрипторе <FORM> не указан какой бы то ни было метод или сценарий обработки данных формы. Поэтому при нажатии кнопки запроса сервер повторно запустит ту же CGI-программу, которая сгенерировала форму. Если не задан атрибут method, используется стандартный метод GET.

Обратите внимание, что кнопке запроса в форме присвоено имя pageone. При передаче данных этой формы CGI-программе будет послан параметр с именем pageone; в данном случае его значение не важно. Именно сам передаваемый параметр является определяюшим фактором для загрузки CGI-программой второй страницы.

Следующий фрагмент CGI-программы сбора информации приведен в листинге 19.3.

  • Строка 47. Как ясно из комментария в строке 46, функция в этой строке помешает значения всех полей предыдущей формы в скрытые поля текущей формы. Массив @survey__answers содержит все возможные значения атрибута "name=" в HTML-формах. При первом выполнении CGI-программы большинство из этих полей еще не определено, поскольку относящиеся к ним части опроса еще не проведены.
  • Строки 48—49. Проверяются все возможные параметры формы, которые перечислены в массиве @survey_ answers. Если параметр определен, то его значение помещается в скрытое поле. При этом используется дескриптор HTML<INPUT TYPE=hidden>.
  • Строки 56—60. Эта функция вызывается для вывода второй страницы формы. Если первая страница была заполнена правильно, параметр param('pettype') будет иметь значение dog или cat, которое помешается в переменную $pet. Если же участник исследования проигнорирует этот вопрос и параметр param('pettype') останется неопределенным, будет использовано стандартное значение goldfish.
  • Строки 61~76. Выводится остальная часть второй страницы формы, и параметр $pet подставляется в вопрос. Таким образом, данный вопрос зависит от ответов пользователя, которые он сделал на первой странице.
  • Строка 77. Все параметры HTML-формы из первой страницы переносятся в эту форму как скрытые поля.

Если проанализировать форму на данном этапе (на момент формирования второй страницы), то окажется, что все ответы из первой страницы хранятся как скрытые поля в конце второй страницы формы. Программа вывода третьей страницы формы представлена в листинге 19.4.

Функция page_three довольно проста: она лишь выводит в форме текстовое поле и сообщение. А в конце снова вызывает функцию repeat_hidden(), чтобы поместить все скрытые поля на третью страницу формы. Последняя часть CGI-программы представлена в листинге 19.5.

  • Строка 96. Данная функция вызывается для вывода слов благодарности за участие в опросе. Это всегда стоит делать, особенно если анкета занимает несколько страниц. Для сохранения данных в файл вызывается функция save().
  • Строка 103. Функция save() — это практически двойник функции save(), описанной на 18-м занятии, "Основы обработки форм". Она блокирует файл базы данных с помощью функции get_lock(), записывает в него ответы пользователя с помошью фрагмента, аналогичного используемому в функции repeat_hidden(), а затем снимает блокировку с файла путем вызова функции release_lock().

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