| |
ассива. Если $Vars===false, то вместо
// него используется массив $GLOBALS (то есть делаются доступными все
// глобальные переменные). Значение параметра $ReadFile "истина"
// указывает, что в $templ хранится не содержимое шаблона, а имя файла,
// из которого его можно получить.
// Замечание: параметр $Vars передается по ссылке, т. к. для
// массивов передача ссылки работает значительно быстрее, чем
// копирование.
function _RunTemplate($tmpl, $ReadFile, &$Vars)
{ // Перехватываем стандартный поток вывода
ob_start();
// Если $Vars опущен, использовать вместо него $GLOBALS. Мы
// используем ссылки для убыстрения работы, чтобы PHP не пришлось
// копировать значения, чем экономим время.
if($Vars===false) $Vars=&$GLOBALS;
// Делаем доступными коду шаблона все переменные. Также создаем
// ссылки из соображений производительности.
foreach($Vars as $k=>$v) $$k=&$Vars[$k];
// Включаем файл по include, либо же запускаем eval().
if($ReadFile) { include $tmpl; }
else eval("?>$tmpl;");
// Получаем содержимое буфера и закрываем его
$MTResult=ob_get_contents();
ob_end_clean();
// Возвращаем развернутый шаблон
return $MTResult;
}
// Функция "разворачивает" шаблон, тело которого расположено
Часть V. Приемы программирования на PHP 488
// в файле $fname. Перед запуском переменные из $Vars делаются
// доступными шаблону (если этот параметр не опущен).
function ExpandFile($fname,$Vars=false)
{ return _RunTemplate($fname,true,$Vars);
}
// Функция "разворачивает" тело шаблона, явно заданное в $tmpl.
// Рекомендуется везде, где можно, применять ExpandFile() вместо
// данной функции, потому что это упрощает отладку.
function ExpandTemplate($tmpl,$Vars=false)
{ return _RunTemplate($tmpl,false,$Vars);
}
?>
Зачем нам две различных функции для "раскрытия" шаблона —
ExpandTemplate() и ExpandFile()? Почему бы не использовать всегда
ExpandTemplate(), предварительно загружая тело шаблона с помощью
функций чтения файлов? Все дело в тонкостях обработки ошибочных ситуаций
в PHP. А именно, в случае ошибки внутри файла, загружаемого по include,
PHP сообщит нам имя этого файла. Если же ошибка произойдет в eval(),
выведется только номер строки, что сильно затруднит отладку. Поэтому реко-
мендуется везде, где это допустимо, вызывать функцию ExpandFile().
Отправка и перекодирование писем
Приступим ко второй части нашей задачи — напишем функцию PostMail(), кото-
рая будет отправлять письмо адресату, преобразовав его предварительно в нужную
кодировку. Вот какие возможности она будет обеспечивать:
r вставку заголовка From в письмо, если он еще не присутствует в сообщении;
r преобразование письма в нужную кодировку кириллицы;
r вставку соответствующего значения в заголовок Content-type, чтобы письмо
было "понятно" любой почтовой программе;
r поддержку функций мини-шаблонизатора, который мы уже написали.
В листинге 32.2 приведен исходный код функции. Как обычно, мы помещаем функ-
цию в отдельный модуль библиотекаря (библиотекарь описан в главе 29). Этот мо-
дуль будет использовать возможности, предоставляемые библиотекой
Minitemplate.phl.
Глава 32. Почтовые шаблоны 489
Листинг 32.2. Функция PostMail(): Mail.phl
Uses("Minitemplate");
// Кодировка по умолчанию для исходного текста.
define("DefaultCode","w");
// Функция возвращает строку $st, переведенную из кодировки
// $from в кодировку $to. Возможные значения этих параметров:
// w[indows] — windows-1251
// k[oi8-r] — koi8-r
// m[ac] — x-mac-cyrillic
// i[so] — iso-8859-5
// t[ranslit] — translit ("английскими" буквами — "русские" слова)
// Замечание: квадратными скобками помечены необязательные символы.
// параметр $from не может равняться "t", потому что т
|
|