SSI (часть 2)
Работа с переменными
Переменной в SSI считается любая строка, а также любая внутренняя переменная окружения. Для работы с переменными предусмотрены следующие команды:
echo - выводит значение ранее установленной переменной SSI. Допустимым атрибутом является var, в котором определяется сама переменная, значение которой будет выводиться. Переменная SSI - это какая-то строка, которая при подстановке в документ образует правильную структуру, будь то тэг или его атрибут, либо еще что-нибудь.
set - устанавливает значение переменной. Ее атрибутами являются var, определяющий имя переменной, и value, определяющий ее значение.
Здесь следует дать некоторые пояснения, зачем вообще нужны переменные в SSI. Нужны они лишь для того, чтобы автоматически подставлять какие-то строковые значения в тэги, тем самым их изменяя. Например, мы определили следующую переменную:
которая обозначает какое-то значение заголовка документа. Использовать мы ее можем следующим образом:
При этом документ, в котором будет использована данная строка, получит именно такой заголовок. Следует отметить, что между тэгами , помимо SSI-команды, вывести переменную I_TITLE, могло быть еще что угодно, вплоть до еще одной переменной. Здесь особых ограничений не существует. В этом случае мы получили бы просто заголовок, составленный из двух или более строк.
Переменные включения
В дополнение к стандартным переменным окружения CGI, модуль SSI делает доступными для директив и условий, а также для вызываемых через SSI-сценариев следующие переменные:
DATE_GMT - текущее время по Гринвичу;
DATE_LOCAL - текущее локальное (для сервера) время;
DOCUMENT_NAME - имя файла (без каталогов) документа, запрошенного пользователем;
DOCUMENT_URI - декодированный URL запрошенного пользователем документа;
LAST_MODIFIED - дата последней модификации документа, запрошенного пользователем. То есть, во вложенном SSI эта переменная будет содержать имя "главного" документа, а не вложенного.
printenv - выводит содержимое переменных окружения. Вызывается без параметров.
Важно отличать переменные окружения от отдельных строк. Для этого в SSI принято их записывать со знаком доллара впереди, а простые строки должны быть обрамлены в кавычки, таким образом $ LAST_MODIFIED - это переменная окружения, а "LAST_MODIFIED" - это обыкновенная строка.
Условные операторы
Для динамического формирования внешнего вида загружаемых документов, в зависимости от действий пользователя либо просто от свойств самого документа, в SSI существуют условные операторы или контролирующие элементы, назначение которых заключается в выполнении каких-то действий в зависимости от условия, определенного разработчиком страницы. На сегодняшний день условные операторы являются единственным элементом программирования, используемым в SSI. Базовыми элементами контроля являются следующие директивы:
- проверяет условие test_condition, и в случае его верности выполняет все последующие операции, определенные SSI-директивами до строки . В обратном же случае все находящееся между этими двумя операторами игнорируется и программа сканирует документ далее, в том случае, если внутри игнорируемой области не определены какие-либо другие операторы выбора.
- если вставляется в документ, то всегда должно следовать за . Использование по отдельности, как можно догадаться из смысловой нагрузки, для данной директивы не предусмотрено. Начинает действовать в случае, если условие в первом до нее операторе if явилось ложным. Тогда данная команда проверяет свое условие test_condition, не обязательно совпадающее с условием вызывающей директивы, и в случае, если оно имеет значение "правда", вызывает какое-либо действие, описываемое директивой далее в документе до следующего элемента .
- если кто-то знаком с языком программирования Javascript или Java, то поймет, что этот оператор имеет примерно такой же смысл, как switсh(default()). Другими словами, он выполняется только тогда, когда все операторы , следующие до него, не дали желаемого результата. Пишется всегда на заключительной стадии оператора if прямо перед .
- не проверяет никаких условий. Просто закрывает блок сравнений, открываемый оператором . Служит, как можно понять, для предотвращения путаницы в документе в случае двух и более операторов if, однако наличие его обязательно в любом случае.
При записи условных операторов в SSI полезно помнить следующий набор правил и свойств переменных.
Элементы elif и else являются необязательными.
Элемент endif заканчивает элемент if и является обязательным.
test_condition может быть одним из следующих:
string - истинно, если string не пуста;
string1 = string2 - истинно, если первая строка соответствует второй.
string1 != string2 - истинно, если первая строка не соответствует первой.
string1 < string2 - истинно, если первая строка меньше второй.
string1 <= string2 - истинно, если первая строка либо соответствует второй, либо меньше ее.
string1 > string2 - истинно, если первая строка больше второй.
string1 >= string2 - истинно, если первая строка либо соответствует второй, либо больше нее.
Если string2 записывается в форме /string/ то тогда она интерпретируется как регулярное выражение. Их синтаксис аналогичен синтаксису регулярных выражений в Unix команде egrep;
string - это практически любая строка, содержащая либо тэг целиком, либо его часть либо код какого-либо скрипта, в общем, любую часть документа. Так же это может быть любая переменная окружения, определенная в самом SSI либо в CGI-скрипте, совместно с которым используется документ.
Так же, как в полноценном языке программирования, условные операторы в нашем случае содержат возможность применения к их переменным ряда логических операций. В этом случае мы имеем следующие возможности по изменению истинности выражений.
( test_condition ) - истинно, если test_condition истинно;
! test_condition - истинно, если test_condition ложно;
test_condition1 && test_condition2 - истинно, если как test_condition1, так и test_condition2 истинны;
test_condition1 || test_condition2 - истинно, если хотя бы test_condition1 или test_condition2 истинно.
"=" и "!=" имеют больший приоритет, чем "&&" и "||", а "!" имеет наивысший приоритет.
Важно запомнить! Все, что не распознается, как переменная, считается строкой. Если строка имеет пробелы или символы табуляции, то ее надо заключать в кавычки.
Подстановка переменных
Переменной в SSI считается строка любого типа или зарезервированные переменные окружения. Так же, как и в языке Perl в SSI, переменные инициируются с помощью знака доллара($). Подстановка переменных производится внутри заключенных в кавычки строк в большинстве аргументов SSI-директив. В этих случаях знак доллара можно вставить, предварив его слэшем:
Для предотвращения двусмысленности можно заключать имя переменной в фигурные скобки:
В результате такого присвоения, переменная Zed будет иметь значение "Xbc_Y", если переменная a равна X, а переменная abc равна Y.
Используются подобные сложные структуры довольно редко, так как относятся больше к изощрениям с использованием зарезервированных возможностей, однако ради интереса и для большей ясности последние объявления следует немного пояснить.
Представим, что у нас в каком-то стороннем файле - пусть он называется storon_X.shtml - существует следующий набор директив:
Все их действие заключается в установке двум строковым переменным (_title и __title) определенных значений, которые потом предполагается использовать на месте заголовка какого-либо документа. Также предположим, что у нас есть еще один сторонний документ (назовем его storon_X2.shtml), который в своем заголовке должен иметь следующую строку текста: "Программы на языках высокого уровня Различные навороченные фишки Обзоры новейших генераторов html-кода". Тогда, чтобы сформировать переменную такого вида уже в самом текущем документе, нам понадобится объявление типа:
Все это имеет смысл, если у нас есть еще один сторонний фаил (этот пусть называется просто XXX.shtml), который в своем заголовке содержит строку "Программы на языках высокого уровня Еще много чего крутого". Тогда в нем объявление соответствующей переменной будет выглядеть следующим образом:
Таким образом, для формирования сразу двух заголовков различных файлов мы можем использовать один лишь storon_X.shtml. Конечно, для того чтобы все заработало, надо не забыть включить в них обоих следующую незамысловатую строку:
Пример этот является абсолютно бесполезным, однако же при этом довольно наглядно поясняет некоторые теоретические сведения, изложенные в этой статье.
Что дальше?
На самом деле, значение SSI трудно переоценить. Хотя технология и является еще довольно недоработаным продуктом, но уже сегодня можно смело сказать, что она значительно облегчает жизнь многим людям, так или иначе имеющим отношение к вэб-дизайну. Вот предположим, что у нас есть серия документов, содержащих каждый по одной какой-либо картинке. Причем, в каждом картинка своя, со своими размерами и, соответственно, содержанием. Более того, документы отличаются друг от друга по своему заголовку и ключевым словам, по которым ищет их поисковая система. Представим также, что таких документов на нашем сервере больше, чем волос на голове у Ленни Кравитца.
Как бы то ни было, согласимся, что писать для каждого из таких документов свой отдельный html-код, по меньшей мере, самонадеяно. Хотя, конечно, найдутся, как всегда, вполне вменяемые люди, которые закричат, что, мол, они такое делали, и не раз. Спорить с ними на эту тему бесполезно - лучше согласиться. Такие люди остро нуждаются в понимании, сочувствии, а может быть, даже длительном лечении. Как бы то ни было, для всего остального прогрессивного человечества будет гораздо легче использовать SSI.
Советовать что-либо для самостоятельного изучения не буду, все пишут в общем-то одно и то же, за исключением разве что порядка слов в предложениях. Статья была призвана не столько описать достаточно еще молодую технологию, сколько ввести читателя в курс дела. И если кто-то заинтересовался, то сам найдет все, что ему нужно.
Дополнительно на данную тему:
SSI в примерах
SSI (часть 1)
Учебник по SSI (Server Side Includes)
Мощь SSI
SSI: вкусно и полезно
CGI+SSI - пример счетчика
|