Личный опыт подгонки скрипта к дизайну сайта


Прислал: Ali [ 07.10.2000 @ 22:43 ]
Раздел:: [ Статьи по Perl ]


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

Я стал делить страницы на состовляющие. Получалось примерно следующее

index.html
<!--#include virtual="/header.txt" -->
Привет! спасибо, что заглянули на наш сайт!
Вы находитесь на главной странице.
Для навигации - используйте меню наверху.
Посетите, также нашего спонсора - его банер внизу.
<!--#include virtual="/footer.txt" -->
header.txt
<html>
<head>
<title>Хоумпага</title>
<meta http2-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body bgcolor="#000000">
<b>Меню: </b><!--#include virtual="/menu.txt" --><br>
menu.txt
[<a href="/photos/myfotos.html">Мои Фотографии</a>] [<a href="/guestbook.html">Гостевая</a>] [<a href="/about.html">О сайте </a>]
footer.txt
<center>
<small><b>Реклама</b></small>
<img border=0
src="/images/sponsor.gif" alt="Реклама" height="460" width="80" >
<!-- COUNTER START --><a href="//www.ultra.msk.ru" target="_blank"><img border=0 src="//www.ultra.msk.ru/counter.gif" alt="UltraNET counter"><img border=0 src="//www.ultra.msk.ru/cgi-bin/c2c.pl?acount_name" alt="UltraNET counter"><img border=0 src="//www.ultra.msk.ru/cend.gif"></a> <!-- COUNTER END -->
</center>
</body>
</html>

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

Каждый из них приходилось отдельно подгонять к дизайну. При всей своей неискушенности в программировании, я таки научился это делать, но при этом в каждый скрипт, совершающий вывод на экран мне приходилось вставлять html-код трех файлов (header.txt, menu.txt, footer.txt).

Типичный пример - гостевая книга.

Запускается непосредственным вызовом скрипта: //www.your_server.ru/cgi-bin/gb/gb.cgi

Создаете файл "guestbook.html", например, в той же директории, где у Вас index.html.

guestbook.html
<!--#include virtual="/header.txt" -->
<b> Гостевая книга! </b>
<!--#include virtual="/cgi-bin/gb/gb.cgi?${QUERY_STRING}" -->
<!--#include virtual="/footer.txt" -->

В скрипте Вам необходимо вычистить все попытки генерирования html документа, напрямую не относящиеся к самой гостевой книге. Т.е. то что обычно бывает в верхней части html-документа <body> и нижней (то, что у Вас в файлах header.txt, menu.txt, footer.txt)

В самом скрипте необходимо URL скрипта (т.е. "//www.your_server.ru/cgi-bin/gb/gb.cgi" или "/cgi-bin/gb/gb.cgi") заменить на URL созданного Вами html-документа (т.е "//www.your_server.ru/guestbook.html" или просто "/guestbook.html").

Т.е. при построении формы для ввода сообщений данные должны передаваться не gb.cgi (<form action="//www.your_server.ru/cgi-bin/gb/gb.cgi" method=POST>) а html-документу (<form action="//www.your_server.ru/guestbook.html" method=POST>)

В свою очередь guestbook.html передаст уже в gb.cgi данные, считанные при помощи переменной SSI ${QUERY_STRING}.

Однако это может не сработать если gb.cgi при считывании данных обрабатывает только переменную $ENV{'CONTENT_LENGTH'}.

В самом распространенном варианте это выглядит и исправляется так:

#!/usr/bin/perl
##############
#оригинальный код
#код, который Вам надо добавить
...
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

#если считывание $ENV{'CONTENT_LENGTH'} привело
# к пустому значению $buffer - то надо его заполнить
# данными из $ENV{'QUERY_STRING'};
if ($buffer eq "") {
$buffer=$ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
if ($name eq 'coder') {
$coder=$value;
$coder=~ s/%//g;
}
$value =~ tr/+/ /;
$value =~ s/%7C/ /eg;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/&/&amp;/g;
$value =~ s/"/&quot;/g;
$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
$in{$name} = $value;
}

Кто знает варианты лучше и проще, или обнаружил, что я ошибся в чем-то - пишите.