Глаза страшат, а руки делают

ШАГ 4


  • Директива #config
  • Собственный текст сообщения об ошибке
  • Определение и вывод размера файлов
  • Форматирование вывода даты и времени
  • Маленький практикум

ДИРЕКТИВА #config

Эта директива управляет следующимими опциями SSI:

  • установка текста сообщения об ошибке (атрибут errmsg);
  • настройка формата вывода размера файла (атрибут sizefmt);
  • настройка формата вывода даты/времени (атрибут timefmt).

Сама директива ничего не выводит, для вывода её значений нужно использовать другие инструкции (не только #echo).

Подробнее см. в разделе справочника «Директивы»

СОБСТВЕННЫЙ ТЕКСТ СООБЩЕНИЯ ОБ ОШИБКЕ

Если инструкция SSI или скрипта CGI задана некорректно, то на месте вывода данных этой инструкции сервер помещает сообщение об ошибке. Стандартно оно выглядит так: [an error occurred while processing this directive].

С помощью #config errmsg вместо этого текста можно назначить любой другой. Например, из «Жалобной книги» Чехова:

<!--#config errmsg = "[Подъезжая к своей станцыи, у меня слетела шляпа]" -->

Чтобы это сообщение вывелось на страницу, не нужно никаких специальных директив: достаточно написать что-нибудь неправильное. Давайте попробуем так:

<!--#tratata -->

Результат

[Подъезжая к своей станцыи, у меня слетела шляпа]

ПРИМЕЧАНИЕ

Инструкция #config errmsg должна быть помещена на основной странице документа. Находясь во вложенной странице, она не срабатывает. Так что задать её один раз на весь сайт с помощью SSI не получится.

ОПРЕДЕЛЕНИЕ И ВЫВОД РАЗМЕРА ФАЙЛОВ

Инструкция #config sizefmt определяет формат вывода размера файла и имеет 2 значения:

  • bytes — размер файла в байтах;
  • abbrev — размер файла в килобайтах (а если больше мегабайта, то в мегабайтах).

Синтаксис

<!--#config sizefmt = "bytes" -->
<!--#config sizefmt = "abbrev" -->

Вывод на экран осуществляется директивой #fsize.

Синтаксис

<!--#fsize file = "имя_файла" -->
<!--#fsize virtual = "/путь/имя_файла" -->

Атрибуты file и virtual работают точно так же, как в директиве #include.

Посмотрим в байтах размер файла 1 части моей 5 симфонии в папке MP3 от корня.

<!--#config sizefmt = "bytes" -->
<p><!--#fsize virtual = "/MP3/sym5_1.mp3" --></p>

Результат

9,148,093

Обратите внимание: запятыми разделяются тысячные разряды, а десятичная часть будет отделяться точкой, как мы сейчас увидим, выводя округлённый размер (файл большой, здесь он будет в мегабайтах выведен):

<!--#config sizefmt = "abbrev" -->
<p><!--#fsize virtual = "/MP3/sym5_1.mp3" --></p>

Результат

8.7M

(Можете проверить: 9 148 093 / 1024 и ещё на 1024 даёт 8,724301329 и т.д.)

ФОРМАТИРОВАНИЕ ВЫВОДА ДАТЫ И ВРЕМЕНИ

Для настройки формата даты/времени используется инструкция #config timefmt.

Синтаксис

<!--#config timefmt = "шаблон" -->

В качестве значений timefmt используется ряд специальных шаблонов. Их очень много, некоторые из них на разных платформах работают противоречиво. В существующих справочниках обычно приводятся неполные наборы, часто немного разные. Всё, что я сумел «нарыть» (на все буквы латинского алфавита), помещено в таблицу моего справочника. Здесь же я приведу лишь основные и непротиворечивые шаблоны.

Формат

Описание

Результат

Примечания

%a

Краткое название дня недели

Thu

 

%A

Полное название дня недели

Thursday

 

%b

Аббревиатура названия месяца

Jun

В трёхбуквенном мае полное и краткое назваеия совпадают.

%B

Полное название месяца

June

%d

День месяца

20

от 01 до 31
(с предваряющим нулём)

%D

Дата в формате "%m/%d/%y"

06/20/19

 

%e

День месяца

20

от 1 до 31
(без предваряющего нуля)

%H

Часы в 24-часовом формате

03

 

%I

Часы в 12-часовом формате

03

 

%m

Номер месяца

06

 

%M

Минуты

58

 

%p

AM/PM (до полудня/после)

AM

 

%r

Время в формате "%I:%M:%S %p"

03:58:40 AM

 

%R

Время в формате "%H:%M"

03:58

 

%S

Секунды

40

 

%t

Вставка символа табуляции

 

%T

Время в формате "%H:%M:%S"

03:58:40

 

%U

Неделя года (первый день недели — воскресенье)

24

 

%w

Номер дня недели

4

С воскресенья по субботу, 0–6

%W

Неделя года (первый день недели — понедельник)

24

 

%x

формат даты по умолчанию

06/20/19

 

%X

формат времени по умолчанию

03:58:40

 

%y

Год в формате ГГ

19

 

%Y

Год в формате ГГГГ

2019

 

Можно комбинировать шаблоны друг с другом и с любыми прочими символами.

Например, для шаблона ДД.ММ.ГГ, ЧЧ:ММ нужна следующая комбинация (в неё включены шаблоны из таблицы, знаки препинания и пробел):

<!--#config timefmt = "%d.%m.%Y, %H:%M" -->

Значение текущего времени находится в переменнх окружения DATE_LOCAL (в локальных настройках) и DATE_GMT (по Гринвичу). Её можно вывести директивой #echo, предварительно отформатировав через #config timefmt.

<!--#config timefmt = "%d.%m.%Y, %H:%M" -->
<!--#echo var = "DATE_LOCAL" -->

Результат

20.06.2019, 03:58

Есло мы изменим в шаблоне %d на %e, то получится почти то же самое, но однозначное календарное число будет без предваряющего нуля. Если Вы зашли сюда до 10-го числа, то увидите. Выведем для разнообразия по Гринвичу:

<!--#config timefmt = "%e.%m.%Y, %H:%M" -->
<!--#echo var = "DATE_GMT" -->

Результат

20.06.2019, 00:58

ПРИМЕЧАНИЕ

С некоторых пор на моём сервере время по умолчанию почему-то установили в GMT (по Гринвичу). Так что нормальное российское время через мои SSI установить, увы, невозможно.

И наконец, есть ещё одна переменная окружения, связанная со временем: LAST_MODIFIED, дата последнего обновления страницы (не только данной, но и любой на этом же сервере). Она содержит локальное время обновления и выводится с помощью другой директивы: #flastmod. Здесь тоже учитываются настройки #config timefmt.

Синтаксис

<!--#flastmod file = "имя_файла" -->
<!--#flastmod virtual = "/путь/имя_файла" -->

Атрибуты file и virtual работают аналогично уже рассмотренным случаям.

Настроим #config timefmt чуть по-другому (чтобы потренироваться) и выведем последние обновления данной и главной страниц:

<!--#config timefmt = "%e/%m-%y г. %H час. %M мин." -->
<p>Последнее обновление этой страницы: <!--#flastmod file = "ssi4.html" --></p>
<p>
Последнее обновление главной страницы: <!--#flastmod virtual = "/index.html" --></p>

Результат

Последнее обновление этой страницы: 17/11-17 г. 06 час. 20 мин.;

Последнее обновление главной страницы: 18/09-18 г. 18 час. 29 мин.

ПРИМЕЧАНИЕ

Для вывода времени обновления текущей страницы можно также напрямую воспользоваться переменной LAST_MODIFIED:

<!--#echo var = "LAST_MODIFIED" -->

МАЛЕНЬКИЙ ПРАКТИКУМ

А можно ли создавать для даты такие форматы, которые не предусмотрены шаблонами? Например, такой:

Сегодня четверг, 20 июня 2019 года.

Можно. Ибо то, что вы видите, сделано с помощью директив SSI.

Как?

А вот давайте попрактикуемся.

Тут важно понять два механизма.

Во-первых, мы можем сохранять значение переменной в другую переменную, и при переназначении первой последняя продолжает хранить изначальное значение.

Во-вторых, пользуясь условным оператором, мы можем назначать разные значения на переменную B в зависимости от текущего значения переменной A.

Сейчас поймём это на практике.

Итак, настраиваем дни недели. Шаблон %w хранит номера дней недели с 0 до 6 (от воскресенья до субботы). Настраиваем переменную numday на «перехват» текущего дня недели:

<!--#config timefmt = "%w" -->
<!--#set var = "numday" value = "$DATE_LOCAL" -->

ОБРАТИТЕ ВНИМАНИЕ

Чтобы показать, что value — не строка, а содержимое переменной, необходим префикс $.

Теперь, как бы мы ни перестраивали #config timefmt, шаблон %w надёжно хранится в переменной numday. А переменная day с помощью условного оператора будет именовать нужный день по-русски:

<!--#if expr = "$numday=1" -->
<!--#set var = "day" value = "понедельник" -->
<!--#elif expr = "$numday=2" -->
<!--#set var = "day" value = "вторник" -->
<!--#elif expr = "$numday=3" -->
<!--#set var = "day" value = "среда" -->
<!--#elif expr = "$numday=4" -->
<!--#set var = "day" value = "четверг" -->
<!--#elif expr = "$numday=5" -->
<!--#set var = "day" value = "пятница" -->
<!--#elif expr = "$numday=6" -->
<!--#set var = "day" value = "суббота" -->
<!--#else -->
<!--#set var = "day" value = "воскресенье" -->
<!--#endif -->

Теперь то же самое проделываем с месяцами (соответственно в переменные nummonth и month):

<!--#config timefmt = "%m" -->
<!--#set var = "nummonth" value = "$DATE_LOCAL" -->

<!--#if expr = "$nummonth=01" -->
<!--#set var = "month" value = "января" -->
<!--#elif expr = "$nummonth=02" -->
<!--#set var = "month" value = "февраля" -->
<!--#elif expr = "$nummonth=03" -->
<!--#set var = "month" value = "марта" -->
<!--#elif expr = "$nummonth=04" -->
<!--#set var = "month" value = "апреля" -->
<!--#elif expr = "$nummonth=05" -->
<!--#set var = "month" value = "мая" -->
<!--#elif expr = "$nummonth=06" -->
<!--#set var = "month" value = "июня" -->
<!--#elif expr = "$nummonth=07" -->
<!--#set var = "month" value = "июля" -->
<!--#elif expr = "$nummonth=08" -->
<!--#set var = "month" value = "августа" -->
<!--#elif expr = "$nummonth=09" -->
<!--#set var = "month" value = "сентября" -->
<!--#elif expr = "$nummonth=10" -->
<!--#set var = "month" value = "октября" -->
<!--#elif expr = "$nummonth=11" -->
<!--#set var = "month" value = "ноября" -->
<!--#else -->
<!--#set var = "month" value = "декабря" -->
<!--#endif -->

Настраиваем число (без предваряющего нуля в числах до 10-го) и загоняем в переменную date:

<!--#config timefmt = "%e" -->
<!--#set var = "date" value = "$DATE_LOCAL" -->

Задаём четырёхзначный формат года (в переменную year):

<!--#config timefmt = "%Y" -->
<!--#set var = "year" value = "$DATE_LOCAL" -->

Выводим строку:

<p><b>Сегодня <!--#echo var = "day" -->, <!--#echo var = "date" --> <!--#echo var = "month" --> <!--#echo var = "year" --> года.</b></p>

Результат мы уже видели.

Сегодня четверг, 20 июня 2019 года.

Конечно, это всё очень громоздко: ни тебе циклов, ни массивов, бедный «иф» вкалывает и за себя, и за того парня. Остаётся только снова вспомнить «Жалобную книгу»: «лопай, что дают».


Следующий шаг >>


 002428