Атомная энергетика. Ядерные реакторы АЭС. Атомный флот. Ядерное оружие

РБМК-1000
Гражданский суда
Авиация

Высшая математика

Задачи
Практикум
Карта сайта

Файловые компоненты (шаблоны)

Мы подошли к одной из моих любимых возможностей РНР. Шаблоном (применительно к web-программированию) называется часть web-документа, которую вы собираетесь использовать в нескольких страницах. Шаблоны, как и функции РНР, избавляют вас от лишнего копирования/вставки фрагментов содержания страницы и программного кода. С увеличением масштабов сайта значение шаблонов возрастает, поскольку они позволяют легко и быстро проводить модификации на уровне целого сайта. В этом разделе будут описаны некоторые возможности, которые открываются при использовании простейших шаблонов.

Как правило, общие фрагменты содержания/кода (то есть шаблоны) сохраняются в отдельных файлах. При построении web-документа вы просто <включаете> эти файлы в соответствующие места страницы. В РНР для этого существуют две функции: include( ) и require( ).

include( ) и require( )

Одним из самых выдающихся аспектов РНР является возможность построения шаблонов и программных библиотек и их последующей вставки в новые сценарии. Применение библиотек экономит время и усилия по использованию общих функциональных возможностей на разных web-сайтах. Читатели, обладающие

опытом программирования на других языках (например, С, C++ или Java), хорошо знакомы с концепцией библиотек функций и их использованием в программах для расширения функциональных возможностей.

Включение одного или нескольких файлов в сценарий осуществляется стандартными функциями РНР require( ) и include( ). Как будет показано в следующем разделе, каждая из этих функций применяется в определенной ситуации.

Функции

В РНР существуют четыре функции для включения файлов в сценарии РНР:

include( );
include_once( );
require( );
require_once( ).
Несмотря на сходство имен, эти функции решают разные задачи.

include( )

Функция include( ) включает содержимое файла в сценарий. Синтаксис функции include( ):

include (file файл]

У функции include( ) есть одна интересная особенность - ее можно выполнять условно. Например, если вызов функции включен в блок команды if. то файл включается в программу лишь в том случае, если условие i f истинно. Если функция includeO используется в условной команде, то она должна быть заключена в фигурные скобки или в альтернативные ограничители. Сравните различия в синтаксисе листингов 9.1 и 9.2.

Листинг 9.1. Неправильное использование include( )

if (some_conditional)

include ('text91a.txt'); else

include ('text91b.txt');

Листинг 9.2. Правильное использование include( )

if (some_conditional) :

include ('text91a.txt');

else :

include ('text91b.txt');

endif;

Весь код РНР во включаемом файле обязательно заключается в теги РНР. Не стоит полагать, что простое сохранение команды РНР в файле обеспечит ее правильную обработку:

print "this is an invalid include file";

Вместо этого необходимо заключить команду в соответствующие теги, как показывает следующий пример:

<?

print "this is an invalid include file";

?>

include_once( )

Функция include_once( ) делает то же, что и include( ), за одним исключением: прежде чем включать файл в программу, она проверяет, не был ли он включен ранее. Если файл уже был включен, вызов include_once( ) игнорируется, а если нет - происходит стандартное включение файла. Во всем остальном include_once( ) ничем не отличается от include( ). Синтаксис функции include_once( ):

include_once (file файл)

require ( )

В целом функция require( ) похожа на include( ) - она тоже включает шаблон в тот файл, в котором находится вызов require( ). Синтаксис функции require( ):

require (file файл)

Тем не менее, между функциями require( ) и include( ) существует одно важное различие. Файл, определяемый параметром require( ), включается в сценарий независимо от местонахождения require( ) в сценарии. Например, при вызове requi ге( ) в блоке if при ложном условии файл все равно будет включен в сценарий!

Во многих ситуациях бывает удобно создать файл с переменными и другой информацией, которая используется в масштабах сайта, и затем подключать его по мере необходимости. Хотя имя этого файла выбирается произвольно, я обычно называю его init.tpl (сокращение от ). В листинге 9.3 показано, как выглядит очень простой файл init.tpl. В листинге 9.4 содержимое init.tpl включается в сценарий командой require( ).

Листинг 9.3. Пример инициализационного файла <?

<?

$site_title = "РНР Recipes";

$contact_email = "wjgilmore@hotmail.com";

$contact_name = "WJ Gilmore";

?>

Листинг 9.4. Использование файла init.tpl

<? require ('init.tpl ');?>

<html>

<head>

<title><? print $site_title; ?></title>

</head>

<body>

<? print "Welcome to $site_title. For questions, contact <a href =

\"mai1 to:$contact_email\">$contact_name</a>."; ?>

</body>

</html>

Передача URL при вызове require( ) допускается лишь при включенном режиме (этот режим включен по умолчанию).

С увеличением размеров сайта может оказаться, что некоторые файлы включаются в сценарий по несколько раз. Иногда это не вызывает проблем, но в некоторых случаях повторное включение файла приводит к сбросу значений изменившихся переменных. Если во включаемом файле определяются функции, могут возникнуть конфликты имен. Учитывая сказанное, мы приходим к следующей функции - require_once( ).

