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

Почтовые шаблоны


В главе 20 мы уже обсуждали задачу создания универсальной функции для рассылки писем из PHP-сценария. Если вы помните, мы хотели назвать ее PostMail() и "научить" перекодировать письма в нужную кодировку перед их отсылкой, а также выполнять функции небольшого шаблонизатора. В этой главе мы детально рассмотрим, как может быть устроена такая функция.

Мини-шаблонизатор

Конечно, пользователю будет приятно, если письмо (пусть даже и сгенерированное программой) будет адресовано ему лично. Например, в поле From содержится фамилия и имя клиента, а первые строки текста звучат как-нибудь вроде: "Уважаемый ФИО!". Так что нам придется формировать текст письма "на лету" - проставлять в нем нужное имя, фамилию, тему и т. д. по общему шаблону.

В идеале такой шаблон должен ничем не отличаться от небольшого PHP-сценария с тэгами <? и ?> и возможностью использования команды echo или print, не говоря уж о всех остальных инструкциях. Но вот беда: как нам этот самый шаблон "развернуть", превратить в письмо-строку, которую потом мы будем посылать по почте? Пусть, например, у нас есть следующий шаблон письма (разделителем заголовков и тела письма служит маркер ~startOfMail, обрабатываемый функцией PostMail() ):

To: "<?=$Name?>" «?=$email?» Subject: <?=$Subject?> ~StartOfMail Дорогой <?=$Name?>!

Только что Вы подписались на наш лист расс1лки.

Пожалуйста, подтвердите свое желание получать новости нашего сайта.

Если бы мы писали сценарии на PHP версии 3, задача обработки такого шаблона была бы практически невыполнимой. К счастью, при использовании PHP версии 4 все проще: в нем имеются функции "перехвата" стандартного выходного потока (о них мы уже говорили в главе 30 ).



Листинг 32.1. Функции обработки шаблонов: Minitemplate.phl

<?

Эта функция используется для внутренних целей. Она возвращает

"развернут1й" шаблон $templ. Перед обработкой создаются переменн1е,

имена котор1х содержатся в ключах массива $Vars, а значения - в

соответствующих значениях массива. Если $Vars===false, то вместо

него используется массив $GLOBALS (то есть делаются доступн1ми все

глобальные переменные). Значение параметра $ReadFile "истина"

указывает, что в $templ хранится не содержимое шаблона, а имя файла,

из которого его можно получить.

Замечание: параметр $Vars передается по сс1лке, т. к. для массивов передача ссылки работает значительно быстрее, чем копирование.

function RunTemplate($tmpl, $ReadFile, &$Vars) { Перехватываем стандартный поток вывода ob start();

Если $Vars опущен, использовать вместо него $GLOBALS. Mi

используем сс1лки для убыстрения работы, чтобы 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;

Функция " разворачивает" шаблон, тело которого расположено

Давайте начнем проектирование функции PostMail() с написания своеобразного "мини-шаблонизатора" - функции, которая умеет "разворачивать" шаблоны наподобие приведенного выше, возвращая окончательный текст. Назовем ее, к примеру, ExpandTemplate() (листинг 32.1). Думаю, будет целесообразно вынести данную функцию в отдельную библиотеку, потому что она достаточно универсальна для этого.



( Замечание

Зачем нам две различных функции для "раскрытия" шаблона - ExpandTemplate() и ExpandFile() ? Почему бы не использовать всегда ExpandTemplate(), предварительно загружая тело шаблона с помощью функций чтения файлов? Все дело в тонкостях обработки ошибочных ситуаций в PHP. А именно, в случае ошибки внутри файла, загружаемого по include, PHP сообщит нам имя этого файла. Если же ошибка произойдет в eval(), выведется только номер строки, что сильно затруднит отладку. Поэтому рекомендуется везде, где это допустимо, вызывать функцию ExpandFile() .

Отправка и перекодирование писем

Приступим ко второй части нашей задачи - напишем функцию PostMail() , которая будет отправлять письмо адресату, преобразовав его предварительно в нужную кодировку. Вот какие возможности она будет обеспечивать:

□ вставку заголовка From в письмо, если он еще не присутствует в сообщении;

□ преобразование письма в нужную кодировку кириллицы;

□ вставку соответствующего значения в заголовок Content-type, чтобы письмо было "понятно" любой почтовой программе;

□ поддержку функций мини-шаблонизатора, который мы уже написали.

В листинге 32.2 приведен исходный код функции. Как обгчно, мы помещаем функцию в отдельный модуль библиотекаря (библиотекарь описан в главе 29). Этот модуль будет использовать возможности, предоставляемые библиотекой Minitemplate.phl.

в файле $fname. Перед запуском переменн1е из $Vars делаются доступн1ми шаблону (если этот параметр не опущен). function ExpandFile($fname,$Vars=false) { return RunTemplate($fname,true,$Vars);

Функция "разворачивает" тело шаблона, явно заданное в $tmpl. Рекомендуется везде, где можно, применять ExpandFile() вместо данной функции, потому что это упрощает отладку. function ExpandTemplate($tmpl,$Vars=false) { return RunTemplate($tmpl,false,$Vars);

?>



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