| |
тель. В этих языках подобъект класса-интерфейса IMysql содержится прямо внут-
ри объекта MysqlTable, и указатель на него можно получить либо посредством
явных преобразований типов, либо с помощью специальных функций для "отпочко-
вывания" интерфейса. Например, в COM+ эти функции часто называют
QueryInterface(). Здесь же у нас вышло нечто вроде примитивной поддержки
Глава 31. Объектно-ориентированное программирование на PHP 485
указателей (ведь объект класса IMysql именно указывает на "хозяина" типа
MysqlTable, но не содержит его в себе!), которых в PHP нет.
Правда, получилось все это несколько неказисто (уж очень некрасивы и одинаковы
функции переадресации...), зато механизм действительно работает и решает все
по-
ставленные задачи.
Глава 32
Почтовые
шаблоны
В главе 20 мы уже обсуждали задачу создания универсальной функции для рассылки
писем из PHP-сценария. Если вы помните, мы хотели назвать ее PostMail() и "нау-
чить" перекодировать письма в нужную кодировку перед их отсылкой, а также вы-
полнять функции небольшого шаблонизатора. В этой главе мы детально рассмотрим,
как может быть устроена такая функция.
Мини-шаблонизатор
Конечно, пользователю будет приятно, если письмо (пусть даже и сгенерированное
программой) будет адресовано ему лично. Например, в поле From содержится фами-
лия и имя клиента, а первые строки текста звучат как-нибудь вроде: "Уважаемый
ФИО!". Так что нам придется формировать текст письма "на лету" — проставлять в
нем нужное имя, фамилию, тему и т. д. по общему шаблону.
В идеале такой шаблон должен ничем не отличаться от небольшого PHP-сценария с
тэгами и ?> и возможностью использования команды echo или print, не говоря
уж о всех остальных инструкциях. Но вот беда: как нам этот самый шаблон
"развер-
нуть", превратить в письмо-строку, которую потом мы будем посылать по почте?
Пусть, например, у нас есть следующий шаблон письма (разделителем заголовков и
тела письма служит маркер ~StartOfMail, обрабатываемый функцией
PostMail()):
To: "=$Name?>" <=$email?>>
Subject: =$Subject?>
~StartOfMail
Дорогой =$Name?>!
Только что Вы подписались на наш лист рассылки.
Пожалуйста, подтвердите свое желание получать новости нашего сайта.
Если бы мы писали сценарии на PHP версии 3, задача обработки такого шаблона бы-
ла бы практически невыполнимой. К счастью, при использовании PHP версии 4 все
проще: в нем имеются функции "перехвата" стандартного выходного потока (о них
мы уже говорили в главе 30 ).
Глава 32. Почтовые шаблоны 487
Давайте начнем проектирование функции PostMail() с написания своеобразного
"мини-шаблонизатора" — функции, которая умеет "разворачивать" шаблоны наподо-
бие приведенного выше, возвращая окончательный текст. Назовем ее, к примеру,
ExpandTemplate() (листинг 32.1). Думаю, будет целесообразно вынести данную
функцию в отдельную библиотеку, потому что она достаточно универсальна для это-
го.
Листинг 32.1. Функции обработки шаблонов: Minitemplate.phl
// Эта функция используется для внутренних целей. Она возвращает
// "развернутый" шаблон $templ. Перед обработкой создаются переменные,
// имена которых содержатся в ключах массива $Vars, а значения — в
// соответствующих значениях
|
|