Привет, Гость!
Учебник PHP #12
|
<a href="index.html.php?letter=o">0</a> |
<a href="index.html.php?letter=p">P</a> |
<a href="index.html.php?letter=q">Q</a> |
<a href="index.html.php?letter=r">R</a> |
<a href="index.html.php?letter=s">S</a> |
<a href="index.html.php?letter=t">T</a> |
<a href="index.html.php?letter=u">U</a> |
<a href="index.html.php?letter=v">V</a> |
<a href="index.html.php?letter=w">W</a> |
<a href="index.html.php?letter=x">X</a> |
<a href="index.html.php?letter=y">Y</a> |
<a href="index.html.php?letter=z">Z</a>
</td></tr>
<tr><t
bgcolor="#c0c0c0">
<b>Fries.Bobby</b>
</td></tr>
<tr><td>
<b>(212) 563-5678</b>
</td></tr>
<tr><td> "
<b>
<a href="mailto.html:bobby@fries.com">bobby@fries.com</a>
</b>
</td></tr>
<tr><td bgcolor="#c0c0c0">
<b>Frenchy.Pierre</b>
</td></tr>
<tr><td>
<b>002-(30)-09-7654321</b>
</td></tr>
<tr><td>
<b><a href = "mailto:frenchy@frenchtv.com">
frenchy@frenchtv.com</a></b>
</td></tr>
</table>
</body>
</html>
Как видно из приведенного листинга, в адресной книге хранятся записи двух лиц, фамилии которых начинаются с буквы F: Bobby Fries и Pierre Frenchy. Соответственно в таблицу вставляются данные двух записей.
Дизайнерская часть проекта адресной книги завершена, и я перехожу к роли программиста. Возможно, вас удивит тот факт, что класс tempiate. class (см. листинг 12.7) практически не изменился, если не считать появления одного нового метода — address_sql( ). Код этого метода приведен в листинге 12.11.
Листинг 12.11. Обработка данных, полученных в результате запроса
class template {
VAR $files = array( );
VAR $variab!es = array( ):
VAR $sql = array();
VAR $opening_escape - '{';
VAR $closing_escape = '}';
VAR $host = "localhost";
VAR $user = "root";
VAR $pswd = "";
VAR $db = "book";
VAR $address table = "addressbook";
function address_sql($file_id, $vanable_name, $letter) {
// Подключиться к серверу MySQL и выбрать базу данных
mysql_connect($this->host, $this->user, $this->pswd)
or die("Couldn't connect to MySQL server!");
mysql_select_db($this->db) or die('Couldn't select MySQL database!");
// Обратиться с запросом к базе данных
$query = "SELECT last_name, first_name, tel, email
FROM $this->address_table WHERE lastjiame LIKE '$letter%' ";
$result = mysql_query($query);
// Открыть файл "rows.addresses"
// и прочитать его содержимое в переменную
$fh - fopen("$variable_name", "r");
$file_contents = fread($fh, filesize("rows.addresses") ):
// Заменить имена переменных в ограничителях
// данными из базы.
while ($row = mysql_fetch_array($result)) :
$new_row = $file_contents;
$new_row=str_replace($this->opening_escape.
"last_name".$this->closing_escape.
$row["last_name"]. $new_row);
$new_row=
str_replace($th1s->opening_escape.
"first_name".$this->closing_escape.
$row["first_name"], $new_row);
$new_row=str_replace($this->opening_escape.
"telephone".$this->closing_escape.
$row["tel"], $new_row);
$new_row = str_replace($this->opening_escape.
"email".$this->closing_escape,
$row["email"],
$new_row);
// Присоединить запись к итоговой строке замены
$complete_table .= $new_row;
endwhile;
$sql_array_key = $variable_name;
$this->sql[$sql_array_key] = $complete_table;
// Включить ключ в массив variables для последующего поиска
$this->variables[$file_id][ ] = $variable_name;
// Закрыть файловый манипулятор fclose(lfh);
Комментариев, приведенных в листинге 12.11, вполне достаточно для того, чтобы вы разобрались в происходящем, однако я должен сделать несколько важных замечаний. Во-первых, обратите внимание на то, что файл rows.addresses открывается только один раз. Возможен и другой вариант — многократно открывать и закрывать файл rows.addresses, каждый раз производя замену и присоединяя его содержимое к переменной $complete_table. Впрочем, такое решение будет крайне неэффективным. Потратьте немного времени и разберитесь в том, как новые данные таблицы в цикле присоединяются к переменной $complete_table.
Второе, на что следует обратить внимание при просмотре листинга 12.11, — появление пяти новых атрибутов класса: $host, $user, $pswd, $db и $address_table. В этих атрибутах хранится информация, необходимая для сервера SQL. Полагаю, смысл каждого атрибута понятен без объяснений, а если нет — вернитесь и повторите материал главы 11.
Рис. 12.1. Страница адресной книги
Все, что осталось сделать — написать файл index.php, инициирующий обработку шаблонов, Код этого файла приведен в листинге 12.12. Если щелкнуть на одной из ссылок (index.php?letter=буква) на странице book.html (см. листинг 12.8), загружается страница index.php, которая, в свою очередь, заново строит book.html с включением новой информации.
Листинг 12.12. Обработчик шаблонов index.php
include("Listing12-11.php"); $page_title = "Address Book";
// По умолчанию загружается страница с фамилиями,
// начинающимися с буквы 'а' if (! isset($letter) ) :
$letter = "а";
endif ;
$tpl = new template;
$tpl->register_file("book", "book.html");
$tpl->register_variables("book", "page_title.letter");
$tpl ->address_sql("book", "rows.addresses", "$letter");
$tpl ->file_parser("book");
$tpl->phnt_fil("book");
Перед вами практический пример, показывающий, как при помощи шаблонов организовать эффективное разделение труда между программистом и дизайнером. Подумайте, как бы вы использовали шаблоны для организации своих разработок. Готов поспорить, что вы найдете им полезное применение.
Итоги
В этой главе была представлена концепция, особенно важная как для РНР, так и для web-программирования в целом, — применение шаблонов. Глава началась с обзора двух схем; упоминавшихся ранее, — простой замены переменных средствами РНР и логическим делением страницы при помощи включаемых файлов. Затем мы познакомились с третьей схемой применения шаблонов, позволяющей полностью отделить программирование от дизайна страницы. Оставшаяся часть главы была посвящена анализу класса, построенного для реализации шаблонов такого рода. Главу завершает пример практического использования шаблонов в адресной книге на базе Web. В частности, в этой главе рассматривались следующие темы:
для чего нужны шаблоны;
простой шаблон № 1: внедрение РНР в HTML;
простой шаблон № 2: разделение компонентов страницы при помощи включаемых файлов;
нетривиальное использование шаблонов для полного разделения программирования и дизайна;
класс для работы с шаблонами;
регистрация файлов;
регистрация переменных;
подстановка значений переменных в файл;
вывод файла в браузере;
недостатки шаблонов;
адресная книга, расширяющая стандартный класс шаблона за счет применения запросов SQL.
В следующей главе мы продолжим знакомство с разработкой динамических web-приложений. Вы узнаете, как при помощи cookie и отслеживания
<a href="index.html.php?letter=o">0</a> |
<a href="index.html.php?letter=p">P</a> |
<a href="index.html.php?letter=q">Q</a> |
<a href="index.html.php?letter=r">R</a> |
<a href="index.html.php?letter=s">S</a> |
<a href="index.html.php?letter=t">T</a> |
<a href="index.html.php?letter=u">U</a> |
<a href="index.html.php?letter=v">V</a> |
<a href="index.html.php?letter=w">W</a> |
<a href="index.html.php?letter=x">X</a> |
<a href="index.html.php?letter=y">Y</a> |
<a href="index.html.php?letter=z">Z</a>
</td></tr>
<tr><t
bgcolor="#c0c0c0">
<b>Fries.Bobby</b>
</td></tr>
<tr><td>
<b>(212) 563-5678</b>
</td></tr>
<tr><td> "
<b>
<a href="mailto.html:bobby@fries.com">bobby@fries.com</a>
</b>
</td></tr>
<tr><td bgcolor="#c0c0c0">
<b>Frenchy.Pierre</b>
</td></tr>
<tr><td>
<b>002-(30)-09-7654321</b>
</td></tr>
<tr><td>
<b><a href = "mailto:frenchy@frenchtv.com">
frenchy@frenchtv.com</a></b>
</td></tr>
</table>
</body>
</html>
Как видно из приведенного листинга, в адресной книге хранятся записи двух лиц, фамилии которых начинаются с буквы F: Bobby Fries и Pierre Frenchy. Соответственно в таблицу вставляются данные двух записей.
Дизайнерская часть проекта адресной книги завершена, и я перехожу к роли программиста. Возможно, вас удивит тот факт, что класс tempiate. class (см. листинг 12.7) практически не изменился, если не считать появления одного нового метода — address_sql( ). Код этого метода приведен в листинге 12.11.
Листинг 12.11. Обработка данных, полученных в результате запроса
class template {
VAR $files = array( );
VAR $variab!es = array( ):
VAR $sql = array();
VAR $opening_escape - '{';
VAR $closing_escape = '}';
VAR $host = "localhost";
VAR $user = "root";
VAR $pswd = "";
VAR $db = "book";
VAR $address table = "addressbook";
function address_sql($file_id, $vanable_name, $letter) {
// Подключиться к серверу MySQL и выбрать базу данных
mysql_connect($this->host, $this->user, $this->pswd)
or die("Couldn't connect to MySQL server!");
mysql_select_db($this->db) or die('Couldn't select MySQL database!");
// Обратиться с запросом к базе данных
$query = "SELECT last_name, first_name, tel, email
FROM $this->address_table WHERE lastjiame LIKE '$letter%' ";
$result = mysql_query($query);
// Открыть файл "rows.addresses"
// и прочитать его содержимое в переменную
$fh - fopen("$variable_name", "r");
$file_contents = fread($fh, filesize("rows.addresses") ):
// Заменить имена переменных в ограничителях
// данными из базы.
while ($row = mysql_fetch_array($result)) :
$new_row = $file_contents;
$new_row=str_replace($this->opening_escape.
"last_name".$this->closing_escape.
$row["last_name"]. $new_row);
$new_row=
str_replace($th1s->opening_escape.
"first_name".$this->closing_escape.
$row["first_name"], $new_row);
$new_row=str_replace($this->opening_escape.
"telephone".$this->closing_escape.
$row["tel"], $new_row);
$new_row = str_replace($this->opening_escape.
"email".$this->closing_escape,
$row["email"],
$new_row);
// Присоединить запись к итоговой строке замены
$complete_table .= $new_row;
endwhile;
$sql_array_key = $variable_name;
$this->sql[$sql_array_key] = $complete_table;
// Включить ключ в массив variables для последующего поиска
$this->variables[$file_id][ ] = $variable_name;
// Закрыть файловый манипулятор fclose(lfh);
Комментариев, приведенных в листинге 12.11, вполне достаточно для того, чтобы вы разобрались в происходящем, однако я должен сделать несколько важных замечаний. Во-первых, обратите внимание на то, что файл rows.addresses открывается только один раз. Возможен и другой вариант — многократно открывать и закрывать файл rows.addresses, каждый раз производя замену и присоединяя его содержимое к переменной $complete_table. Впрочем, такое решение будет крайне неэффективным. Потратьте немного времени и разберитесь в том, как новые данные таблицы в цикле присоединяются к переменной $complete_table.
Второе, на что следует обратить внимание при просмотре листинга 12.11, — появление пяти новых атрибутов класса: $host, $user, $pswd, $db и $address_table. В этих атрибутах хранится информация, необходимая для сервера SQL. Полагаю, смысл каждого атрибута понятен без объяснений, а если нет — вернитесь и повторите материал главы 11.
Рис. 12.1. Страница адресной книги
Все, что осталось сделать — написать файл index.php, инициирующий обработку шаблонов, Код этого файла приведен в листинге 12.12. Если щелкнуть на одной из ссылок (index.php?letter=буква) на странице book.html (см. листинг 12.8), загружается страница index.php, которая, в свою очередь, заново строит book.html с включением новой информации.
Листинг 12.12. Обработчик шаблонов index.php
include("Listing12-11.php"); $page_title = "Address Book";
// По умолчанию загружается страница с фамилиями,
// начинающимися с буквы 'а' if (! isset($letter) ) :
$letter = "а";
endif ;
$tpl = new template;
$tpl->register_file("book", "book.html");
$tpl->register_variables("book", "page_title.letter");
$tpl ->address_sql("book", "rows.addresses", "$letter");
$tpl ->file_parser("book");
$tpl->phnt_fil("book");
Перед вами практический пример, показывающий, как при помощи шаблонов организовать эффективное разделение труда между программистом и дизайнером. Подумайте, как бы вы использовали шаблоны для организации своих разработок. Готов поспорить, что вы найдете им полезное применение.
Итоги
В этой главе была представлена концепция, особенно важная как для РНР, так и для web-программирования в целом, — применение шаблонов. Глава началась с обзора двух схем; упоминавшихся ранее, — простой замены переменных средствами РНР и логическим делением страницы при помощи включаемых файлов. Затем мы познакомились с третьей схемой применения шаблонов, позволяющей полностью отделить программирование от дизайна страницы. Оставшаяся часть главы была посвящена анализу класса, построенного для реализации шаблонов такого рода. Главу завершает пример практического использования шаблонов в адресной книге на базе Web. В частности, в этой главе рассматривались следующие темы:
для чего нужны шаблоны;
простой шаблон № 1: внедрение РНР в HTML;
простой шаблон № 2: разделение компонентов страницы при помощи включаемых файлов;
нетривиальное использование шаблонов для полного разделения программирования и дизайна;
класс для работы с шаблонами;
регистрация файлов;
регистрация переменных;
подстановка значений переменных в файл;
вывод файла в браузере;
недостатки шаблонов;
адресная книга, расширяющая стандартный класс шаблона за счет применения запросов SQL.
В следующей главе мы продолжим знакомство с разработкой динамических web-приложений. Вы узнаете, как при помощи cookie и отслеживания
Комментарии (0)
Скачать Java книгу»php/mysql/pdo/js
В библиотеку