﻿<?php
echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n";
echo "<HTML><HEAD><TITLE></TITLE>\n";
echo "<META content=\"TEXT/HTML; CHARSET=WINDOWS-1251\" http-equiv=CONTENT-TYPE>\n";
echo "<META content=\"Microsoft FrontPage 4.0\" name=GENERATOR>\n";
echo "<STYLE></STYLE>\n";
echo "</HEAD>\n";
echo "<body background=../FON.JPG>\n";
echo "<ul>\n";
echo "\n";
echo "  <li><a href=\"#a\"><font face=\"Times New Roman\" size=3>Глава 12.\n";
echo "    Шаблоны</font> </a> </li>\n";
echo "  <ul>\n";
echo "    <li><a href=\"#b\"><font face=\"Times New Roman\" size=\"3\">О чем\n";
echo "      говорилось выше</font>\n";
echo "      </a>\n";
echo "    </li>\n";
echo "    <li><a href=\"#c\"><font face=\"Times New Roman\" size=\"3\">Нетривиальная\n";
echo "      система шаблонов</font>\n";
echo "      </a>\n";
echo "      <ul>\n";
echo "        <li><a href=\"#d\"><font face=\"Times New Roman\" size=\"3\">Регистрация\n";
echo "          файлов</font></a></li>\n";
echo "        <li><a href=\"#e\"><font face=\"Times New Roman\" size=\"3\">Регистрация\n";
echo "          переменных</font></a></li>\n";
echo "        <li><a href=\"#f\"><font face=\"Times New Roman\" size=\"3\">Обработка\n";
echo "          файла</font></a></li>\n";
echo "        <li><a href=\"#g\"><font face=\"Times New Roman\" size=\"3\">Вывод\n";
echo "          файла</font></a></li>\n";
echo "        <li><a href=\"#h\"><font face=\"Times New Roman\" size=\"3\">Расширение\n";
echo "          класса template</font></a></li>\n";
echo "        <li><a href=\"#i\"><font face=\"Times New Roman\" size=\"3\">Недостатки\n";
echo "          системы шаблонов</font></a></li>\n";
echo "        <li><a href=\"#j\"><font face=\"Times New Roman\" size=\"3\">Необоснованные\n";
echo "          надежды на «идеальное решение»</font></a></li>\n";
echo "        <li><a href=\"#k\"><font face=\"Times New Roman\" size=\"3\">Снижение\n";
echo "          быстродействия</font></a></li>\n";
echo "        <li><a href=\"#l\"><font face=\"Times New Roman\" size=\"3\">Ориентация\n";
echo "          дизайна на PHP</font></a></li>\n";
echo "      </ul>\n";
echo "    </li>\n";
echo "    <li><a href=\"#m\"><font face=\"Times New Roman\" size=\"3\">Проект:\n";
echo "      адресная книга</font></a></li>\n";
echo "    <li><a href=\"#n\"><font face=\"Times New Roman\" size=\"3\">Итоги</font></a></li>\n";
echo "  </ul>\n";
echo "</ul>\n";
echo "<A NAME=\"a\"></A><b>\n";
echo "<p>&nbsp;</p>\n";
echo "<p></b><font COLOR=\"#000000\" face=\"Times New Roman\" size=\"5\">ГЛАВА</font> <font COLOR=\"#000000\" face=\"Times New Roman\" size=\"5\">12</font></p>\n";
echo "<p><font COLOR=\"#000000\" face=\"Times New Roman\" size=\"5\">Шаблоны</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Шаблоны\n";
echo "можно рассматривать как «расширение»\n";
echo "программного кода. Шаблоны не только\n";
echo "автоматизируют утомительный процесс\n";
echo "кодирования, но и обеспечивают структурное\n";
echo "деление проекта в рабочих группах. Роль\n";
echo "такого деления возрастает с увеличением\n";
echo "объемов проекта и численности групп, а\n";
echo "также с усложнением архитектуры проекта,\n";
echo "причем не только на стадии\n";
echo "программирования, но и при последующем\n";
echo "сопровождении программы.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Сказанное\n";
echo "стоит пояснить на конкретном примере.\n";
echo "Допустим, у нас имеется команда\n";
echo "разработчиков, состоящая из web-дизайнеров и\n";
echo "программистов. В идеале группа web-дизайнеров\n";
echo "трудится над созданием привлекательного и\n";
echo "удобного сайта, а группа программистов в\n";
echo "это время работает над эффективностью и\n";
echo "широтой возможностей web-приложения. К\n";
echo "счастью, шаблоны заметно упрощают подобное\n";
echo "структурирование процесса. Настоящая глава\n";
echo "посвящена созданию системы шаблонов,\n";
echo "обеспечивающих подобное «разделение труда».</font></p>\n";
echo "<b>\n";
echo "<p><A NAME=\"b\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">О чем\n";
echo "говорилось выше</font></p>\n";
echo "</b>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">До\n";
echo "настоящего момента я упоминал о двух разных\n";
echo "подходах к созданию шаблонов РНР:</font></p>\n";
echo "<ul>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">внедрение\n";
echo "    HTML в код РНР;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">включение\n";
echo "    файлов в страницу.</font></li>\n";
echo "</ul>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Хотя первая\n";
echo "схема более понятна и проще реализуется,\n";
echo "она также в большей степени ограничивает\n";
echo "вашу свободу действий. Главная проблема\n";
echo "заключается в том, что код РНР смешивается с\n";
echo "компонентами HTML, образующими макет\n";
echo "страницы. Возникающие при этом проблемы\n";
echo "связаны не только с необходимостью\n";
echo "потенциальной поддержки одновременного\n";
echo "доступа к странице и ее модификации, но и с\n";
echo "повышенной вероятностью ошибок при\n";
echo "непосредственном просмотре и\n";
echo "редактировании страниц.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Вторая схема\n";
echo "во многих ситуациях оказывается гораздо\n";
echo "удобнее первой. Тем не менее, хотя структура\n";
echo "«заголовок — основная часть — колонтитул»\n";
echo "(см. главу 9)</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">хорошо\n";
echo "подходит для структурирования\n";
echo "относительно малых сайтов с четко\n";
echo "определенным форматом, с увеличением\n";
echo "объемов и сложности проекта эти\n";
echo "ограничения проявляются все заметнее.\n";
echo "Попытки решения этих проблем привели к\n";
echo "разработке новой схемы применения шаблонов,\n";
echo "более сложной по сравнению с двумя первыми,\n";
echo "но и обладающей существенно большей\n";
echo "гибкостью. В этой схеме разделяются два\n";
echo "главных компонента web-приложения: дизайн и\n";
echo "программирование. Подобное деление\n";
echo "обеспечивает возможность параллельной\n";
echo "разработки (web-дизайн и программирование)\n";
echo "без необходимости постоянной координации\n";
echo "на протяжении всего рабочего цикла. Более\n";
echo "того, оно позволяет в будущем\n";
echo "модифицировать один компонент, не влияя на\n";
echo "работу другого. В следующем разделе я\n";
echo "покажу, как устроена одна из таких схем «нетривиальных\n";
echo "шаблонов». Следует помнить, что эта схема\n";
echo "существует не только в РНР. Более того, она\n";
echo "появилась задолго до РНР и в настоящее\n";
echo "время используется в нескольких языках,\n";
echo "включая РНР, Perl и Java Server Pages. To, что описано в\n";
echo "этой главе, — не более чем адаптация этой\n";
echo "схемы применительно к РНР.</font></p>\n";
echo "<b>\n";
echo "<p><A NAME=\"c\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">Нетривиальная\n";
echo "система шаблонов</font></p>\n";
echo "</b>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Как\n";
echo "говорилось ранее, главной целью при\n";
echo "разработке подобных систем шаблонов\n";
echo "является фактическое отделение дизайна от\n";
echo "функциональных возможностей. Собственно,\n";
echo "эта система и создается для того, чтобы\n";
echo "программисты и дизайнеры могли независимо\n";
echo "трудиться над своими аспектами приложения, </font><i><font COLOR=\"#000000\">не\n";
echo "мешая </font></i><font COLOR=\"#000000\">работе другой\n";
echo "группы.</font></font></p>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">К счастью,\n";
echo "сделать это проще, чем кажется на первый\n";
echo "взгляд, — при условии, что <i>до</i></font><i><font COLOR=\"#000000\">\n";
echo "начала </font></i><font COLOR=\"#000000\">разработки было\n";
echo "проведено некоторое предварительное\n";
echo "планирование. В листинге 12.1 представлен\n";
echo "некий базовый шаблон, созданный на основе\n";
echo "материала этой главы.</font></font></p>\n";
echo "<b><i>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Листинг\n";
echo "12.1.</font></font></i></b><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\"><i>\n";
echo "</i></font><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Пример\n";
echo "шаблона</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;html&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;head&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;title&gt;:::::{page_title}:::::&lt;/title&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/head&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;body bgcolor=&quot;{bg_color}&quot;&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">Welcome to your default\n";
echo "home page. {user_name}!&lt;br&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">You have 5 MB and 3\n";
echo "email addresses at your disposal.&lt;br&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">Have fun!</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/body&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/html&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Обратите\n";
echo "внимание на три строки (page_title, bg_color и userjiame),\n";
echo "заключенные в фигурные скобки ({ }). Фигурные\n";
echo "скобки имеют особый смысл при обработке\n";
echo "шаблонов — заключенная в них строка\n";
echo "интерпретируется как имя переменной,\n";
echo "вместо которого подставляется ее значение.\n";
echo "Дизайнер строит страницу по своему\n";
echo "усмотрению; все, что от него потребуется, —\n";
echo "включать в соответствующие места документа\n";
echo "эти ключевые строки. Конечно, программисты\n";
echo "и дизайнеры должны заранее согласовать\n";
echo "имена всех переменных!</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Итак, как же\n";
echo "работает эта схема? Прежде всего, возможно,\n";
echo "нам придется одновременно работать с\n";
echo "несколькими шаблонами, обладающими одними\n";
echo "и теми же общими атрибутами. В таких\n";
echo "ситуациях применение технологии объектно-ориентированного\n";
echo "программирования (ООП) оказывается\n";
echo "особенно эффективным. По этой причине все\n";
echo "функции построения и выполнения операций с\n";
echo "шаблонами будут оформлены в виде методов\n";
echo "класса. Определение класса начинается так:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">class template {</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $files = array( );</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $variables = array( );</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $openi ng_escape = '{';</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $closing_escape =\n";
echo "'}';</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">В массиве\n";
echo "$files хранятся идентификаторы файлов и\n";
echo "содержимое каждого файла. Атрибут $variables\n";
echo "представляет собой двухмерный массив для\n";
echo "хранения файлового идентификатора (ключа) и\n";
echo "всех соответствующих переменных,\n";
echo "обрабатываемых в схеме шаблонов. Наконец,\n";
echo "атрибуты $opening_escape и $closing_escape задают\n";
echo "ограничители для частей шаблона, которые\n";
echo "должны заменяться системой. Как было\n";
echo "показано в листинге 12.1, в наших примерах в\n";
echo "качестве ограничителей будут\n";
echo "использоваться фигурные скобки ({ }). Впрочем,\n";
echo "вы можете изменить два последних атрибута и\n";
echo "выбрать ограничители по своему усмотрению.\n";
echo "Главное — проследите за тем, чтобы эти\n";
echo "символы не использовались для других целей.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Каждый метод\n";
echo "класса решает конкретную задачу,\n";
echo "соответствующую той или иной операции в\n";
echo "процессе обработки шаблона. На простейшем\n";
echo "уровне этот процесс можно разделить на\n";
echo "четыре стадии.</font></p>\n";
echo "<b>\n";
echo "<ul>\n";
echo "  <li><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Регистрация\n";
echo "    файлов </font></font></b><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">—\n";
echo "  регистрация всех файлов, обрабатываемых\n";
echo "  сценариями</font></font> <font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">шаблонов.</font></li>\n";
echo "<b>\n";
echo "<li><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Регистрация\n";
echo "  переменных </font></font></b><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">—\n";
echo "регистрация всех переменных, которые\n";
echo "должны</font></font> <font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">заменяться\n";
echo "своими значениями в зарегистрированных\n";
echo "файлах.</font></li>\n";
echo "<b>\n";
echo "<li><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Обработка\n";
echo "  файлов </font></font></b><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">—\n";
echo "замена всех переменных, находящихся между\n";
echo "ограничителями, в зарегистрированных\n";
echo "файлах.</font></font></li>\n";
echo "<b>\n";
echo "<li><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Вывод\n";
echo "  файла </font></font></b><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">—\n";
echo "вывод обработанных зарегистрированных\n";
echo "файлов в браузере.</font></font></li>\n";
echo "</ul>\n";
echo "<p><i><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\"><img border=\"0\" src=\"Prim.gif\" align=left width=\"36\" height=\"35\">Применение\n";
echo "концепций ООП в РНР рассматривалось в главе\n";
echo "6. Если вы не знакомы с ООП, я рекомендую\n";
echo "бегло просмотреть главу 6 перед тем, как\n";
echo "читать дальше.</font></p>\n";
echo "</i>\n";
echo "<p><A NAME=\"d\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">Регистрация\n";
echo "файлов</font></p>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">В\n";
echo "процессе </font><i><font COLOR=\"#000000\">регистрации </font></i><font COLOR=\"#000000\">содержимое\n";
echo "файла сохраняется в массиве с ключом,\n";
echo "однозначно идентифицирующим этот файл.\n";
echo "Метод register_file( ) открывает и читает\n";
echo "содержимое файла, имя которого передается в\n";
echo "качестве параметра. Код этого метода\n";
echo "приведен в листинге 12.2.</font></font></p>\n";
echo "<b><i>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Листинг\n";
echo "12.2. </font></font></i></b><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Метод\n";
echo "регистрации файла</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">function register_file($file_id,\n";
echo "$file_name) {</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Открыть\n";
echo "$file_name для чтения или завершить программу</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// с выдачей\n";
echo "сообщения об ошибке.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$fh = fopen($file_name,\n";
echo "&quot;r&quot;) or die(&quot;Couldn't open $file_name!&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Прочитать\n";
echo "все содержимое файла $file_name в переменную.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$file_contents = fread($fh, filesize($file_name));</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Присвоить\n";
echo "содержимое элементу массива</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// с ключом $file_id.\n";
echo "$this-&gt;files[$file_id] = $file_contents;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// </font><font size=\"3\" face=\"Courier New\"><font COLOR=\"#000000\">Работа\n";
echo "с файлом завершена, закрыть его.</font></font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">fclose($fh);</font></p>\n";
echo "<p><font color=\"#000000\" size=\"3\" face=\"Courier New\">}</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Параметр\n";
echo "$file_id содержит идентификатор — «псевдоним»\n";
echo "для последующих операций с файлом,\n";
echo "упрощающий последующие вызовы метода.\n";
echo "Идентификатор используется в качестве\n";
echo "ключа для индексирования массива $files.\n";
echo "Пример регистрации файла:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Включить\n";
echo "класс шаблона</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">include(&quot;tempiate.class&quot;):</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Создать\n";
echo "новый экземпляр класса</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$template = new template:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "Зарегистрировать файл &quot;homepage.html&quot;,</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "присвоив ему псевдоним &quot;home&quot;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$template-&gt;register_file(&quot;home&quot;,\n";
echo "&quot;homepage.html&quot;);</font></p>\n";
echo "<p><A NAME=\"e\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">Регистрация\n";
echo "переменных</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">После\n";
echo "регистрации файлов необходимо\n";
echo "зарегистрировать все переменные, которые\n";
echo "будут интерпретироваться особым образом.\n";
echo "Метод register_variables( ) (листинг 12.3) работает по\n";
echo "тому же принципу, что и register_file( ), — он\n";
echo "читает имена переменных и сохраняет их в\n";
echo "массиве $variables.</font></p>\n";
echo "<b>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\"><i>Листинг\n";
echo "12.3. </i> </font></font></b><i><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Метод\n";
echo "регистрации переменнных</font></i></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">function\n";
echo "register_vanables($file_id, $variable_name) {</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Попытаться\n";
echo "создать массив,</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// содержащий\n";
echo "переданные имена переменных</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$input_variables -\n";
echo "explode(&quot;.&quot;, $variable_name);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Перебрать\n";
echo "имена переменных</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">while (Iist($value) =\n";
echo "each($input_variables)) :</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Присвоить\n";
echo "значение очередному элементу массива</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$this-&gt;variables\n";
echo "$this-&gt;variables[$file_id][] = $value:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">endwhile;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">}</font></p>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">В\n";
echo "параметре $file_id передается ранее </font><i><font COLOR=\"#000000\">присвоенный\n";
echo "</font></i><font COLOR=\"#000000\">псевдоним файла. Например,\n";
echo "в предыдущем примере файлу homepage.html был\n";
echo "присвоен псевдоним home. Обратите внимание —\n";
echo "при регистрации имен переменных, которые\n";
echo "должны особым образом обрабатываться в\n";
echo "файле homepage.html, вы должны ссылаться на файл\n";
echo "по псевдониму! В параметре $variable_name\n";
echo "передаются имена одной или нескольких\n";
echo "переменных, регистрируемых для указанного\n";
echo "псевдонима. Пример:</font></font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Включить\n";
echo "класс шаблона include(&quot;tempiate.class&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Создать\n";
echo "новый экземпляр класса $template = new template;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "Зарегистрировать файл &quot;homepage.html&quot;,</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "присвоив ему псевдоним &quot;home&quot; $template-&gt;register_file(&quot;home&quot;,\n";
echo "&quot;homepage.html&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "Зарегистрировать несколько переменных</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$template-&gt;register_variablest&quot;home&quot;,\n";
echo "&quot;page_title.bg_color,user_name&quot;);</font></p>\n";
echo "<p><A NAME=\"f\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">Обработка\n";
echo "файла</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">После того\n";
echo "как файлы и переменные будут\n";
echo "зарегистрированы в системе шаблонов, можно\n";
echo "переходить к обработке зарегистрированных\n";
echo "файлов и замене всех ссылок на переменные с\n";
echo "соответствующими значениями. Метод file_parser( )\n";
echo "приведен в листинге 12.4.</font></p>\n";
echo "<b><i>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Листинг\n";
echo "12.4. </font></font></i></b><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Метод\n";
echo "обработки файла</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">function file_parser($file_id)\n";
echo "{</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Сколько\n";
echo "переменных зарегистрировано для данного\n";
echo "файла?</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$varcount = count($this-&gt;variables[$file_id]);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Сколько\n";
echo "файлов зарегистрировано?</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$keys = array_keys($this-&gt;files):</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Если файл\n";
echo "$file_id существует в массиве</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$this-&gt;files</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// и с ним\n";
echo "связаны зарегистрированные переменные</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">If ( (in_array($file_id.\n";
echo "$keys)) &amp;&amp; ($varcount &gt; 0) ) :</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Сбросить $x\n";
echo "$x = 0:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Пока\n";
echo "остаются переменные для обработки...</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">while ($x\n";
echo "&lt; sizeof($this-&gt;variables[$file_id])) :</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Получить\n";
echo "имя очередной переменной $string = $this-&gt;variables[$file_id][$x];</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Получить\n";
echo "значение переменной. Обратите внимание:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "для получения значения используется\n";
echo "конструкция $$.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Полученное значение\n";
echo "подставляется в файл вместо</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// указанного\n";
echo "имени переменной.GLOBAL $$string:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Построить\n";
echo "точный текст замены вместе с\n";
echo "ограничителями</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$needle = $this-&gt;opening_escape.$string.$this-&gt;closing_escape;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Выполнить\n";
echo "замену.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$this-&gt;files[$file_id] = str_replace( $needle.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$$string.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$this-&gt;files[$file_id]);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Увеличить $х $x++;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">endwhile;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">endif;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">}</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Сначала мы\n";
echo "проверяем, присутствует ли указанное имя\n";
echo "файла в массиве $this-&gt;files. Если файл был\n";
echo "зарегистрирован, мы также проверяем, были\n";
echo "ли для него зарегистрированы переменные, и\n";
echo "если были — значения этих переменных\n";
echo "подставляются в содержимое $file_id. Пример:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Включить\n";
echo "класс шаблона include(&quot;template. class&quot;) ;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$page_title = &quot;Welcome\n";
echo "to your homepage!&quot;;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$bg_color = &quot;white&quot;; $user_name = &quot;Chef\n";
echo "Jacques&quot;;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Создать\n";
echo "новый экземпляр класса</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$template = new template;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "Зарегистрировать файл &quot;homepage.html&quot;,</font></p>\n";
echo "<i>\n";
echo "<p><font face=\"Courier New\"><font COLOR=\"#000000\" size=\"3\">II </font></font></i><font size=\"3\" face=\"Courier New\"><font COLOR=\"#000000\">присвоив\n";
echo "ему псевдоним &quot;home&quot;</font></font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$template-&gt;register_file(\n";
echo "&quot;home&quot;, &quot;homepage.html&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "Зарегистрировать несолько переменных</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$template-&gt;register_variables(&quot;home&quot;,\n";
echo "&quot;page_titie, bg_color, user_name&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$template-&gt;file_parser(&quot;home&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Поскольку\n";
echo "переменные page_title, bg_color и user_name были\n";
echo "зарегистрированы, значения каждой\n";
echo "переменной (присвоенные в начале сценария)\n";
echo "подставляются в страницу homepage.html,\n";
echo "хранящуюся в массиве files (атрибуте объекта-шаблона).\n";
echo "На этом предварительная подготовка\n";
echo "завершается, остается лишь вывести\n";
echo "полученный шаблон в браузере. Эта операция\n";
echo "рассматривается в следующем разделе.</font></p>\n";
echo "<p><A NAME=\"g\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">Вывод файла</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Вероятно,\n";
echo "после обработки файла вы захотите\n";
echo "отправить его в браузер, чтобы пользователь\n";
echo "увидел результат обработки шаблона. В нашем\n";
echo "примере для вывода</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">файла\n";
echo "создается отдельный метод, приведенный в\n";
echo "листинге 12.5, однако в зависимости от\n";
echo "ситуации вывод также может интегрироваться\n";
echo "с методом f i I e_parser().</font></p>\n";
echo "<b><i>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Листинг\n";
echo "12.5. </font></font></i></b><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Метод\n";
echo "вывода файла в браузере</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">function pnnt_file($file_id)\n";
echo "{</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Вывести\n";
echo "содержимое файла с идентификатором</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$file_id print\n";
echo "$this-&gt;files[$file id];</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">}</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Все очень\n";
echo "просто — при вызове print_file( ) содержимое\n";
echo "файла, представленного ключом $file_id,\n";
echo "передается в браузер.</font></p>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">В\n";
echo "листинге 12.6 приведен пример использования\n";
echo "класса template.</font></font></p>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><b><i><font COLOR=\"#000000\">Листинг 12.6. </font></i></b></font><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Пример\n";
echo "использования класса template</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Включить\n";
echo "класс шаблона, include(&quot;tempiate.class&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Присвоить\n";
echo "значения переменным</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$page_title = &quot;Welcome to your\n";
echo "homepage!&quot;;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$bg_color = &quot;white&quot;; $user_name = &quot;Chef Jacques&quot;:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Создать\n";
echo "новый экземпляр класса $template= new template;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "Зарегистрировать файл &quot;homepage.html&quot; с\n";
echo "псевдонимом &quot;home&quot;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$template-&gt;register_file(&quot;home&quot;,\n";
echo "&quot;homepage.html&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "Зарегистрировать переменные</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$template-&gt;register_variables(&quot;home&quot;,\n";
echo "&quot;page_title, bg_color.user_name&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$template-&gt;file_parser(&quot;home&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Передать\n";
echo "результат в браузер</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$template-&gt;print_file(&quot;home&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Если бы\n";
echo "шаблон, приведенный в листинге 12.1, хранился\n";
echo "в файле homepage.html в одном каталоге со\n";
echo "сценарием из листинга 12.6, то в браузер был\n";
echo "бы направлен следующий код HTML:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;html&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;head&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;title&gt;:::::Welcome\n";
echo "to your homepage!:::::&lt;/title&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/head&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;body bgcolor=white&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">Welcome to your default\n";
echo "home page, Chef Jacques!&lt;br&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">You have 5 MB and 3\n";
echo "email addresses at your disposal.&lt;br&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">Have fun!</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/body&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/html&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Как видно из\n";
echo "приведенного примера, все\n";
echo "зарегистрированные переменные были\n";
echo "заменены соответствующими значениями. При\n";
echo "всей своей простоте класс tempi ate</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">обеспечивает\n";
echo "стопроцентное разделение уровней\n";
echo "программирования и дизайна. Полный код\n";
echo "класса template приведен в листинге 12.7.</font></p>\n";
echo "<b><i>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Листинг\n";
echo "12.7. </font></font></i></b><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Полный\n";
echo "код класса template</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">class template {</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $files = array( );</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $variables = array( );</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $opening_escape = '{';</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $closing_escape = '}'\n";
echo ";</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Функция:\n";
echo "register_file( )</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Назначение:\n";
echo "сохранение в массиве содержимого файла.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "определяемого идентификатором $file_id</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">function register_file($file_id.\n";
echo "$file_name) {</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Открыть\n";
echo "$file_name для чтения или завершить программу</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// с выдачей\n";
echo "сообщения об ошибке.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$fh = fopen($file_name,\n";
echo "&quot;r&quot;) or die(&quot;Couldn't open $file_name!&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Прочитать\n";
echo "все содержимое файла $file_name в переменную.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$file_contents = fread($fh, filesize($file_name));</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Присвоить\n";
echo "содержимое элементу массива</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// с ключом $file_id.\n";
echo "$this-&gt;files[$file_id] = $file_contents;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Работа с\n";
echo "файлом завершена, закрыть его.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">fclose($fh):</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">}</font> <font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "Функция: register_variables( )</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Назначение:\n";
echo "сохранение переменных, переданных</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// в\n";
echo "параметре $variable_name. в массиве с ключом $file_id.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">function register_variables($file_id,\n";
echo "$variable_name) {</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Попытаться\n";
echo "создать массив.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// содержащий\n";
echo "переданные имена переменных</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$input_variables =\n";
echo "explode(&quot;.&quot;, $vahable_name);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Перебрать\n";
echo "имена переменных</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">while (list(, $value) =\n";
echo "each($input_variables)) :</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Присвоить\n";
echo "значение очередному элементу массива $this-&gt;variables\n";
echo "$this-&gt;variables[$file_id][] = $value:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">endwhile;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">} //\n";
echo "Функция: file_parser( )</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Назначение:\n";
echo "замена всех зарегистрированных переменных</font></p>\n";
echo "<p><font color=\"#000000\" size=\"3\" face=\"Courier New\">// в файле с идентификатором $file_id</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">function file_parser($file_id)\n";
echo "{</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Сколько\n";
echo "переменных зарегистрировано для данного\n";
echo "файла?</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$varcount = count($this-&gt;variables[$file_id]):</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Сколько\n";
echo "файлов зарегистрировано?</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$keys = array_keys($this-&gt;files):</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Если файл\n";
echo "$file_id существует в массиве $this-&gt;files</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// и с ним\n";
echo "связаны зарегистрированные переменные</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">if ( (in_array($file_id.\n";
echo "$keys)) &amp;&amp; ($varcount &gt; 0) ) :</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Сбросить $х\n";
echo "$x - 0;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Пока\n";
echo "остаются переменные для обработки...</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">while ($x\n";
echo "&lt; sizeof($this-&gt;variables[$file_id])) :</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Получить\n";
echo "имя очередной переменной</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$string = $this-&gt;variables[$file_id][$x];</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Получить\n";
echo "значение переменной. Обратите внимание:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "для получения значения используется\n";
echo "конструкция $$.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Полученное значение\n";
echo "подставляется в файл вместо</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// указанного\n";
echo "имени переменной.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">GLOBAL $$string;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Построить\n";
echo "точный текст замены вместе с\n";
echo "ограничителями</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$needle = $this-&gt;opemng_escape.$string.$this-&gt;closing_escape;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Выполнить\n";
echo "замену.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$this-&gt;files[$file_id] = str_replace( $needle, $$string,</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$this-&gt;files[$file_idj);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Увеличить $х $x++;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">endwhile;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">endif;</font></p>\n";
echo "<p><font color=\"#000000\" size=\"3\" face=\"Courier New\">}</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Функция:\n";
echo "print_file()</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Назначение:\n";
echo "вывод содержимого файла,</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "определяемого параметром $file_id</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">function print_file($file_id)\n";
echo "{</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Вывести\n";
echo "содержимое файла с идентификатором $file_id</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">print $this-&gt;files[$file_id];</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">}</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">} //END template.class</font></p>\n";
echo "<p><A NAME=\"h\"></A>\n";
echo "<font COLOR=\"#000000\" face=\"Times New Roman\" size=\"4\">Расширения\n";
echo "класса template</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Конечно,\n";
echo "класс tempi ate обладает весьма ограниченными\n";
echo "возможностями, хотя для проектов,\n";
echo "создаваемых на скорую руку, он вполне\n";
echo "подходит. Объектно-</font><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">ориентированные\n";
echo "схемы хороши тем, что они позволяют легко\n";
echo "наращивать функциональность, не беспокоясь\n";
echo "о возможных нарушениях работы\n";
echo "существующего кода. Допустим, вы решили\n";
echo "создать новый метод, который будет\n";
echo "загружать значения для последующей замены\n";
echo "из базы данных. Хотя такой метод устроен\n";
echo "чуть сложнее, чем метод file_parser( ),\n";
echo "производящий простую замену глобальных\n";
echo "переменных, его реализация на базе SQL\n";
echo "состоит из нескольких строк и легко\n";
echo "инкапсулируется в отдельном методе. Более\n";
echo "того, мы создадим нечто подобное в проекте\n";
echo "адресной книги, завершающем эту главу.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">В класс tempi ate\n";
echo "можно внести несколько очевидных\n";
echo "усовершенствований. Первое — объединение\n";
echo "функций register_file( ) и register_variables( ),\n";
echo "обеспечивающее автоматическую регистрацию\n";
echo "переменных для каждого регистрируемого\n";
echo "файла. Конечно, при этом также необходимо\n";
echo "реализовать проверку ошибок, чтобы\n";
echo "предотвратить регистрацию неверных файлов\n";
echo "и переменных.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Однако на\n";
echo "этом возможности усовершенствования\n";
echo "далеко не исчерпаны. Подумайте, как бы вы\n";
echo "реализовали методы, работающие с целыми\n";
echo "массивами? На самом деле это проще, чем\n";
echo "кажется на первый взгляд. Проанализируйте\n";
echo "решение, использованное в проекте адресной\n";
echo "книги в конце главы. Общие принципы легко\n";
echo "трансформируются под любую конкретную\n";
echo "реализацию.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Общие схемы\n";
echo "работы с шаблонами были реализованы на\n";
echo "нескольких языках и ни в коем случае не\n";
echo "являются чем-то принципиально новым. В Web\n";
echo "можно найти немало информации о реализации\n";
echo "шаблонов. Рекомендую два особенно\n";
echo "интересных ресурса — сборники статей,\n";
echo "написанных с ориентацией на JavaScript:</font></p>\n";
echo "<ul>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\"><a href=\"http://www.netscape.com/viewsource/long_ssjs/long_ssjs.html\">http://www.netscape.com/viewsource/long_ssjs/long_ssjs.html</a>;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\"><a href=\"http://www.netscape.com/viewsource/schroder_template/schroder_template.html\">http://www.netscape.com/viewsource/schroder_template/schroder_template.html</a>.</font></li>\n";
echo "</ul>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">В следующей\n";
echo "статье затронута тема использования\n";
echo "шаблонов применительно к Java Server Pages:</font></p>\n";
echo "<ul>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\"><a href=\"http://www-4.ibm.com/software/webservers/appserv/doc/guide/asgdwp.html\">http://www-4.ibm.com/software/webservers/appserv/doc/guide/asgdwp.html</a>.</font></li>\n";
echo "</ul>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Кроме того,\n";
echo "описанная схема построения шаблонов\n";
echo "используется в нескольких библиотеках РНР,\n";
echo "среди которых наибольший интерес\n";
echo "представляют следующие:</font></p>\n";
echo "<ul>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">PHPLib Base Library:\n";
echo "    <a href=\"http://phplib.netuse.de\">http://phplib.netuse.de</a>;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Richard Hayes's\n";
echo "Template Class: <a href=\"http://www.heyes-computing.net\">http://www.heyes-computing.net</a>;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Fast Template: <a href=\"http://www.thewebmasters.net/php\">http://www.thewebmasters.net/php</a>.</font></li>\n";
echo "</ul>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">На сайте\n";
echo "ресурсов РНР, PHPBuilder (<a href=\"http://www.phpbuilder.com\">http://www.phpbuilder.com</a>), также\n";
echo "имеется несколько интересных учебников,\n";
echo "посвященных обработке шаблонов. Кроме того,\n";
echo "загляните на сайт РНР Classes Repository (<a href=\"http://phpclasses.UpperDesign.com\">http://phpclasses.UpperDesign.com</a>),\n";
echo "здесь также можно найти несколько\n";
echo "реализаций.</font></p>\n";
echo "<p><A NAME=\"i\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">Недостатки\n";
echo "системы шаблонов</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Хотя\n";
echo "рассмотренная система шаблонов\n";
echo "справляется со своей главной задачей —\n";
echo "полным разделением дизайна и\n";
echo "программирования, она не лишена\n";
echo "недостатков. Некоторые из этих недостатков\n";
echo "перечислены ниже.</font></p>\n";
echo "<p><A NAME=\"j\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">Необоснованные\n";
echo "надежды на «идеальное решение»</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Шаблоны\n";
echo "помогают четко выделить в проекте аспекты\n";
echo "программирования и дизайна, но они не\n";
echo "заменяют нормального взаимодействия между\n";
echo "этими аспектами. Более того, правильность\n";
echo "их работы зависит от предварительного\n";
echo "согласования списка переменных, заменяемых\n";
echo "в процессе обработки шаблона. Как и в любом\n";
echo "успешном проекте, переходить к написанию\n";
echo "кода РНР следует лишь после тщательной\n";
echo "проработки спецификации всего приложения.\n";
echo "Это значительно уменьшает вероятность\n";
echo "ошибок при последующей обработке,\n";
echo "приводящих к непредвиденным последствиям\n";
echo "при использовании шаблонов.</font></p>\n";
echo "<p><A NAME=\"k\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">Снижение\n";
echo "быстродействия</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Затраты на\n";
echo "обработку файлов приводят к некоторому\n";
echo "замедлению работы программы. В какой мере\n";
echo "замедляется работа, зависит от ряда\n";
echo "факторов, в том числе от размера страницы,\n";
echo "размера запроса SQL (если они задействован) и\n";
echo "аппаратной конфигурации компьютера. Как\n";
echo "правило, эти потери настолько малы, что ими\n";
echo "можно пренебречь, но в некоторых ситуациях\n";
echo "они оказываются довольно значительными (например,\n";
echo "при одновременной обработке нескольких\n";
echo "шаблонов в условиях высокого трафика).</font></p>\n";
echo "<p><A NAME=\"l\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">Ориентация\n";
echo "дизайна на РНР</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Одна из\n";
echo "главных целей создания шаблонов\n";
echo "заключается в том, чтобы по возможности\n";
echo "изолировать дизайнера от программного кода\n";
echo "при редактировании внешнего вида и\n";
echo "поведения страницы. В идеальном случае\n";
echo "дизайнер должен обладать некоторыми\n";
echo "навыками программирования или, по крайней\n";
echo "мере, быть знакомым с общими концепциями —\n";
echo "переменными, циклами и условными командами.\n";
echo "Дизайнеру, абсолютно не разбирающемуся в\n";
echo "них, применение шаблонов практически\n";
echo "ничего не даст, кроме относительно\n";
echo "бесполезных сведений из области синтаксиса.\n";
echo "В общем, независимо от того, захотите вы\n";
echo "пользоваться этим типом шаблонов или нет, я\n";
echo "настоятельно рекомендую потратить немного\n";
echo "времени и обучить дизайнера азам языка РНР...\n";
echo "а еще лучше — купить ему эту книгу! От этого\n";
echo "выиграют обе стороны, поскольку дизайнер\n";
echo "приобретет дополнительные навыки и станет\n";
echo "более ценным членом рабочей группы, а у\n";
echo "программиста появится новый источник идей.\n";
echo "Может, дизайнер и не изобретет ничего\n";
echo "выдающегося, но зато он взглянет на\n";
echo "ситуацию под новым углом зрения, обычно\n";
echo "недоступным для программиста.</font></p>\n";
echo "<b>\n";
echo "<p><A NAME=\"m\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">Проект:\n";
echo "адресная книга</font></p>\n";
echo "</b>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Хотя системы\n";
echo "шаблонов хорошо подходят для многих типов\n";
echo "web-приложений, они приносят особенную\n";
echo "пользу в приложениях, ориентированных на\n";
echo "выборку и вывод данных, в которых особенно\n";
echo "важно обеспечить правильное\n";
echo "форматирование.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Примером\n";
echo "такого приложения является адресная книга.\n";
echo "Представьте себе обычную (бумажную)\n";
echo "адресную книгу: все страницы выглядят\n";
echo "практически одинаково, различаются разве\n";
echo "что буквы, с которых начинаются имена на\n";
echo "конкретной странице. Аналогичный подход\n";
echo "можно применить и к адресной книге на базе\n";
echo "Web. Форматирование в данном случае играет\n";
echo "еще более важную роль, поскольку не\n";
echo "исключено, что данные придется\n";
echo "экспортировать в другое приложение в каком-нибудь\n";
echo "специфическом формате. Подобные приложения\n";
echo "прекрасно работают на базе шаблонов,\n";
echo "поскольку дизайнеру остается лишь создать\n";
echo "единый формат страницы, который будет\n";
echo "использоваться для всех 26 букв алфавита.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Прежде всего,\n";
echo "необходимо решить, какие данные и в каком\n";
echo "формате будут храниться в адресной книге.\n";
echo "Конечно, оптимальным носителем информации\n";
echo "в данном случае является база данных,\n";
echo "поскольку это упростит такие полезные\n";
echo "операции, как поиск и сортировка данных. В\n";
echo "своем примере я воспользуюсь СУБД MySQL.\n";
echo "Определение таблицы выглядит следующим\n";
echo "образом:</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">mysql&gt;CREATE table\n";
echo "addressbook (</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">last_name char(35) NOT NULL,</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">first_name char(20) MOT\n";
echo "NULL,</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">tel\n";
echo "char(20) NOT NULL,</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">email char(55) NOT NULL );</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Разумеется,\n";
echo "вы можете самостоятельно добавить поля для\n";
echo "хранения адреса, города и т. д. Для\n";
echo "наглядности я буду использовать\n";
echo "сокращенную таблицу, приведенную ранее.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Теперь я\n";
echo "возьму на себя роль дизайнера и займусь\n";
echo "созданием шаблонов. Для этого проекта нужны\n";
echo "два шаблона. Код первого, «родительского»\n";
echo "шаблона book.html приведен в листинге 12.8.</font></p>\n";
echo "<b><i>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Листинг\n";
echo "12.8. </font></font></i></b><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Основной\n";
echo "шаблон адресной книги book.html</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;html&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;head&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;title&gt;:::::{page_title}:::::&lt;/title&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/head&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;body bgcolor=&quot;white&quot;&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;table cellpadding=2\n";
echo "cellspacing=2 width=600&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;h1&gt;Address Book: {letter}&lt;/h1&gt; &lt;tr&gt;&lt;td&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=a&quot;&gt;A&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=b&quot;&gt;B&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=c&quot;&gt;C&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=d&quot;&gt;D&lt;/a&gt;&nbsp;|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=e&quot;&gt;E&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=f&quot;&gt;F&lt;/a&gt;&nbsp;|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index,php?letter=g&quot;&gt;G&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=h&quot;&gt;H&lt;/a&gt;&nbsp;|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=i&quot;&gt;I&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=j&quot;&gt;J&lt;/a&gt;&nbsp;|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=k&quot;&gt;K&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=l&quot;&gt;L&lt;/a&gt;&nbsp;|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=m&quot;&gt;M&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=n&quot;&gt;N&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=o&quot;&gt;O&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=p&quot;&gt;P&lt;/a&gt;&nbsp;|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=q&quot;&gt;Q&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=r&quot;&gt;R&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=s&quot;&gt;S&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=t&quot;&gt;T&lt;/a&gt;&nbsp;|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=u&quot;&gt;U&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=v&quot;&gt;V&lt;/a&gt;&nbsp;|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=w&quot;&gt;W&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=x&quot;&gt;X&lt;/a&gt;&nbsp;|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=y&quot;&gt;Y&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;index.php?letter=z&quot;&gt;Z&lt;/a&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\"> &lt;/td&gt;&lt;/tr&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">{rows.addresses}</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/table&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/body&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/html&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Как видите,\n";
echo "файл в основном состоит из ссылок с разными\n";
echo "буквами алфавита. Если щелкнуть на букве, в\n";
echo "браузере отображается информация обо всех\n";
echo "контактах в адресной книге, фамилии которых\n";
echo "начинаются с указанной буквы.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">В странице\n";
echo "встречаются три имени переменных,\n";
echo "заключенных в ограничители: page_title, letter и\n";
echo "rows_addresses. Смысл первых двух переменных\n";
echo "очевиден: текст в заголовке страницы и\n";
echo "буква адресной книги, использованная для\n";
echo "выборки текущих адресных данных. Третья\n";
echo "переменная относится к дополнительному\n";
echo "шаблону (листинг 12.9) и определяет файл\n";
echo "конфигурации таблицы, включаемый в\n";
echo "основной шаблон. Файлы конфигурации таблиц\n";
echo "используются в связи с тем, что в сложных\n";
echo "страницах может быть одновременно\n";
echo "задействовано несколько шаблонов, в каждом\n";
echo "из которых данные форматируются в виде\n";
echo "таблиц HTML. Шаблон rows.addresses (листинг 12.9)\n";
echo "выполняет вспомогательные функции и\n";
echo "вставляется в основной шаблон book.html. Вскоре\n";
echo "вы поймете, почему это необходимо.</font></p>\n";
echo "<b><i>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Листинг\n";
echo "12.9.</font></font></i></b><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\"><i>\n";
echo "</i></font><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Вспомогательный\n";
echo "шаблон rows.addresses</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;tr&gt;&lt;td bgcolor=&quot;#c0c0c0&quot;&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;b&gt;{last_name},{first_name}&lt;/b&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/td&gt;&lt;/tr&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;tr&gt;&lt;td&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;b&gt;{telephone}&lt;/b&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/td&gt;&lt;/tr&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;tr&gt;&lt;td&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;b&gt;&lt;a href =\n";
echo "&quot;mailto:{email}&quot;&gt;{email}&lt;/a&gt;&lt;/b&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/td&gt;&lt;/tr&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">В листинге\n";
echo "12.9 встречаются четыре переменных,\n";
echo "заключенных в ограничители: last_name, first_name,\n";
echo "telephone и emal. Смысл этих переменных очевиден (см.\n";
echo "определение таблицы addressbook). Следует\n";
echo "заметить, что этот файл состоит только из\n";
echo "табличных тегов строк (&lt;tr&gt;...&lt;/tr&gt;) и\n";
echo "ячеек (&lt;td&gt;...&lt;/td&gt;). Дело в том, что этот\n";
echo "файл вставляется в шаблон многократно, по\n";
echo "одному разу для каждого адреса,\n";
echo "прочитанного из базы данных. Поскольку имя\n";
echo "переменной rows.addresses в листинге 12.8\n";
echo "включается внутрь тегов &lt;table&gt;...&lt;/table&gt;,\n";
echo "форматирование HTML будет обработано\n";
echo "правильно. Чтобы вы лучше поняли, как\n";
echo "работает этот шаблон, взгляните на рис. 12.1 —\n";
echo "на нем изображена копия страницы адресной\n";
echo "книги. Затем проанализируйте листинг 12.10,\n";
echo "содержащий исходный текст этой страницы. Вы\n";
echo "увидите, что содержимое файла rows.addresses\n";
echo "многократно встречается в странице.</font></p>\n";
echo "<b><i>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Листинг\n";
echo "12.10.</font></font></i></b><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\"><i>\n";
echo "</i></font><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Исходный\n";
echo "текст страницы, изображенной на рис. 12.1</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;html&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;head&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;title&gt;:::::Address\n";
echo "Book:::::&lt;/title&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/head&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;body bgcolor=&quot;white&quot;&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;table cellpadd1ng=2\n";
echo "cellspacing=2 width=600&gt;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;hl&gt;Address Book:\n";
echo "f&lt;/hl&gt;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;tr&gt;&lt;td&gt;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=a&quot;&gt;A&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=b&quot;&gt;B&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=c&quot;&gt;C&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=d&quot;&gt;D&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=e&quot;&gt;E&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=f&quot;&gt;F&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=g&quot;&gt;G&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\"> &lt;a href=&quot;index.php?letter=h&quot;&gt;H&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=i&quot;&gt;I&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\"> &lt;a href=&quot;index.php?letter=j&quot;&gt;J&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=k&quot;&gt;K&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\"> &lt;a href=&quot;index.php?letter=l&quot;&gt;L&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=m&quot;&gt;M&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\"> &lt;a href=&quot;index.php?1etter=n&quot;&gt;N&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=o&quot;&gt;0&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\"> &lt;a href=&quot;index.php?letter=p&quot;&gt;P&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=q&quot;&gt;Q&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\"> &lt;a href=&quot;index.php?letter=r&quot;&gt;R&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=s&quot;&gt;S&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\"> &lt;a href=&quot;index.php?letter=t&quot;&gt;T&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=u&quot;&gt;U&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\"> &lt;a href=&quot;index.php?letter=v&quot;&gt;V&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=w&quot;&gt;W&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\"> &lt;a href=&quot;index.php?letter=x&quot;&gt;X&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\">&lt;a href=&quot;index.php?letter=y&quot;&gt;Y&lt;/a&gt;\n";
echo "|&nbsp;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\"> &lt;a href=&quot;index.php?letter=z&quot;&gt;Z&lt;/a&gt;</font></p>\n";
echo "<p><font size=\"3\" face=\"Courier New\" COLOR=\"#000000\"> &lt;/td&gt;&lt;/tr&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;tr&gt;&lt;t</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">bgcolor=&quot;#c0c0c0&quot;&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;b&gt;Fries.Bobby&lt;/b&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/td&gt;&lt;/tr&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;tr&gt;&lt;td&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;b&gt;(212)\n";
echo "563-5678&lt;/b&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/td&gt;&lt;/tr&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;tr&gt;&lt;td&gt;\n";
echo "&quot;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;b&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;a href=&quot;mailto:bobby@fries.com&quot;&gt;bobby@fries.com&lt;/a&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/b&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/td&gt;&lt;/tr&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;tr&gt;&lt;td\n";
echo "bgcolor=&quot;#c0c0c0&quot;&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;b&gt;Frenchy.Pierre&lt;/b&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/td&gt;&lt;/tr&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;tr&gt;&lt;td&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;b&gt;002-(30)-09-7654321&lt;/b&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/td&gt;&lt;/tr&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;tr&gt;&lt;td&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;b&gt;&lt;a href =\n";
echo "&quot;mailto:frenchy@frenchtv.com&quot;&gt;<br>frenchy@frenchtv.com&lt;/a&gt;&lt;/b&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/td&gt;&lt;/tr&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/table&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/body&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&lt;/html&gt;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Как видно из\n";
echo "приведенного листинга, в адресной книге\n";
echo "хранятся записи двух лиц, фамилии которых\n";
echo "начинаются с буквы F: Bobby Fries и Pierre Frenchy.\n";
echo "Соответственно в таблицу вставляются\n";
echo "данные двух записей.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Дизайнерская\n";
echo "часть проекта адресной книги завершена, и я\n";
echo "перехожу к роли программиста. Возможно, вас\n";
echo "удивит тот факт, что класс tempiate. class (см.\n";
echo "листинг 12.7) практически не изменился, если\n";
echo "не считать появления одного нового метода\n";
echo "— address_sql( ). Код этого метода приведен в\n";
echo "листинге 12.11.</font></p>\n";
echo "<b><i>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Листинг\n";
echo "12.11. </font></font></i></b><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Обработка\n";
echo "данных, полученных в результате запроса</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">class template {</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $files = array( );</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $variab!es = array( ):</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $sql = array();</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $opening_escape -\n";
echo "'{';</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $closing_escape =\n";
echo "'}';</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $host = &quot;localhost&quot;;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $user = &quot;root&quot;;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $pswd = &quot;&quot;;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $db = &quot;book&quot;;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">VAR $address table =\n";
echo "&quot;addressbook&quot;;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">function address_sql($file_id,\n";
echo "$vanable_name, $letter) {</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "Подключиться к серверу MySQL и выбрать базу\n";
echo "данных&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\"> mysql_connect($this-&gt;host, $this-&gt;user, $this-&gt;pswd)</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">or\n";
echo "die(&quot;Couldn't connect to MySQL server!&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">mysql_select_db($this-&gt;db)\n";
echo "or die('Couldn't select MySQL database!&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Обратиться\n";
echo "с запросом к базе данных</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$query = &quot;SELECT\n";
echo "last_name, first_name, tel, email</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">FROM $this-&gt;address_table\n";
echo "WHERE lastjiame LIKE '$letter%' &quot;;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$result = mysql_query($query);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Открыть\n";
echo "файл &quot;rows.addresses&quot;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// и\n";
echo "прочитать его содержимое в переменную</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$fh - fopen(&quot;$variable_name&quot;,\n";
echo "&quot;r&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$file_contents = fread($fh,\n";
echo "filesize(&quot;rows.addresses&quot;) ):</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Заменить\n";
echo "имена переменных в ограничителях</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// данными из\n";
echo "базы.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">while ($row =\n";
echo "mysql_fetch_array($result)) :</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$new_row = $file_contents;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$new_row=str_replace($this-&gt;opening_escape.<br>&quot;last_name&quot;.$this-&gt;closing_escape.&nbsp;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$row[&quot;last_name&quot;].\n";
echo "$new_row);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$new_row=</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">str_replace($th1s-&gt;opening_escape.<br>&quot;first_name&quot;.$this-&gt;closing_escape.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$row[&quot;first_name&quot;], $new_row);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$new_row=str_replace($this-&gt;opening_escape.<br>&quot;telephone&quot;.$this-&gt;closing_escape.</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&nbsp;$row[&quot;tel&quot;],\n";
echo "$new_row);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$new_row = str_replace($this-&gt;opening_escape.<br>&quot;email&quot;.$this-&gt;closing_escape,</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">&nbsp;$row[&quot;email&quot;],</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$new_row);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">//\n";
echo "Присоединить запись к итоговой строке\n";
echo "замены</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$complete_table .= $new_row;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">endwhile;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$sql_array_key = $variable_name;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$this-&gt;sql[$sql_array_key] = $complete_table;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Включить\n";
echo "ключ в массив variables для последующего поиска</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$this-&gt;variables[$file_id][ ] = $variable_name;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// Закрыть\n";
echo "файловый манипулятор fclose(lfh);</font></p>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Комментариев,\n";
echo "приведенных в листинге 12.11, вполне\n";
echo "достаточно для того, чтобы вы разобрались в\n";
echo "происходящем, однако я должен сделать\n";
echo "несколько важных замечаний. Во-первых,\n";
echo "обратите внимание на то, что файл rows.addresses\n";
echo "открывается </font><i><font COLOR=\"#000000\">только один\n";
echo "раз. </font></i><font COLOR=\"#000000\">Возможен и другой\n";
echo "вариант — многократно открывать и\n";
echo "закрывать файл rows.addresses, каждый раз\n";
echo "производя замену и присоединяя его\n";
echo "содержимое к переменной $complete_table. Впрочем,\n";
echo "такое решение будет крайне неэффективным.\n";
echo "Потратьте немного времени и разберитесь в\n";
echo "том, как новые данные таблицы в цикле\n";
echo "присоединяются к переменной $complete_table.</font></font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Второе, на\n";
echo "что следует обратить внимание при\n";
echo "просмотре листинга 12.11, — появление пяти\n";
echo "новых атрибутов класса: $host, $user, $pswd, $db и\n";
echo "$address_table. В этих атрибутах хранится\n";
echo "информация, необходимая для сервера SQL.\n";
echo "Полагаю, смысл каждого атрибута понятен без\n";
echo "объяснений, а если нет — вернитесь и\n";
echo "повторите материал главы 11.</font></p>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\">&nbsp;<img border=\"0\" src=\"12.1.jpg\" width=\"475\" height=\"204\"></font></p>\n";
echo "<b><i>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Рис. 12.1. </font></font></i></b><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Страница\n";
echo "адресной книги</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Все, что\n";
echo "осталось сделать — написать файл index.php,\n";
echo "инициирующий обработку шаблонов, Код этого\n";
echo "файла приведен в листинге 12.12. Если щелкнуть\n";
echo "на одной из ссылок (index.php?letter=буква) на\n";
echo "странице book.html (см. листинг 12.8), загружается\n";
echo "страница index.php, которая, в свою очередь,\n";
echo "заново строит book.html с включением новой\n";
echo "информации.</font></p>\n";
echo "<b><i>\n";
echo "<p><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Листинг\n";
echo "12.12.</font></font></i></b><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\"><i>\n";
echo "</i></font><i><font size=\"3\" face=\"Times New Roman\"><font COLOR=\"#000000\">Обработчик\n";
echo "шаблонов index.php</font></font></p>\n";
echo "</i>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">include(&quot;Listing12-11.php&quot;);\n";
echo "$page_title = &quot;Address Book&quot;;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// По\n";
echo "умолчанию загружается страница с фамилиями,</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">// начинающимися с буквы 'а' if (! isset($letter) ) :</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$letter = &quot;а&quot;;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">endif ;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$tpl = new template;</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$tpl-&gt;register_file(&quot;book&quot;,\n";
echo "&quot;book.html&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$tpl-&gt;register_variables(&quot;book&quot;, &quot;page_title.letter&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$tpl -&gt;address_sql(&quot;book&quot;, &quot;rows.addresses&quot;, &quot;$letter&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$tpl -&gt;file_parser(&quot;book&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Courier New\">$tpl-&gt;phnt_fil(&quot;book&quot;);</font></p>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">Перед вами\n";
echo "практический пример, показывающий, как при\n";
echo "помощи шаблонов организовать эффективное\n";
echo "разделение труда между программистом и\n";
echo "дизайнером. Подумайте, как бы вы\n";
echo "использовали шаблоны для организации своих\n";
echo "разработок. Готов поспорить, что вы найдете\n";
echo "им полезное применение.</font></p>\n";
echo "<b>\n";
echo "<p><A NAME=\"n\"></A>\n";
echo "<font color=\"#000000\" face=\"Times New Roman\" size=\"4\">Итоги</font></p>\n";
echo "</b>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">В этой главе\n";
echo "была представлена концепция, особенно\n";
echo "важная как для РНР, так и для web-программирования\n";
echo "в целом, — применение шаблонов. Глава\n";
echo "началась с обзора двух схем; упоминавшихся\n";
echo "ранее, — простой замены переменных\n";
echo "средствами РНР и логическим делением\n";
echo "страницы при помощи включаемых файлов.\n";
echo "Затем мы познакомились с третьей схемой\n";
echo "применения шаблонов, позволяющей полностью\n";
echo "отделить программирование от дизайна\n";
echo "страницы. Оставшаяся часть главы была\n";
echo "посвящена анализу класса, построенного для\n";
echo "реализации шаблонов такого рода. Главу\n";
echo "завершает пример практического\n";
echo "использования шаблонов в адресной книге на\n";
echo "базе Web. В частности, в этой главе\n";
echo "рассматривались следующие темы:</font></p>\n";
echo "<ul>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">для чего\n";
echo "    нужны шаблоны;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">простой\n";
echo "    шаблон № 1: внедрение РНР в HTML;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">простой\n";
echo "    шаблон № 2: разделение компонентов\n";
echo "    страницы при помощи включаемых файлов;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">нетривиальное\n";
echo "    использование шаблонов для полного\n";
echo "    разделения программирования и дизайна;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">класс для\n";
echo "    работы с шаблонами;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">регистрация\n";
echo "    файлов;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">регистрация\n";
echo "    переменных;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">подстановка\n";
echo "    значений переменных в файл;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">вывод\n";
echo "    файла в браузере;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">недостатки\n";
echo "    шаблонов;</font></li>\n";
echo "  <li><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">адресная\n";
echo "    книга, расширяющая стандартный класс\n";
echo "    шаблона за счет применения запросов SQL.</font></li>\n";
echo "</ul>\n";
echo "<p><font COLOR=\"#000000\" size=\"3\" face=\"Times New Roman\">В следующей\n";
echo "главе мы продолжим знакомство с\n";
echo "разработкой динамических web-приложений. Вы\n";
echo "узнаете, как при помощи cookie и отслеживания\n";
echo "сеансовых данных наделить ваш web-сайт\n";
echo "новыми интерактивными возможностями.</font></p>\n";
echo "<table width=\"300\" border=\"0\" align=\"center\" cellpadding=\"3\" cellspacing=\"1\" bgcolor=\"#000066\" class=\"mtx1\">\n";
echo "<tr>\n";
echo "<td bgcolor=\"#CAEEFF\"><center>&nbsp;<a href=\"../Chapter 11/1.htm\"><strong>&lt;&lt;&lt;&nbsp;Назад</strong></a>&nbsp;\n";
echo "</center></td>\n";
echo "<td bgcolor=\"#CAEEFF\"><center>&nbsp;<a href=\"../index.html\"><strong>Содержание</strong></a>&nbsp;\n";
echo "</center></td>\n";
echo "<td bgcolor=\"#CAEEFF\"><center>&nbsp;<a href=\"../Chapter 13/1.htm\"><strong>Вперед&nbsp;&gt;&gt;&gt;</strong></a>&nbsp;\n";
echo "</center></td>\n";
echo "</tr>\n";
echo "</table>\n";
echo "</BODY></HTML>\n";
?>