require_once( )

Функция require_once( ) гарантирует, что файл будет включаться в сценарий всего один раз. После вызова requi rе_оnсе( ) все дальнейшие попытки включения того же файла игнорируются. Синтаксис функции requiге_оnсе( ):

require_once(file файл)

Если не считать дополнительной проверки, в остальном эта функция аналогична

require( ).

Вероятно, вы станете чаще использовать функции включения файлов по мере того, как ваши web-приложения начнут увеличиваться в размерах. Эти функции часто встречаются в примерах данной книги, чтобы сократить избыточность программного кода. Первые примеры рассматриваются в следующем разделе, посвященном принципам построения базовых шаблонов.

Построение компонентов

При определении структуры типичной web-страницы я обычно разбиваю ее на три части: заголовок, основную часть и колонтитул. Как правило, в большинстве правильно организованных web-сайтов присутствует заголовок, который практически не изменяется; в основной части выводится запрашиваемое содержание сайта, поэтому она часто изменяется; наконец, колонтитул содержит информацию об авторских правах и навигационные ссылки. Колонтитул, как и заголовок, обычно остается неизменным. Не поймите меня превратно - я вовсе не пытаюсь подавлять ваши творческие устремления. Мне встречалось немало великолепных сайтов, не следовавших этим принципам. Я всего лишь пытаюсь выработать общую структуру, которая может послужить отправной точкой для дальнейшей работы.

Заголовок

Заголовочный файл (вроде приведенного в листинге 9.5) присутствует практически в каждом из моих web-сайтов с поддержкой РНР. В этом файле содержится

информация, действующая на уровне всего сайта, - например, заголовок, контактные данные и некоторые компоненты кода HTML-страницы.

Листинг 9.5. Пример файла заголовка

<?

// Файл: header.tpl

// Назначение: заголовочный файл для сайта PhpRecipes .

// Дата: 22 августа 2000 г.

$site_name = "PHPRecipes";

$site_email= "wjgnmore@hotrnail.com";

$site_path = "http://localhost/phprecipes";

?>

<html>

<head>

<title> <? print $site_name; ?> </title>

</head>

<body bgcolor="#7b8079" text="#ffffff" link="fe7d387" alink="#e7d387" vlink="#e7f0e4">

<table width="95%" cellpadding="0" cellspacing="0" border="1">

<tr>

<td valign = "top">

PHPRecipes

</td>

<td valign = "top" align="right">

<?

// Вывести текущую дату и время

print date ("F d, h:i a");

?>

</td>

</tr>

</table>

Довольно часто доступ к включаемым файлам со стороны посетителей ограничивается, особенно если эти файлы содержат конфиденциальную информацию (например, пароли). В Apache можно запретить просмотр некоторых файлов редактированием файлов http.conf или htaccess. Следующий пример показывает, как запретить просмотр всех файлов с расширением .tpl:

<Files "*.tpl">

Order allow,deny

Allow from 127.0.0.1

Deny from all

</Files>

РНР и проблемы безопасности сайтов подробно описаны в главе 16.

Колонтитул

Колонтитулом (footer) обычно называется информация, расположенная в нижней части страниц сайта, - контактные данные, ссылки и информация об авторских правах. Эту информацию можно разместить в отдельном файле и включать в качестве шаблона так же, как это делается с заголовком. Допустим, c наступлением нового года вам потребовалось изменить информацию об авторских правах и привести ее к виду . Есть два пути: потратить канун Рождества на лихорадочное редактирование сотен статических страниц или воспользоваться шаблоном наподобие приведенного в листинге 9.6. Одно простое изменение - и вы можете возвращаться к праздничным хлопотам.

Листинг 9.6. Пример файла колонтитула (footer.tpl)

<table width="95%" cellspacing="0" cellpadding="0" border="1">

<tr><td valign="top" align="middle">

Copyright &copy; 2000 PHPRecipes. All rights reserved.<br>

<a href = "mailto:<?=$site_email;?>">contact</a> |

<a href = "<?=$site_path:?>/

privacy.php">your privacy</a>

</td></tr>

</table>

</body>

</html>

Обратите внимание на использование глобальной переменной $site_email в файле колонтитула. Значение этой переменной действует в масштабах всей страницы, а мы предполагаем, что файлы header.tpl и footer.tpl будут включены в одну итоговую страницу. Также обратите внимание на присутствие пути $site_path в ссылке Privacy (Конфиденциальность). Я всегда включаю в шаблоны полные пути ко всем ссылкам - если бы URL ссылки состоял из одного имени privacy.php, то файл колонтитула был бы жестко привязан к конкретному каталогу.

Основная часть

В основной части страницы подключается содержимое заголовка и колонтитула. В сущности, именно основная часть содержит информацию, интересующую посетителей сайта. Заголовок эффектно выглядит, колонтитул содержит полезные сведения, но именно ради основной части страницы пользователи снова и снова возвращаются на сайт. Хотя я не смогу предоставить каких-либо рекомендаций по поводу конкретной структуры страниц, шаблоны, подобные приведенному в листинге 9.7, основательно упрощают администрирование страниц.

