Анимация
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

Эта функция предназначена для внутреннего использования. Она собирает блоки из файла, соответствующего указанному $url, в том числе и блоки из всех .htaccess-файлов "надкаталогов". function CollectBlocks($url) { global $BLOCK; $url=abs path($url,dirname($GLOBALS["SCRIPT NAME"]));

Если путь - не /, то обратиться к "надкаталогу". if(strlen($url)>1) CollectBlocks(dirname($url)); Загрузить блоки самого файла. Load($url);

Главная функция шаблонизатора. Обрабат1вает указанн1й файл $url

и возвращает тело блока Output. В выходной поток ничего не печатается

( за исключением предупреждений, если они возникли).

function RunUrl($url)

{ global $BLOCK;

Собираем все блоки. CollectBlocks($url);

Находим и запускаем главн1й шаблон. Mi делаем это в последнюю очередь, чтобы ему были доступны все блоки, из которых состоит страница. Шаблон - об1чн1й блочн1й файл. В нем обязательно должен присутствовать блок Output.

$tmpl=@$BLOCK[BlkTemplate]; if(!$tmpl) {

die("Cannot find the template for <b>$url</b> ".

"(have you defined <tt>".BlkTemplate."</tt> block?)");

Load($tmpl);

Возвращаем блок Output.

if(!isSet($BLOCK[BlkOutput])) {

die("No output from template <b>$tmpl</b> ".

"(have you defined <tt>".BlkOutput."</tt> block?)");

return $BLOCK[BlkOutput];



Запускает все фильтры для блока. function ProcessContent($name,&$cont,$url) { foreach($GLOBALS["BLOCKFILTERS"] as $F) $F($name,$cont,$url);

"Склеивание" блоков.

Если тело блока начинается с [name], то оно не просто записывается в массив блоков, а " пристыковывается" к значению, уже там находящемуся, причем в качестве символа-соединителя выступает тело блока с именем name. Если строка name не задана ( то есть указаны []), используется блок с именем DefaultGlue, а если этого блока нет, то соединитель по умолчанию - " ". function FBlkGlue($name,&$cont,$url)

{ global $BLOCK;

if(ereg("-\\[([-]])*]",$cont,$P)) {

$c=substr($cont,strlen($P[0])); тело блока после [name] $n=$P[1]; имя соединителя

Есть с чем " склеивать"? if(!empty($BLOCK[$name])) {

$glue=@$BLOCK[$n];

if(!Isset($glue)) $glue=@$BLOCK[BlkDefGlue]; if(!Isset($glue)) $glue=DefGlue; $cont=$BLOCK[$name].$glue.$c;

"Склеивать" нечего - просто присваиваем. else $cont=$c;

Удаление начальн1х символов табуляции из тела блока.

Теперь можно в1равнивать HTML-код в документах с помощью табуляции.

Это оказывается чрезвычайно удобным, если мы используем тэги,

например, в таком контексте:

< ?foreach($Book as $k=>$v) {? > <tr>

<td>< ?=$Book[name]? ></td> <td>< ?=$Book[text]? ></td>



Примечание

Эти чрезвычайно полезные функции впервые введены в PHP версии 4. Нужно заметить, что без них вряд ли можно написать более-менее удобный шаблонизатор. Я привожу здесь их описания в том виде, который принят в этой книге.

void ob start()

Вызов данной функции говорит PHP, что необходимо начать "перехват" стандартного выходного потока программы. Иными словами, весь текст, который выводится операторами echo или расположен вне участков кода PHP, будет накапливаться в специальном буфере, а не отправится в браузер. В любой момент времени мы можем получить все содержимое этого буфера, вызвав функцию ob get contents(). В шаблонизаторе мы вызываем ob start() каждый раз, когда встречается начало нового блока.

string ob get contents()

Функция возвращает текущее содержимое буфера, который заполняется операторами вывода при включенном режиме буферизации. Именно ob get contents() обеспечивает в нашем шаблонизаторе возможность накопления текста блоков. Она вызывается (а возвращенные данные записываются в массив) каждый раз, когда заканчивается очередной блок (вернее, перед началом следующего блока), а также при достижении конца файла.

</tr> < ?}? >

function FBlkTabs($name,&$cont,$url)

{ используем регулярное выражение в формате PCRE, т. к. это - единственный приемлемый способ решения задачи $cont=preg replace("/\t+/m","",$cont);

?>

"Перехват" выходного потока

В коде листинга 30.14 есть всего лишь несколько вызовов стандартных функций, которые мы еще не рассматривали в этой книге. Я имею в виду функции с префиксами ob (от Output Buffering - Буферизация вывода). Их задача - "перехватить" тот текст, который выводится операторами echo, а также участками, расположенными вне PHP-тэгов <? и ?>, и направить его в строковую переменную для дальнейшей обработки.



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