| |
nv("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");
// Выводим содержимое главного блока страницы.
echo RunUrl($SCRIPT_NAME);
?>
Главный модуль шаблонизатора
Основной код шаблонизатора, который и выполняет всю работу, помещен в библио-
теку Template.phl. Она содержит все функции, которые могут потребоваться в
шаблонах и блочных страницах. Главная функция модуля — RunUrl() — "запуска-
ет" страницу, путь к которой (относительно корневого каталога сервера)
передается в
параметрах. Результат работы этой функции — содержимое блока Output, порож-
денного страницей.
В листинге 30.14 приводится полный код шаблонизатора с комментариями.
Листинг 30.14. Модуль шаблонизатора: Template.phl
// Константы, задающие некоторые значения по умолчанию
define("DefGlue"," | "); // символ склейки по умолчанию
define("Htaccess_Name",".htaccess"); // имя .htaccess-файла
// Имена "стандартных" блоков
define("BlkTemplate","template"); // шаблон страницы
Глава 30. Код и шаблон страницы 443
define("BlkOutput","output"); // этот блок выводится в браузер
define("BlkDefGlue","defaultglue"); // символ для "склейки" по умолчанию
// Рабочие переменные
$GLOBALS["BLOCK"]=array(); // массив тел всех блоков
$GLOBALS["BLOCK_INC"]=array(); // аналог $INC библиотекаря
$GLOBALS["CURBLOCK_URL"]=false; // URL текущего обрабатываемого файла
$GLOBALS["bSingleLine"]=0; // обрабатываемый файл — .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, а весь вывод просто проигноруется.
Часть V. Приемы программирования на PHP 444
// Это удобно для коротких однострочных блоков, особенно расположенных
// в файлах .htaccess. Из того, что было выведено программой в
// стандартный поток, будут удалены начальные и концевые пробелы,
// а также вызовутся все функции-фильтры. Окончанием вывода,
// принадлежащего указанному блоку, считается конец файла либо начало
// другого блока (то есть еще один вызов Block()).
function Block($name=false, $value=false)
{ global $BLOCK,$bSingleLine,$CURBLOCK_URL;
// Объявляем некоторые флаги состояния
static $Handled=false; // в прошлый раз вывод был перехвачен
static $CurBlock=false; // имя текущего обрабатываемого блока
// Если имя блока задано, перевести его в нижний регистр
if($name!==false) $name=strtolower(trim($name));
// Вывод был перехвачен. Значит, что до этого вызова уже
// была запущ
|
|