![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Главная | Учебник | Статьи | FAQ | Книги | Ссылки |
Глава 6
При создании Интернет-ресурса, содержащего часто обновляю-щееся однотипное содержание, проблема быстроты и удобства обнов-ления встает достаточно остро. Например, вы являетесь администра-тором сайта, на котором размещаются статьи разных авторов. В таком случае при поступлении новой статьи вам приходится, помимо раз-мещения на web-сервере (или выделенном вам аккаунте) ее самой, еще и обновлять страницу со списком этих статей, добавив ссылку на новоразмещенную web-страницу со статьей - иначе ведь попасть на новую статью с сайта будет невозможно. А если статьи поступают часто? Да еще и не только поступают, но и удаляются, или в них ме-няется название? Тогда ведь для отслеживания правильности содер-жания приходится прилагать немало усилий.
Или другая ситуация - необходимо разместить на сайте новостную ленту. Простое решение напрашивается сразу: просто включать текст новостей в содержащую их страницу. Или, в крайнем случае, писать новости в отдельном файле, а в web-страницу включать этот файл с помощью команды PHP include - тогда при обновлении новостей при-дется загружать на сервер только файл с новостями, а не всю страни-цу. Но все же… не так это и удобно! Каждый раз работать с файлом с гипертекстовой разметкой, каждый раз его загружать на сайт… А ес-ли вам надо поручить загрузку человеку, который совершенно не зна-ет HTML? Текст-то он напишет, а вот вставить его в нужное место гипертекстовой разметки?
Или, наконец, третья ситуация - вы делаете файловый архив, и ва-ши друзья загружают на ваш сервер свои файлы. Как сделать так, чтобы они появлялись в списке доступных для посетителей файлов сразу же после их загрузки, без вашего участия, без необходимости вручную обновлять их список?
Приведенный ниже сценарий на языке PHP пригодится вам во всех трех случаях. Вкратце его алгоритм прост: при вызове содержащей его страницы он пробегает по всем файлам в указанной в сценарии директории и составляет их список. А с этим списком можно уже сделать все, что хочется: либо включить их содержимое друг за дру-гом в выводимую web-страницу, либо составить каталог файлов.
Итак - вот сценарий:
<?php
Сначала укажем сценарию имя папки, в которой содержатся под-лежащие каталогизации или включению в другую страницу файлы:
$dirct="new";
Для того, чтобы PHP мог работать с файлами из этой папки, необ-ходимо указать ее дескриптор - некое "внутреннее имя", "поток выво-да данных" (о том, почему приходится так делать, смотрите литерату-ру по PHP и программированию, покамест же просто примите к све-дению). Для этого используется функция opendir (каталог), а полу-чаемый с ее помощью дескриптор записывается в переменную $hdl:
$hdl=opendir($dirct);
Теперь запишем все имена содержащихся в ней файлов в массив $a[]. Согласно синтаксису PHP (см. главу 3), для этого достаточно просто присваивать массиву $a[] различные значения - при этом ав-томатически в него будут добавляться новые члены, которым эти зна-чения будут присваиваться. Для помещения имен файлов (с расшире-ниями) из директории $dirct в массив используется функция readdir (имя каталога), работающая с дескриптором этой ди-ректории, записанным ранее в переменную $hdl с помощью функции opendir.
Комментарий:
Функция readdir предназначена для вывода списка файлов и папок, содер-жащихся в указанном в ее параметре каталоге. При каждом своем вызове она выда-ет имя случайно выбранного файла (или вложенной папки) указанного каталога, каждый раз - новое, до тех пор, пока не перечислит имена всех файлов и вложенных папок.
Среди выданных функцией readdir имен будут и ссылки на те-кущий и родительский (т.е. включающий в себя текущий) каталог, обозначаемые соответственно одной и двумя точками (так уж работа-ет web-сервер). Поскольку нас интересуют только файлы каталога, то данные ссылки из списка файлов следует исключить, добавив провер-ку состава имени файла.
while ($file = readdir($hdl)) { if (($file!=".")&&($file!="..")) { $a[]=$file; } }
Теперь закроем открытую папку, очистив дескриптор (так необхо-димо) - функцией closedir (каталог):
closedir($hdl);
Список имен файлов папки, помещенный теперь в массив $a, со-держит эти имена в случайном порядке - так их выдает функция readdir. Однако массив можно отсортировать - функциями asort (по алфавиту - прямое) или rsort (по алфавиту - обратное: с z до а). Использование сортировки массива даст возможность включать име-на файлов или их содержимое в определенном порядке - достаточно лишь называть их так, чтобы они сортировались нужным образом (скажем, новости удобно именовать датой - файлы с ними могут иметь имена типа 20020901.php, 20020902.php, тогда при прямой сор-тировке самые свежие файлы окажутся внизу списка, при обратной - вверху).
rsort($a);
Ну, а теперь будем выводить имена по одному с начала массива до конца и использовать их по своему усмотрению. Для этого применим оператор foreach (переменная as массив), который считывает в ука-занную в его параметрах переменную все элементы массива по очере-ди, выполняя каждый раз указанный после него в фигурных скобках код, в котором указанная переменная может использоваться:
foreach ($a as $value) {
Комментарий:
Оператор foreach будет работать только в PHP 4.0 и выше. Если вы можете ис-пользовать лишь PHP3, то вместо него можно использовать немного более громозд-кий код - вначале определим размер полученного списка:
$l=sizeof($a);
а затем выполним нижеследующий цикл для каждого элемента массива с помо-щью цикла for, указав в его параметрах узнанную величину массива:
for ($k = 1; $k < $l; $k++) {
Для удобства можно записать значение очередного элемента массива в перемен-ную:
$value=$a[$k];
и получится практически полный аналог оператора foreach.
Дальнейший текст сценария зависит от ваших потребностей (и одинаков как для оператора foreach, так и при использовании цикла for).
Чтобы вывести простой список файлов в папке $dirct, состоя-щий из гиперссылок на них, можно использовать такую команду, по-местив ее в это место сценария:
echo ("<a href=$dirct/$value>$value</a><br>");
Чтобы вставить в страницу содержимое всех файлов в папке $dirct, можно применить команду include:
include ("$dirct/$value");
Данный способ, например, используется при выводе ленты обьяв-лений и новостей на реально существующем сайте www.harchikov.ru (см. рис. 6.1).
Вот так она делается.
В корневом каталоге сайта создана папка news, а на его заглавной странице размещен вышеприведенный сценарий (второй вариант - с использованием команды include). Для помещения на сайт нового обьявления администратору достаточно набрать его текст (при необ-ходимости использовав html-разметку, но можно и без нее), помес-тить этот текст в файл, назвать файл цифровой записью даты создания обьявления (для удобства работы и сортировки) и разместить его в папке news на сайте www.harchikov.ru. Никакой редакции каких-либо страниц сайта не требуется. Для удаления обьявления с сайта доста-точно просто удалить файл с ним из папки news, и впредь выдаваемые посетителям страницы не будут включать в себя его содержимое. Весь процесс нетрудно поручить даже секретарше или полному "чай-нику".
Однако для составления списка статей информации только об именах файлов мало. Ведь в таком списке желательно указать хотя бы название статьи и имя ее автора. Чтобы это сделать, можно, напри-мер, указывать эти данные в тэгах meta, включаемые в каждый файл со статьей, а узнать содержимое данных тэгов можно с помощью функции .
Комментарий:
Функция get_meta_tags (имя файла) создает массив, имена элементов (В PHP компоненты массива могут иметь не только числовой индекс, но и имена, такой массив называется ассоциативным. Подробнее - в Главе 3) которого соответствуют названиям мета-тэгов указанного в параметре функции файла (если, конечно, таковые тэги там есть), а значения этих элементов - соответствующим зна-чениям мета-тэгов.
Например, положим, что названия статей будем писать в мета-тэгах zagol, а имена авторов - в мета-тэгах author (т.е. в раздел <head> каждого файла со статьей нужно будет добавить строчки <meta name="zagol" content="Заголовок статьи"><meta name="author" content="Автор ста-тьи">). Тогда строки сценария, вытаскивающие из файла содержи-мое этих тэгов и помещающие их на страницу, будут выглядеть так:
$m=get_meta_tags("$dirct/$value"); echo "<a href=$dirct/$value>$m[zagol]</a> $m[author]<br>";
Использование этого способа иллюстрируется в примере на рис.6.2. В папке duel находится файл index.php с данным сценарием, а в папке stats - статьи. В каждом файле со статьей присутствуют мета-тэги zagol и author, в которых указаны названия статей и их авто-ры. При вызове файла index.php находящийся в нем сценарий пробе-гает по всем файлам в папке stats, вытаскивает из них мета-тэги и отображает их на странице. Номера в названиях файлов со статьями используются для установки очередности вывода ссылок на них.
Без всяких иных изменений.
Ну, и конец сценария:
} ?>
При небольшой доработке возможности использования сценария можно серьезно расширить - скажем, генерировать с его помощью списки файлов в любой директории, а не только в указанной. Для это-го следует убрать из сценария строку, жестко задавающую имя папки - в приведенном примере $dirct="new";, а значение переменной с именем подлежащей "потрошению" папки с файлами - $dirct - за-давать через ссылку для вызова страницы. Например, если статьи раз-ных номеров журнала помещаются в отдельные папки (например, со-ответственно называющиеся news1, news2), то для того, чтобы ис-пользовать одну и ту же страницу со сценарием для вывода оглавле-ний различных номеров, нужно указывать имя папки в передаваемой через адресную строку переменной, а впоследствии именно эту пере-менную использовать в сценарии в качестве имени "потрошимой" папки. Например, ссылки на той странице, откуда происходит пере-ход на страницу со сценарием, могут выглядеть так: oglav.php?dirct=news1, oglav.php?dirct=news2 и т.д., где oglav.php - страница со сценарием, а $dirct - переменная, в которую записывается имя папки (рис. 6.3).
Таким образом, PHP может снять с web-мастера массу рутинного труда и позволит ему сосредоточиться непосредственно на содержи-мом сайта, что наверняка послужит только на пользу посетителям.
Данный сценарий, столь подробно разобранный в этой главе, будет нередко использоваться в последующих главах. Поэтому изучите его повнимательнее.