Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 [ 146 ] 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

ция же Uses() всегда загружает файл лишь однажды, следя за тем, чтобы в следующий раз ее вызов был просто проигнорирован. Так что она нам не совсем подходит. В качестве альтернативы предлагается добавить в код библиотекаря еще одну функцию (назвав ее, например, UsesMulti() ), которая могла бы загружать указанный файл несколько раз. Единственное отличие ее кода от кода Uses() состоит в том, что она использует инструкцию include, а не include once. Написание этой функции предоставляю читателю.

Вот и подошло к концу описание нашего шаблонизатора. Надеюсь, я ничего не упустил. Впрочем, если вдруг в приведенном ниже коде вы обнаружите еще какую-нибудь возможность, которую я здесь забыл описать, ничего страшного, наверное, не случит-

Обработчик Apache для шаблонизатора

Так как шаблонизатор должен запускаться при обращении к любой странице на сервере, для него придется написать обработчик. Я привожу здесь его код без дополнительных пояснений, поскольку он практически полностью аналогичен тому коду, который мы рассматривали в главе 29.

\ Листинг 30.13. Обработчик шаблонизатора: TeinplateHandler.php

<?

Проверяем, не п1тается ли пользователь запустить обработчик напрямую, минуя Apache. $FileName=strtr( FILE ,"\\","/");

$ReqName=ereg Replace("\\?.*","",strtr(getenv("REQUEST URI"),"\\","/")); if(eregi(quotemeta($ReqName),$FileName)) {

В1водим сообщение об ошибке.

include "TemplateHandler.err";

Запис1ваем в журнал данн1е о пользователе.

$f=fopen("TemplateHandler.log","a+");

fputs($f,date("d.m.Y H:i.s")." $REMOTE ADDR - Access denied\n");

fclose($f);

Завершаем работу. exit;

Все в порядке - корректируем переменн1е окружения в соответствии

с запрошенным пользователем адресом.

@putenv("REQUEST URI=".

$GLOBALS["HTTP ENV VARS"]["REQUEST URI"]=



Модуль шаблонизатора: Template.phl

<?

Константы, задающие некоторые значения по умолчанию define("DefGlue"," "); символ склейки по умолчанию

define("Htaccess Name",".htaccess"); имя .htaccess-файла

Имена " стандартных" блоков

define("BlkTemplate","template"); шаблон страница:

$GLOBALS["REQUEST URI"]= getenv("QUERY STRING")

@putenv("QUERY STRING=".

$GLOBALS["HTTP ENV VARS"]["QUERY STRING"]= $GLOBALS["QUERY STRING"]=

ereg Replace("[?]*\\?","",getenv("QUERY STRING"))

Подключаем библиотекаря.

$INC[]=getcwd();

include "Librarian.phl";

Переходим в каталог со страницей.

chdir(dirname($SCRIPT FILENAME));

Загружаем шаблонизатор.

Uses("Template");

В1водим содержимое главного блока страниц:. echo RunUrl($SCRIPT NAME);

?>

Главный модуль шаблонизатора

Основной код шаблонизатора, который и выполняет всю работу, помещен в библиотеку Template.phl. Она содержит все функции, которые могут потребоваться в шаблонах и блочных страницах. Главная функция модуля - RunUrl() - "запускает" страницу, путь к которой (относительно корневого каталога сервера) передается в параметрах. Результат работы этой функции - содержимое блока Output, порожденного страницей.

В листинге 30.14 приводится полный код шаблонизатора с комментариями. ! Листинг 30.14.



define("BlkOutput","output"); этот блок в1водится в браузер

define("BlkDefGlue","defaultglue"); символ для "склейки" по умолчанию

Рабочие переменн1е

$GLOBALS["BLOCK"]=array(); массив тел всех блоков

$GLOBALS["BLOCK INC"]=array(); аналог $INC библиотекаря

$GLOBALS["CURBLOCK URL"]=false; URL текущего обрабатываемого файла

$GLOBALS["bSingleLine"]=0; обрабат1ваем1Й файл - .htaccess?

В следующем массиве перечислена: имена функций-фильтров,

которые будут вызваны для каждого блока, когда получено его

содержимое. Вы, возможно, захотите добавить сюда и другие

фильтры ( например, исполняющие роль простейшего макропроцессора,

заменяющего одни тэги на другие). Формат функций:

void FilterFunc(string $BlkName, string &$Value, string $BlkUrl)

$GLOBALS["BLOCKFILTERS"]=array( " FBlkTabs", " FBlkGlue"

*** Здесь могут располагаться имена ваших функций-фильтров.

Возвращает тело блока по его имени. Регистр символов не учитывается. function Blk($name)

{ return @$GLOBALS["BLOCK"][strtolower($name)]; }

Добавляет указанный URL в список путей поиска. При этом путь автоматически преобразуется в абсолютный URL ( за текущий каталог принимается каталог текущего обрабатываемого файла). function Inc($url)

{ global $CURBLOCK URL,$SCRIPT NAME;

$CurUrl=$CURBLOCK URL; if(!$CurUrl) $CurUrl=$SCRIPT NAME; if($url[0]!="/") $url=abs path($url,dirname($CurUrl));

$GLOBALS["BLOCK INC"][]=$url;

Устанавливает имя текущего блока и, возможно, его значение.

Все данные, выведенные после вызова этой функции, будут принадлежать

телу блока $name. Если задан параметр $value, тело сразу

устанавливается равным $value, а весь вывод просто проигноруется.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 [ 146 ] 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189