В последнее время стало
популярным делать свой сайт, применяя SSI. На любом мало-мальски
уважающем себя сайте, посвященном web-дизайну, рассказывается
об основных директивах SSI. Дальше этого обычно никто не идет,
ограничиваясь лишь утверждением, что "теперь для изменения дизайна
всего сайта одновременно достаточно внести изменения всего лишь
в один-два файла". На самом же деле данных, содержащихся в этих
статьях, хватает только для того, чтобы понять, как быстро изменить
лишь внешний вид страниц сайта, оставляя неясным вопрос, что же
делать, если я захочу радикально изменить структуру и навигацию.
Введение
Если вам эта статья попалась на глаза случайно, я расскажу сначала
о предмете разговора. Не вдаваясь в заумные технические подробности,
можно сказать следующее: SSI придумали лентяи и для лентяев (имхо,
само собой). Причем одни оказались настолько ленивые, что им лень
было рассказать всем простым человеческим языком, что же такое
они создали, а вторым предложенные возможности настолько понравились,
что большинству достаточно для использования всего одной директивы
и им лень самостоятельно разбираться, что же там есть еще. Так
что, если вы любите обновлять свой сайт, но вас ломает это делать,
без SSI вам никак. Я тоже лентяй. Поэтому, восхитившись возможностями
SSI, предоставляемыми всего одной директивой, решил копнуть чуть
поглубже и узнать, как еще более облегчить себе работу по реконструкции
сайта.
Введение(2)
Идея SSI заключается в следующем: на каждом сайте есть элементы
оформления, повторяющиеся на всех страничках этого сайта. Например,
описание основных параметров (body), CSS, оглавление, скрипты
и т.д. Нет смысла, подумали умные люди, писать одинаковые фрагменты
кода в каждой странице. Можно написать их один раз, сохранить
в отдельном файле и вставлять в другие по мере необходимости.
Вставка содержимого одного файла в другой производится директивой
include.
<!--#include file="file.html" -->
или
<!--#include virtual="URL" -->
Первый случай используется при подключении файла, находящегося
в том же самом каталоге, второй – для подключения файла, находящегося
в любом месте, даже на другом сервере. (Но не все бесплатные сервера
разрешат вам подключить файл, находящийся на другом сервере).
Все говорят, что предпочтительнее использовать virtual, и я не
буду спорить. В этом случае можно использовать как относительные,
так и абсолютные адреса. Само собой разумеется, что подключаемый
файл тоже, в свою очередь, может содержать директивы SSI. Обратите
внимание: пробелы есть только после слова include и перед -->.
Желательно, чтобы файл, в котором есть директивы SSI, имел вид
name.shtml, где name – любая комбинация латинских букв, цифр и
знаков подчеркивания. На некоторых серверах разрешают вставлять
директивы SSI и в файлы с расширением *.htm, *.html.
Данные
Для хранения данных существуют переменные. Они объявляются так:
<!--#set var="имя" value="значение" -->
Передача данных
Передавать данные можно двумя способами. Даже тремя.
- Используя метод get формы.
- Через URL вызываемого файла в виде file.html?param=value[¶m=value].
- Используя возможности SSI.
В принципе, первые два различаются лишь тем, самостоятельно будете
вы кодировать строку запроса (2-й способ) или предоставите это
делать пользователю (1-й способ), который будет заполнять форму
и жать на ОК или SUBMIT. Этот способ рассмотрен мною подробно
в статье "Передача и обработка данных средствами HTML". Для передачи
данных средствами SSI достаточно объявить переменную и присвоить
ей значение. Теперь она доступна из любого файла, подключающего
данный.
Получение данных
Получить и затем использовать данные можно двумя способами.
- Стандартными средствами DHTML (HTML+JavaScript).
- Средствами SSI.
Первый способ рассмотрен все в той же статье "Передача данных…",
да и не интересует он нас сейчас. А вот средствами SSI получить
данные можно опять-таки двумя способами.
Данные, содержащиеся в переменных, которые мы объявляли в подключаемых
файлах, уже можно считать полученными и с чистой душой и спокойной
совестью можно приступать к их использованию.
Если вы самостоятельно сформировали строку запроса так, как описано
выше, или передавали данные из формы, это равносильно объявлению
переменных. То есть строка file.shtml?param=value эквивалентна
объявлению переменной param, равной value.
<!--#set var="param" value="value" -->
Чтобы проверить, передались ли вам какие-либо данные или нет,
есть директива
<!--#printenv -->
Она выводит на экран список всех переменных и их значения.
Обработка данных
Нет смысла передавать данные и не использовать их потом. Разве
что делать это с целью заморочить голову посетителю. Самое простое,
что можно сделать, это вставить переменную в текст документа.
<!--#echo var="$name" --> - просто вставит значение
переменной в текст документа. Допустим, в переменной url содержится
адрес какого-то файла, на который надо организовать ссылку, тогда
это выглядит так:
<a href="<!--#echo var="$url" -->">Ссылка</a>.
Или, например, посетитель сказал нам, как его зовут, нажал на
кнопочку, и на следующей странице к нему будем обращаться по имени.
Строка запроса у нас получилась file.shtml?name=Alexey и используем
мы эти бесценные сведения:
Привет, <!--#echo var="$name" -->.
В результате на экране отобразится Привет, Alexey.
Если передавались данные, требующие аналитической обработки, на
это есть директива if.
<!--#if expr=(условие) -->
<!--#elif expr=(условие) -->
...
<!--#else -->
<!--#endif -->
endif является обязательным элементом. elif может повторяться
сколько угодно раз. else между if и endif может быть лишь единожды,
причем после else уже не может использоваться elif. После каждого
условия можете вставлять неограниченное количество строчек кода
HTML. Например, предыдущий пример (с именем) можно модернизировать:
<!--#if expr=($name="Alexey") -->
<h1>Привет, <!--#echo var="$name" --></h1>
<!--#else -->
<h2>Привет, <!--#echo var="$name" --></h2>
<!--#endif -->
Теперь, если посетитель окажется моим тезкой, приветствие будет
написано чуть крупнее, чем для всех остальных.
Организация сайта
Наконец-то я добрался до того, ради чего и затеял-то писать эту
статью. Мы же хотим организовать свой сайт так, чтобы в случае
чего модернизация заняла бы минимум усилий. Возможны два пути
для достижения этой цели. Видите, какой я нынче демократичный
– всегда предоставляю вам право выбора. Цените это. Следует учесть,
что HTML – очень терпимый к ошибкам язык. Если вы что-то неправильно
написали, к фатальным последствиям это не приведет. Так, например,
не смотря на то, что во всех руководствах заголовок документа
(head) рекомендуют писать в начале файла, броузеры правильно понимают
его в любой части документа, даже если вы забудете заключить его
в контейнер . Единственное (имхо) неудобство заключается в том,
что, располагая заголовок, содержащий title, в конце файла, страница
броузера остается безымянной до тех пор, пока не прочитает этот
заголовок.
Способ первый
Пишем статью в формате HTML, как обычно, но не указывая никакие
стили, избегая изменения цветов (потому что мало ли какой цвет
фона нам потом приспичит сделать – вдруг видно не будет) и даже
опуская тег body. Остаются только font size, b, big, img, a, i,
table и некоторые другие. Сохраняем как filename.html. Имя, естественно,
у каждой статьи разное. Самое главное – запомнить, в каком файле
какая статья лежит, а лучше записывать это. Адрес этой статьи
никому не говорим – он для сугубо внутреннего использования.
Далее создаем публичный файл статьи. В начале документа пишем
<html> и затем объявляем переменные, в которых
будем передавать информацию о статье.
<html>
<!--#set var="description" value="описание" -->
<!--#set var="title" value="Заголовок" -->
<!--#set var="keywords" value="ключевые слова" -->
<!--#set var="file" value="url статьи" -->
<!--#include virtual="файл интерфейса.shtml" -->
Сохраняем это все и запоминаем адрес – это и будет адрес статьи,
который вы будете регистрировать в каталогах и рекомендовать посетить
друзьям. Можно еще написать то, что вы там еще обычно пишете в
заголовке. Я чаще всего ограничиваюсь одним title. Как-то спокойно
отношусь к тому, что релевантность маленькая окажется.
Теперь создаем файл интерфейса (*,shtml). Начало его выглядит
так:
<html><head>
<title><!--#echo var="$title" --></title>
<meta name="description" content="<!--#echo var="$description"
-->">
<meta name="keywords" content="<!--#echo var="$keywords"
-->">
</head>
Далее оформляем внешний вид – вешаем баннеры, вставляем счетчики,
добавляем новости и т.д. Наконец в том уголке, где должна быть
статья, пишем:
<!--#include virtual="$file" -->
Все. Теперь, как и обещалось, для радикального изменения дизайна
достаточно изменить лишь наш файл интерфейса.
Способ второй
Честно говоря, он мне не очень нравится, и поэтому я его приводить
не буду. Идея его заключается в том, чтобы вызывать все статьи
как, например, index.shtml?sub=filename. Выигрыш можно получить
в том, что одна и та же статья теперь имеет два адреса. Кому интересно,
можете сами организовать такую структуру.
Заключение
Некоторые тонкости. Обращение к переменным я делал как "$name".
На сервере, где мой хоумпейдж, работает именно так. На других
может быть "${name}" (скорее всего) или как-нибудь по-другому
(маловероятно).
При тестировании дома могут возникнуть сложности. Для получения
данных нужен сервер. Если у вас не стоит Apache или какой-нибудь
другой и вы не хотите его ставить, и не надо. Есть хорошая программка
Small HTTP Server (около 60кб). После установки вы сможете тестировать
дома CGI, SSI, PHP и т.д. |