Январь 18, 2006

Взаимодействие нескольких форм

Введение

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

Хрестоматийным примером при обсуждении этого вопроса является система заказа товаров (виртуальный магазин). Не будем изменять традициям, рассмотрим данный пример.

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

Существует несколько стратегий, позволяющих осуществить сохранение контекста. Ими являются:

Скрытые поля. Используя скрытые поля, можно включать невидимую информацию в форму, посылаемую следующему CGI-сценарию.

Включения на стороне CGI. Этот механизм позволяет вставлять в документ специальные тэги, незаметно для пользователя передающие CGI переменные.

Cookies. Данный механизм позволяет сохранять определенную информацию на стороне клиента.

Существует также четвертый способ - создать специальный cookie-сервер, с которым будет взаимодействовать каждый CGI-сценарий.

Скрытые поля формы

Скрытые поля позволяют хранить "невидимую" информацию в форме документа. Такие поля не отображаются браузером, но это вовсе не означает, что информация спрятана, любой может увидеть ее, вызвав опцию браузера "View Source". Таким образом скрытые поля нельзя использовать в целях безопасности, а можно только в целях прозрачной передачи информации.

Приведу пример определения двух скрытых полей формы:

<form action="/cgi-bin/sendmail.pl" method="post">
...
<input type="hidden" name="mail_to"
value="andrey@novikov.com">
<input type="hidden" name="subject"
value="Test letter">
...
</form>

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

Простейшим способом использования скрытых полей для сохранения контекста является запись данных формы в скрытые поля следующей формы. Приведу пример первой формы:

<form action="/cgi-bin/firststep.pl" method="post">
Введите Ваше имя: <input type="text" name="realname">
<br>
Введите Ваш адрес: <input type="text" name="email">
<br>
<input type="submit" name="Send"
value="Следующий шаг">
<input type="reset" name="Reset" value="Очистить">
</form>

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

<form action="/cgi-bin/secondstep.pl" method="post">
<input type="hidden" name="realname"
value="Андрей Новиков">
<input type="hidden" name="email"
value="andrey@novikov.com">
Город проживания: <input type="text" name="city">
<br>
<input type="submit" name="Send"
value="Следующий шаг">
<input type="reset" name="Reset" value="Очистить">
</form>

И так до самого конца. Достоинством такого подхода является отсутствие необходимости временных файлов и "волшебных cookies". С другой стороны недостатком такого подхода авляется снижение производительности при обработке форм с большим количеством полей.

продолжение следует...

Часть 2

Разместил:

Источник: CodeNet

Ваш комментарий

Обсудить на форуме?

Подумайте, прежде чем высказать своё мнение. Постарайтесь сделать свой комментарий полезным для других. Не используйте ненормативную лексику. Пользователи, пишущие "от нечего делать" бессмысленные наборы символов, будут блокироваться навсегда.