Листинг 9.7. Пример основной части страницы (index_body.tpl)

<table width="95%" cellspacing="0" cellpadding="0" border="1">

<tr>

<td valign="top" width="25%>

<a href = "<?=$site_path;?>/tutorials.php">tutorials</a>

<br>

<a href = "<?=$site_path:?>/articles.php">articles</a>

<br>

<a href = "<?=$site_path;?>/scripts.php">scripts</a>

<br>

<a href = "<?=$site_path;?>/contact.php">contact</a>

<br>

</td>

<td valign="top" width="75%">

Welcome to PHPRecipes. the starting place for PHP scripts, tutorials,

and information about gourmet cooking!

</td>

</tr>

</table>

Все вместе: заголовок, колонтитул и основная часть

Вероятно, мое настроение лучше всего выражается фразой полковника <Ганнибала> Смита (Джордж Пеппард) из знаменитого сериала <Команда А>: <Люблю, когда все становится на свои места>. Я испытываю нечто подобное, когда разрозненные шаблоны объединяются и образуют полный web-документ. Комбинируя три секции документа: header.tpl, index_body.tpl и footer.tpl, - можно быстро построить простейшую страницу вроде той, что приведена в листинге 9.8.

Листинг 9.8. Построение страницы index.php включением нескольких файлов

<?

// Файл: index.php

// Назначение: домашняя страница PHPRecipes

// Дата: 23 августа 2000 г.

// Вывести заголовок

include ("header.tpl");

// Вывести основную часть

include ("index_body.tpl");

// Вывести колонтитул

include ("footer.tpl");

?>

Ну как? Три простые команды - и перед вами готовая страница. Текст итоговой страницы приведен в листинге 9.9.

Листинг 9.9. Страница HTML, построенная в листинге 9.8 (index.php)

<html>

<head>

<title> PHPRecipes </title>

</head>

<body bgcolor="#7b8079" text="#ffffff" link="#e7d387" alink="#e7d387" vlink="#e7f0e4">

<table width = "95%" cellpadding="0" cellspacing="0" border="1">

<tr>

<td valign = "top">

PHP Recipes

</td>

<td valign = "top" align="right">

August 23, 03:17 pm

</td>

</tr>

</table><table width="95%" cellspacing="0" cellpadd1ng="0" border="1">

<tr>

<td valign="top" width="25%">

<a href = "htfp://localriost/phprecipes/tutorials.php">tutorials

</a> <br>

<a href = "http://localhost/phprecipes/articles.php">articles

</a> <br>

<a href = "http://localhost/phprecipes/scripts.php">scripts</a>

<br>

<a href = "http://localhost/phprecipes/contact.php">contact</a>

<br>

</td>

<td valign="top" width="75%">

Welcome to PHPRecipes, the starting place for PHP scripts, tutorials,

and gourmet cooking tips and recipes!

</td>

</tr>

</table><table width="95%" cellspacing="0" cellpadding="0" border="1">

<tr><td valign="top" align="middle">

Copyright &copy; 2000 PHPRecipes. All rights reserved.<br>

<a href = "mailto:wj@hotmail .com">contact</a> |

<a href = "http://localhost/phprecipes/privacy.php">your privacy</a>

</td></tr>

</table>

</body>

</html>

На рис. 9.1 показано, как полученная страница выглядит в браузере. Хотя я обычно не пользуюсь рамками таблиц, на этот раз я их вывел, чтобы на рисунке более наглядно выделялись три части страницы.

Рис. 9.1. Внешний вид страницы, построенной в листинге 9.8

Оптимизация шаблонов

Во втором (на мой взгляд, более предпочтительном) варианте шаблоны оформляются в виде функций, находящихся в отдельном файле. Тем самым обеспечивается дополнительное структурирование ваших шаблонов. Я называю этот файл инициализационным файлом и храню в нем другую полезную информацию. Поскольку мы уже рассмотрели относительно длинные примеры заголовка и колонтитула, содержимое листингов 9.10 и 9.11 было слегка сокращено для наглядной демонстрации новой идеи.

Листинг 9.10. Оптимизированный шаблон сайта (site_init.tpl)

<?

// Файл: site_init.tpl

// Назначение: инициализационный файл PhpRecipes

// Дата: 22 августа 2000 г.

$site_name = "PHPRecipes";

$site_email = "wjgilmore@hotmail.com";

$site_path = "http://localhost/phprecipes/";

function show_header($site_name) {

<html>

<head>

<title> <? print $site_name: ?> </title>

</tiead>

<body bgcolor="#7b8079" text="#ffffff" link>"#e7d387" alink="#e7d387" vlink="#e7f0e4">

This is the header

<hr>

function show footer ()

?>

<hr>

This Is the footer

</body>

</html>

<?

}

?>

Листинг 9.11. Применение инициализационного файла

<?

// Включить инициализационный файл

include("site_init.tpl");

// Вывести заголовок

show header ($site_name);

?>

// Содержимое основной части This is some body information

<?

// Вывести колонтитул Show_footer( );

?>

На главную