Лабораторная работа №4

    Здесь необходимо создать пакет программ, который моделирует работу современных электронных интернет магазинов. Программы должны быть написаны на языке Перл в стиле модуля CGI. Передача введенных в формы параметров между страницами HTML должна осуществляться кроме метода POST также и с помощью пакета cookie. После окончательного формирования заказа он должен быть передан по электронной почте с помощью программы sendmail в отдел комплектации (alex@ism.tup.km.ua). Ниже приведен пример такого пакета программ, который ограничен заказом только системных блоков компьютера. Студент должен расширить пакет программ с целью возможности заказа мониторов и принтеров.
    Мониторы можно рассмотреть двух производителей:
1.Samsung
1.1. 15" 550s Digital 1024x768  60
1.2. 17" 750s Digital 1280x1024 60
1.3. 17" 753DF TCO99  1280x1024 80
2.Samtron
2.1. 15" 55e Digital 1024X768  75
2.2. 17" 75e TCO95   1280x1024 60
    Принтеры можно рассматривать двух типов:
1.Стуйные
1.1. Epson Stylus 480
1.2. HP DJ 640C
1.3. Canon BJC-1000
2.Лазерные
2.1. HP LJ 1100
2.2. HP LJ 2100
2.3. Xerox P8ex

Тексты программ на языке Perl:

form1_l4.pl
#!/usr/bin/perl
#
# Этот скрипт предназначен для формирования предложений покупателю
#
# Загружаем модуль CGI
use CGI qw(:all);
# Формируем HTML страничку
print
header(-charset=>'Windows-1251'),
start_html(-title=>'form1_l4.pl',-text=>'#FFFFFF',-BGCOLOR=>'#2B6CA2'),
hr,
h1('Наши предложения:'),
# Создаем форму с радиокнопками
start_form(post,'../ismm25/form2_l4.pl'),
radio_group('radio_1',['Системные блоки','Принтеры','Мониторы'],
'Системные блоки','true'),
p,
hr,
submit('Войти в магазин'),
endform(),
end_html;

form2_l4.pl
#!/usr/bin/perl
#
# Этот скрипт предназначен для формирования системного блока
# компьютера из комплектующих. Для удобства работы используются
# всплывающие меню
#
# Загружаем модуль CGI
use CGI qw(:all);
# В переменную $radio_1 заносим значение выбора (сист.блок,принт.,монит.)
$radio_1=param('radio_1');
# Создаем пакет cookie с именем device и  временем жизни 5мин.
# для запоминания содержимого $radio_1
$cookie=cookie(-name=>'device',-value=>"$radio_1",-expires=>'+5m');
print
# Передаем cookie броузеру клиента
header(-charset=>'Windows-1251',cookie=>$cookie),
start_html(-title=>'form2_l4.pl',-text=>'#FFFFFF',-BGCOLOR=>'#2B6CA2');
# В зависимости от выбора блока компьютера формируем предложения,
# используя всплывающее меню
if ( $radio_1 eq "Системные блоки" )
{
print
hr,
h2("$radio_1"),
start_form(post,'../ismm25/form3a_l4.pl'),
"Материнская плата:<br>",
popup_menu('mainboard',['P6BAP-A+ ATX','P6VAP-A+ ATX',
'Micro BX Master ATX'],'P6VAP-A+ ATX'),p,
"Процессор:<br>",
popup_menu('cpu',['Celeron 600','Celeron 700',
'Pentium III 600','Pentium III 800'],'Celeron 700'),p,
"Объем оперативной памяти:<br>",
popup_menu('ram',['64 Mb','128 Mb',
'256 Mb','384 Mb'],'128 Mb'),p,
"Видеокарта:<br>",
popup_menu('video',['ATI 3D Charger 4Mb AGP','ATI Xpert98 8Mb',
'ATI Xpert 200 pro 32Mb','ASUS Riva TNT2 Pro 32 Mb'],'ATI Xpert98 8Mb'),p,
"Жесткий диск:<br>",
popup_menu('hdd',['10.2 Gb,5400','15.5 Gb,7200',
'30.0 Gb,7200'],'15.5 Gb,7200'),p,
hr,p,
submit('Заказать блок'),
endform();
}
if ( $radio_1 eq "Принтеры" )
{ print qq[Студент для блока "Принтеры" должен сделать самостоятельно!!!];  }
if ( $radio_1 eq "Мониторы" )
{ print qq[Студент для блока "Мониторы"  должен сделать самостоятельно!!!];  }
print
end_html;

