Январь 21, 2006

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

Включения на стороне CGI.

Технология включений не стороне CGI (назовем ее CSI) подразумевает включение специальных кусков кода в HTML документы, очень похожих на SSI. Этот код обрабатывает специальный CGI-сценарий, который заменяет их на конкретные данные, позволяющие сохранять контекст.

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

<html>
<head><title></title></head>
<body>
<ul>
<li><a href="/cgi-bin/takeit.cgi?cookie=
<!--#insert var="COOKIE"-->&film_id=1">
Ну, погоди!</a>
<li><a href="/cgi-bin/takeit.cgi?cookie=
<!--#insert var="COOKIE"-->&film_id=2">
Колобок</a></ul>
<a href="/cgi-bin/csi.pl/next.html?cookie=
<!--#insert var="COOKIE"-->">Далее</a>
<form action="/cgi-bin/buyit.cgi?cookie=
<!--#insert var="COOKIE"-->" method=post>
Ваше имя: <input type="text"
name="name"><br>
<input type="submit" value="Купить">
</form>
</body></html>

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

Для обработки CSI вызывается сценарий, имя документа передается ему также, как и в случае скрытых полей:

http://www.your.sever.ru/cgi-bin/csi.pl/film_cathalog.html

Сам сценарий обработки CSI выглядит примерно так:

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
local($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",
hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",
hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
$FORM_DATA{$name} = $value;
}

$cookie = $FORM_DATA{'cookie'};
$cookie = join("_", $ENV{'REMOTE_HOST'}, time)
if (!$cookie);
$cookie =~ s/(\W)/sprintf("%%%x", ord($1))/eg;

$form_file = $ENV{'PATH_INFO'};
$full_path = "/usr/local/etc/httpd/htdocs" .
$form_file;

open(FILE, "<" . $full_path);
while (<FILE>) {
while ( ($command, $argument, $parameter) =
(/<!--\s*#\s*(\w+)\s+(\w+)\s*=\s*"?
(\w+)"?\s*-->/io) ) {
if ($command eq "insert") {
if ($argument eq "var") {
if ($parameter eq "COOKIE") {
s//$cookie/;
} elsif ($parameter eq "DATE_TIME") {
local ($time) = &get_date_time();
s//$time/;
} else {
s///;
}
}
}
print;
}
close(FILE);

В моем случае поддерживаются только команды insert с аргументом var и двумя параметрами: COOKIE и DATE_TIME. Но Вы можете ввести любые необходимые Вам команды, аргументы и параметры. Только следите при этом за отсутствием совпадений с SSI.

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

Часть 2

Окончание

Разместил:

Источник: CodeNet

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

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

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