А.М.Терентьев,
А.С.Львова
С появлением таких средств проектирования сайтов,
как PHP, Битрикс и
др., формирование сайтов фреймовой структуры считается устаревшим. Большинство
сайтов в погоне за коммерческой выгодой, требующей поддерживать в структуре
сайта множество полей iframe с
рандомизированно формируемыми рекламными баннерами, используют автоматическое
формирование структуры сайта с помощью различных генераторов, часто
исполняющееся в виде однофреймовой структуры.
Одной из выгод такого формирования сайта является
возможность параметрического управления контентом, т.е. автоматического вызова
при входе на сайт нужного материала по параметрам, передаваемым в строке вызова
сайта. Так, например, при входе на сайт ЦЭМИ РАН http://www.cemi.rssi.ru
пользователь далее может выбрать вкладку «О
ЦЭМИ», в развернувшемся списке выбрать «Персоналии», и, наконец, из списка в основном окне выбрать, к
примеру, автора статьи. В то же время, если при входе на сайт заранее известна
цель – к примеру, найти биографию упомянутого автора – то возможно обращение с
указанием параметров в строке, которое для данного случая будет иметь вид:
http://www.cemi.rssi.ru/about/persons/index.php?SECTION_ID=6&ELEMENT_ID=240,
где
конструкция после знака «?»
является списком параметров, которые обрабатываются головными структурами
сайта.
Среди планировщиков сайтов, их создателей и
администраторов в последнее время укоренилось мнение, что фреймовая структура
(задающаяся операторами <frame>) сайтов
безнадёжно устарела, в том числе вследствие невозможности построения средств
управления показом контента сайта с помощью приведённого списка параметров.
Даже приведённый пример современного построения сайта ЦЭМИ РАН основан не на
операторах <frame>, а на
динамических объектах, задаваемых операторами <div>.
В самом деле, структура, к примеру, Антивирусного
сайта ЦЭМИ РАН выполнена в виде ряда вложенных фреймов, которые схематически
могут быть изображены на рис. 1.
Заголовочная
область сайта streamer.htm, плавающая ширина |
|
left.htm, фикс.ширина |
right.htm, плавающая
ширина |
down.htm, плавающая
ширина |
Рис. 1. Схематическое изображение
фреймовой структуры Антивирусного сайта
Соответствующее описание в терминах фреймов будет
иметь вид рис. 2.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<HTML>
<HEAD>
<TITLE>Антивирусный сайт ЦЭМИ РАН</TITLE>
<META name="description"
content="">
<META name="keywords"
content="antivirus">
<META name="generator"
content="SelfMade">
<META http-equiv="Content-Type"
content="text/html; charset=windows-1251">
</HEAD>
<frameset FRAMESPACING="0"
rows="82,*">
<frame
src="streamer.htm" name="streamer" scrolling="no"
frameborder="0" noresize>
<frameset
FRAMESPACING="0" cols="155,*">
<frame src="left.htm"
name="left" frameborder="0" scrolling="no"
noresize marginwidth="5" marginheight="5">
<frameset FRAMESPACING="0" rows="*,77">
<frame
src="r1.htm" name="right" frameborder="0"
scrolling="auto"
marginwidth="1" marginheight="1">
<frame
src="down.htm" name="down" scrolling="no"
frameborder="0"
noresize>
</frameset>
</frameset>
</frameset>
</HTML>
Рис. 2. Описание фреймовой структуры
Антивирусного сайта на HTML
Разумеется, в HTML-файлах описания каждой из фреймовых структур, а именно, streamer.htm, left.htm, r1.htm и down.htm содержатся
коды Javascript, управляющие
процессами построения соответствующих областей.
В соответствии с идеологией HTML, каждый фрейм представляет собой как бы
независимый объект, который помимо независимого форматирования также обладает
независимостью определяемых в нём Javascript-переменных.
Иными словами, хотя внутри Javascript можно
обратиться к нужным именам по ссылкам в streamer↔left и streamer↔right, однако невозможно так же
легко реализовать связи left↔right, поскольку они находятся на
одном уровне иерархии, и вертикаль связи отсутствует. Между тем, поскольку
оглавление традиционных национальных сайтов левостороннего письма находится
слева, а основное содержимое по тем же причинам справа, манипулирование с
элементами оглавления должно вызывать изменение контента в правой части; при
этом после новой загрузки документа в правую часть, например, оператором
<a target=’right’
href=’r2.htm’>,
исполняющимся
на некотором элементе оглавления левой части, всё
содержимое переменных правой части будет потеряно при замене r1.htm на документ r2.htm. Передача каких-либо
значений переменных слева направо в этом случае представляется невозможной, и
содержимое документа r2.htm уже не представляется
возможным динамически изменить вследствие отсутствия возможности передачи
параметров.
Такую ситуацию легко проверить, попытавшись
выполнить на языке Javascript оператор
снятия значения любой из стандартных переменных окружения. При вызове сайта, к
примеру, с параметром “?ID=1”, оператор «var vm=$ENV{‘QUERY_STRING’}» при выполнении на корневом уровне правильно
припишет переменной vm текстовое значение ‘ID=1’, однако внутри
r2.htm аналогичный
оператор даст уже пустое значение! Именно эта особенность и послужила
основанием для утверждения о невозможности параметрического управления
контентом фреймового сайта.
Авторам данной статьи, однако, указанная проблема не представляется в принципе неразрешимой.
В самом деле, пусть мы имеем сайт структуры,
определённой на рис. 1. Вместо прямого определения файла index.htm на языке HTML согласно описанию на рис. 2, выполним
описание index.cgi на Perl следующим образом (см. рис. 3, пример
упрощён).
#!/perl/bin/perl
print
"content-type: text/html\n\n";
print
"<HTML><HEAD>\n";
print
'<META http-equiv="Content-Type" content="text/html;
charset=windows-1251">'
print
"\n";
print
'<script type="text/javascript">'; print "\n";
print
"<!--\n";
$globalq=$ENV{'QUERY_STRING'};
print 'var globalq="';
print $globalq; print
'";'; print "\n";
print
"//-->\n";
print
"</script>\n";
print
"</HEAD>\n";
print
'<frameset FRAMESPACING="0" rows="82,*">'; print
"\n";
print
'<frame src="streamer.htm" name="streamer"
scrolling="no"
frameborder="0" noresize>';
print "\n";
print
' <frameset
FRAMESPACING="0" cols="155,*">'; print "\n";
print
' <frame
src="left.cgi?';
print $globalq;
print '"
name="left" frameborder="0" scrolling="no"
noresize';
print ' marginwidth="5"
marginheight="5">'; print "\n";
print
' <frameset
FRAMESPACING="0" rows="*,77">'; print "\n";
print
' <frame src="r0.htm"
name="right" frameborder="0" scrolling="auto"
marginwidth="4"
marginheight="1">'; print "\n";
print
' <frame src="down.htm"
name="down" scrolling="no" frameborder="0"
noresize>'; print
"\n";
print
" </frameset>\n";
print
" </frameset>\n";
print
"</frameset>\n";
print "</HTML>\n";
Рис. 3. Вариант описания фреймовой
структуры сайта с использованием Perl
Обратим внимание, что посреди генерации уже известной
нам фреймовой структуры встречается оператор Perl «$globalq=$ENV{'QUERY_STRING'};» (на рисунке выделен полужирным
шрифтом), действующий в момент интерпретации. Естественно, в этот момент
переменной globalq будет присвоено значение списка параметров строки вызова
сайта, поскольку приведённое описание есть корневое описание сайта.
Далее, вместо стоявшего ранее вызова
«<frame src="left.htm" …» будет сгенерирован код вызова
в следующем виде: «<frame src="left.cgi?значение-globalq …» (это
тело в ряду генерирующих его операторов также выделено на рисунке), что,
собственно, и передаст литерал-значение переменной globalq уже на уровень
left.cgi.
В свою очередь, вместо left.htm мы также можем
написать генерацию кода на языке Perl как left.cgi, уже используя подбор
нужного имени правой части в зависимости от значения параметра вызова.
Определив, к примеру, вызываемое в правой части имя файла как значение
переменной Perl $nfile и придав этой переменной нужное значение в зависимости
от параметров исходной строки вызова, переданных в left.cgi, можно записать
далее строки согласно рис. 4.
print "<script
type='text/javascript'>\n";
print 'var leftnamer="';
print $nfile;
print '"';
print "\n";
print
"parent.frames['right'].location=leftnamer\n";
print "</script> \n";
Рис. 4. Исполнение вызова нужного
документа с сайта
Результатом исполнения этих строк будет загрузка в
правую часть сайта нужного документа.
Разумеется, для исполнения подобного варианта
реализации совершенно необходимо предусмотреть в описании сайта разрешение
исполнения модулей на CGI/Perl в соответствующих строках файла конфигурации
Apache.
Описанный аппарат реализован на Антивирусном сайте
ЦЭМИ РАН в 2009 г (Apache 1.3.23) и позволяет, помимо прямого вызова
сайта, исполнять сложные вызовы с автоматической загрузкой нужного документа.
Примеры вызовов:
http://av.cemi.rssi.ru – вызов по
умолчанию списка новостей в пр. части;
http://av.cemi.rssi.ru?3 – вызов раздела «Антивирусы»
в пр. части;
http://av.cemi.rssi.ru?3,1 – вызов
документа «Корпоративная политика» раздела «Антивирусы» в правой части.
Таким образом, можно считать развеянным миф о
невозможности эффективного управления контентом фреймового сайта с помощью
параметрического вызова сайта. Рассмотренные методы позволяют эффективно
управлять контентом фреймового сайта любой сложности.
Лишь необходимо адаптировать соответствующие теги явно - полезность
изложенного зримо доказана эксплуатацией ЦЭМИ.