form3a_l4.pl
#!/usr/bin/perl
#
# Этот скрипт предназначен для формирования формы с реквизитами покупателя
# и создания пакета cookie для временного запоминания выбранных комплектующих
#
# Загружаем модуль CGI
use CGI qw(:all);
# Присваиваем переменным значения, введенные в предыдущую форму
$mainboard=param('mainboard');
$cpu=param('cpu');
$ram=param('ram');
$video=param('video');
$hdd=param('hdd');
# Формируем пакет cookie с именем sys_block
$cookie=cookie(-name=>'sys_block',-value=>[$mainboard,$cpu,$ram,$video,$hdd]);
print
header(-charset=>'Windows-1251',cookie=>$cookie),
start_html(-title=>'form3a_l4.pl',-text=>'#FFFFFF',-BGCOLOR=>'#2B6CA2'),
h2('Оформление покупки'),hr,
# Создаем форму для ввода в нее реквизитов покупателя
start_form(post,'../ismm25/form4_l4.pl'),
"Фамилия,Имя,Отчество:<br>",
textfield('user_name','',40,80),
p,
"Адрес проживания:<br>",
textarea('address','',10,40),p,
hr,
submit('   Выполнить заказ   '),
endform(),
end_html;

form4_l4.pl
#!/usr/bin/perl
#
# Этот скрипт предназначен для контрольной распечатки заказа
# и его передаче по электронной почте в отдел комплектации
#
# Загружаем модуль CGI
use CGI qw(:all);
# Присвоение переменным реквизитов покупателя, полученные из предыдущей формы
$user_name=param('user_name');
$address=param('address');
print
header(-charset=>'Windows-1251'),
start_html(-title=>'form4_l4.pl',-text=>'#FFFFFF',-BGCOLOR=>'#2B6CA2');
# Присваение элементам массива @sys_block пакета cookie с именем sys_block
@sys_block=cookie('sys_block');
# Присвоение переменной $radio_1 пакета cookie с именем device
$radio_1=cookie('device');
# Контрольная распечатка заказа броузером заказчика
print
"<b>Заказ сделал покупатель:</b>",br,
$user_name,br,
$address,br,
"<b>Заказ выполнен на:</b>",br,
$radio_1,br;
foreach $val (@sys_block)
{
print "$val",br;
}
end_html;
# Присваивание переменным заголовка почтового сообщения
$from="ismm25\@celer.tup";
$to="alex\@ism.tup.km.ua";
$subject="lab4";
# Присваивание переменной $sendmail полного пути к программе sendmail
# и необходимых аргументов для ее запуска
$sendmail="/usr/sbin/sendmail -t -oi";
# Открытие конвейера для записи информации в стандартный входной поток
# программы sendmail
open (MAIL,"|$sendmail");
# Заголовок почтового сообщения выводится в дескриптор MAIL
print MAIL<<END_OF_HEADER;
From: $from
To: $to
Subject: $subject
END_OF_HEADER
# Тело почтового сообщения записывается в дескриптор MAIL.
# В конец каждой строки добавляется символ \n.
print MAIL "Заказ сделал покупатель:\n";
print MAIL "$user_name\n";
print MAIL "$address\n";
print MAIL "Заказ выполнен на:\n";
print MAIL "$radio_1\n";
foreach $val (@sys_block)
{
print MAIL "$val\n";
}
close(MAIL);

Для просмотра, как работает рассмотренный комплект программ,
нажми сюда.



Что такое cookie и для чего они нужны

    В предыдущей лабораторной работе в пограммах редактирования записи было показано, как с помощью скрытого поля user_name (TYPE=hidden) в HTML форме можно заставить свой Web-броузер "запомнить" содержимое предыдущих Web-станиц. Можно также хранить информацию и с помощью файлов cookie, представляющие собой данные, передаваемые между броузером и CGI-программой во время сеанса HTTP-связи.
    Файл cookie - это пакет информации, который CGI-программа "просит" сохранить броузер. Этот пакет броузер может в любое время переслать обратно этой или другой CGI-программе. Пакет cookie передается от сервера к броузеру, если CGI-программа запрашивает создание cookie, и этот процесс называется установкой cookie.
    Для создания пакета cookie можно использовать функцию модуля CGI под именем cookie. Ее синтаксис:

$cookie_object=cookie( -name=> cookie_имя, -value=> cookie_значение, -expires=> дата_окончания, -path=> информация_о_пути, -domain=> информация_о_домене, -secure=> true/false);

Параметр name определяет имя пакета cookie. Параметр value хранит значение cookie. Это единственный обязательный параметр, все остальные - необязательные. Параметр expires задает время хранения броузером пакета cookie с именем name (например -expires=> +15m  - 15минут). Параметр path указывает, по какому пути обратно к серверу должен вернуться пакет cookie. Параметр domain задает домен к серверам которого может возвратиться этот пакет cookie. С помощью параметра secure можно организовать отправку пакета cookie с броузера только в том случае, если соединение является безопасным.
    Функция header в модуле CGI выполняет передачу пакета cookie броузеру. Это значит, что сначала необходимо создать пакет, используя функцию cookie, а затем вызвать функцию header.
    Для считывания пакетов cookie из броузера в CGI-программу используется та же функция cookie, которая должна быть вызвана после функции header.