Многие читатели в любой книге о компьютерах пролистывают все, что не представляет непосредственного интереса, и переходят к тому, что они действительно хотят знать. Лично я поступаю именно так. Впрочем, в этом нет ничего страшного - редко встречаются технические книги, которые необходимо читать от корки до корки. А может, вы именно так и поступили - пропустили восемь начальных глав и взялись за эту главу, потому что у нее было самое интересное название? Да и кому захочется тратить время на подробности, когда на работе < горит> очередной проект?
К счастью, подобная торопливость не помешает вам нормально усвоить материал второй части книги, посвященной использованию РНР для построения сайтов и взаимодействия с web. В этой главе вы научитесь легко модифицировать содержимое web-страниц и осуществлять навигацию в web при помощи ссылок и различных стандартных функций. Следующая глава дополнит изложенный материал - в ней подробно рассматриваются средства взаимодействия с пользователем в формах html В главе 11 описана организация интерфейса с базами данных. В остальных главах второй части рассматриваются нетривиальные аспекты web-программирования на РНР.

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

Простые ссылки

По ссылкам пользователь может переходить как на обычные страницы html, так и на страницы, содержащие код РНР:

< а href = "date.php">< view today's date< /a>

Если щелкнуть на ссылке, в браузере будет загружена страница с именем date.php. Просто, не правда ли? Развивая приведенный пример, можно воспользоваться переменной для построения динамической ссылки:

< ?

$link = "date.php";

print "< а href = "$link">view today's date< /a> < br>n"

?>

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

Если необходимость экранировать кавычки вас раздражает, просто включите режим magic_quotes_gpc в файле php.ini. В результате все апострофы, кавычки, обратные косые черты и нуль-символы. в тексте автоматически экранируются!

Разовьем приведенный пример. Для быстрого вывода списка ссылок в браузере можно воспользоваться массивом:

< ? 

// Создать массив разделов 

$contents - array("tutorials", "articles", "scripts", "contact"); 

// Перебрать и последовательно вывести каждый элемент массива 

for ($i = 0; $i <  sizeof($contents; $i++) 

print " • < a href = "".$contents[$i].".php">".$contents[$i]."< /a>< br>n"; 

// • - специальное обозначение точки-маркера endfor; 

?> 

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

Мы подошли к одной из моих любимых возможностей РНР. Шаблоном (применительно к 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 = "[email protected]"; 

$contact_name = "wj gilmore"; 

?> 

Листинг 9.4. Использование файла init.tpl 
<pre>< ? 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= "[email protected]"; 

$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 © 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, то файл колонтитула был бы жестко привязан к конкретному каталогу.



Постоянные ссылки

При копировании ссылка на TeaM RSN обязательна!

URI

Html (ЖЖ)

BB-код (Для форумов)

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.