Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
на функция Block(). Теперь блок, который 
// она обрабатывала, закончился, и его надо добавить в массив 
// блоков (или же проигнорировать этот вывод). 
if($Handled) { 
// Имя предыдущего блока было задано? 
if($CurBlock!==false) { 
// Добавляем в массив блоков. 
$BLOCK[$CurBlock]=trim(ob_get_contents()); 
// Если блок однострочный (из файла .htaccess), то 
// удаляем все строки, кроме первой. 
if(@$bSingleLine) 
$BLOCK[$CurBlock]=ereg_Replace("[\r\n].*","",$BLOCK[$CurBlock]); 
// Запускаем фильтры 
_ProcessContent($CurBlock,$BLOCK[$CurBlock],$CURBLOCK_URL); 
} 
// Завершаем перехват потока вывода 
ob_end_clean(); $Handled=0; 
} 
// Если имя блока задано (а это происходит практически всегда), 
// значит, функция была вызвана нормальным образом, а не только для 
// того, чтобы завершить вывод последнего блока (см. функцию Load()). 
if($name!==false) { 
// Перехватываем поток вывода 
ob_start(); $Handled=1; 
// Тело явно не задано, значит, нужно его получить путем 

Глава 30. Код и шаблон страницы 445 
// перехвата выходного потока. Фактически, сейчас мы просто 
// говорим системе, что текущий блок — $name, и что как только 
// она встретит другой блок или конец файла, следует принять 
// выведенные данные и записать их в массив. 
if($value===false) { 
$CurBlock=$name; 
} else { 
// Тело задано явно. Записать блок в массив, но все равно 
// перехватить выходной поток (чтобы потом его проигнорировать). 
_ProcessContent($name,$value,$CURBLOCK_URL); 
$BLOCK[$name]=$value; 
$CurBlock=false; 
} 
} 
} 
// Загружает файл с URL $name и добавляет блоки, которые в нем 
// находились, к списку существующих блоков. Параметр $name может 
// задавать относительный URL, в этом случае производится его 
// поиск в глобальном массиве $INC (том же самом, который использует 
// библиотекарь). Если в качестве $name задано не имя файла, а имя 
// каталога, то анализируется файл .htaccess, расположенный 
// в этом каталоге. На момент загрузки файла текущий каталог 
// изменяется на тот, в котором расположен файл. 
function Load($name) 
{ global $BLOCK,$bSingleLine,$CURBLOCK_URL,$BLOCK_INC; 
// Перевести все пути в $INC в абсолютные 
AbsolutizeINC(); 
// Если путь относительный, ищем по $BLOCK_INC 
$fname=false; 
if($name[0]!='/') { 
// Перебираем все каталоги включения 
foreach($BLOCK_INC as $v) { 
$fname=Url2Path("$v/$name"); // Определяем имя файла 
if(file_exists($fname)) { $name="$v/$name"; break; } 
} 
// Если не нашли, $fname остается равной false 
} else { 
// Абсолютный URL — перевести его в имя файла 

Часть V. Приемы программирования на PHP 446 
$fname=Url2Path($name); 
} 
// Обрабатываем файл, имя которого вычислено по URL. 
// Сначала проверяем, существует ли такой файл. 
if($fname===false || !file_exists($fname)) 
die("Couldn't open \"$name\"!"); 
// Это каталог — значит, используем .htaccess 
$Single=false; 
if(@is_dir($fname)) { 
$name.="/".Htaccess_Name; 
$fname.="/".Htaccess_Name; 
$Single=1; 
} 
// Если файла до сих пор не существует (это может случиться, когда 
// мы предписали использовать .htaccess, а его в каталоге нет), 
// "мирно" выходим. Ничего страшного, если в каталоге нет .htaccess'а. 
if(!file_exists($fname)) return; 
// Запускаем файл. Для этого сначала запоминаем текущее состояние 
// и каталог, затем загружаем блоки файла (просто выполняем файл), 
// а в конце восстанавливаем состояние. 
$PrevSingle=$bSingleLine; $bSingleLine=@$Single; 
$SaveDir=getcwd(); chdir(dirname($fname)); 
$SaveCBU=$CURBLOCK_URL; $CURBLOCK_URL=$name; 
// Возможно, в файле присутствуют начальные пробелы или другие 
// нежелательные символы (например, в .htaccess это может 
// быть знак комментария). Все они включатся в блок с 
// именем _PreBlockText (его вряд ли целесообразно использовать). 
Block("_PreBlockText"); 
// Делаем доступными все глобальные переменные. 
foreach($GLOBALS as $k=>$v) if(!@Isset($$k)) global $$k; 
// Запускаем файл. 
include $fname; 
// Сигнализируем, что блоки закончились (достигнут конец файла). 
// При этом чаще всего будет осуществлена запись данных последнего 
// блока файла в массив. 
Block(); 
chdir($SaveDir); 
$CURBLOCK_URL=$SaveCBU; 
$bSingleLine=$PrevSingle; 

Глава 30. Код и шаблон страницы 447 
} 
// Главная функция шаблонизатора. Обрабатывает указанный файл $url 
// и возвращает тело блока Output. В выходной поток ничего не печатается 
// (за исключением предупреждений, если они возникли). 
function RunUr
 
<<-[Весь Текст]
Страница: из 287
 <<-