Январь 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