Многие читатели в любой книге о компьютерах пролистывают все, что не представляет непосредственного интереса, и переходят к тому, что они действительно хотят знать. Лично я поступаю именно так. Впрочем, в этом нет ничего страшного - редко встречаются технические книги, которые необходимо читать от корки до корки. А может, вы именно так и поступили - пропустили восемь начальных глав и взялись за эту главу, потому что у нее было самое интересное название? Да и кому захочется тратить время на подробности, когда на работе < горит> очередной проект?
К счастью, подобная торопливость не помешает вам нормально усвоить материал второй части книги, посвященной использованию РНР для построения сайтов и взаимодействия с 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 обязательна!
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.