Личный опыт подгонки скрипта к дизайну сайта
На каком-то этапе процесса освоения мной методов разработки
вебсайтов я понял необходимость использования некиех шаблонов, благо мой хостинг
провайдер разрешал 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/&/&/g;
$value =~ s/"/"/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$in{$name} = $value;
} |
Кто знает варианты лучше и проще, или обнаружил, что я ошибся
в чем-то - пишите.
|