Параметрическое управление контентом фреймового сайта

А.М.Терентьев, А.С.Львова

С появлением таких средств проектирования сайтов, как 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 можно обратиться к нужным именам по ссылкам в streamerleft и streamerright, однако невозможно так же легко реализовать связи leftright, поскольку они находятся на одном уровне иерархии, и вертикаль связи отсутствует. Между тем, поскольку оглавление традиционных национальных сайтов левостороннего письма находится слева, а основное содержимое по тем же причинам справа, манипулирование с элементами оглавления должно вызывать изменение контента в правой части; при этом после новой загрузки документа в правую часть, например, оператором

<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 – вызов документа «Корпоративная политика» раздела «Антивирусы» в правой части.

Таким образом, можно считать развеянным миф о невозможности эффективного управления контентом фреймового сайта с помощью параметрического вызова сайта. Рассмотренные методы позволяют эффективно управлять контентом фреймового сайта любой сложности. Лишь необходимо адаптировать соответствующие теги явно - полезность изложенного зримо доказана эксплуатацией ЦЭМИ.