Главная | Учебник | Статьи | FAQ | Книги | Ссылки |
ГЛАВА 6. РНР:ПАПКОПОТРОШИЛКА При создании Интернет-ресурса, содержащего часто обновляющееся однотипное содержание, проблема быстроты и удобства обновления встает достаточно остро. Например, вы являетесь администратором сайта, на котором размещаются статьи разных авторов. В таком случае при поступлении новой статьи вам приходится, помимо размещения на web-сервере (или выделенном вам аккаунте) ее самой, еще и обновлять страницу со списком этих статей, добавив ссылку на новоразмещенную web-страницу со статьей - иначе ведь попасть на новую статью с сайта будет невозможно. А если статьи поступают часто? Да еще и не только поступают, но и удаляются, или в них меняется название? Тогда ведь для отслеживания правильности содержания приходится прилагать немало усилий. <?php Сначала укажем сценарию имя папки, в которой содержатся подлежащие каталогизации или включению в другую страницу файлы: $dirct="new"; Для того чтобы РНР мог работать с файлами из этой папки, необходимо указать ее дескриптор - некое "внутреннее имя", "поток вывода данных" (о том, почему приходится так делать, смотрите литературу по РНР и программированию, пока же просто примите к сведению). Для этого используется функция opendir (каталог), а получаемый с ее помощью дескриптор записывается в переменную $hdl: $hdl=opendir($dirct); Теперь запишем все имена содержащихся в ней файлов в массив $а [ ]. Согласно синтаксису РНР (см. гл. 3), для этого достаточно просто присваивать массиву $а [ ] различные значения - при этом автоматически в него будут добавляться новые члены, которым эти значения будут присваиваться. Для помещения имен файлов (с расширениями) из директории $dirct в массив используется функция readdir (имя каталога), работающая с дескриптором этой директории, записанным ранее в переменную $hdl с'помощью функции opendir. Комментарий: Среди выданных функцией readdir имен будут и ссылки на текущий и родительский (т. е. включающий в себя текущий) каталог, обозначаемые соответственно одной и двумя точками (так уж работает web-сервер). Поскольку нас интересуют только файлы каталога, то данные ссылки из списка файлов следует исключить, добавив проверку состава имени файла. while ($file = readdir($hdl)) Теперь закроем открытую папку, очистив дескриптор (так необходимо) - функцией closedir (каталог): closedir($hdl); Список имен файлов папки, помещенный теперь в массив $а, содержит эти имена в случайном порядке - так их выдает функция readdir. Однако массив можно отсортировать - функциями asort (по алфавиту - прямое) или rsort (по алфавиту - обратное: с z до а). Использование сортировки массива даст возможность включать имена файлов или их содержимое в определенном порядке - достаточно лишь называть их так, чтобы они сортировались нужным образом (скажем, новости удобно именовать датой - файлы с ними могут иметь имена типа 20020901 .php, 20020902.php, тогда при прямой сортировке самые свежие файлы окажутся внизу списка, при обратной -вверху). rsort($a); Ну а теперь будем выводить имена по одному с начала массива до конца и использовать их по своему усмотрению. Для этого применим оператор foreach (переменная as массив), который считывает в указанную в его параметрах переменную все элементы массива по очереди, выполняя каждый раз указанный после него в фигурных скобках код, в котором указанная переменная может использоваться: foreach ($a as $value) { Комментарий: Дальнейший текст сценария зависит от ваших потребностей (и одинаков как для оператора f oreach, так и при использовании цикла for). echo ("<a href = $dirct/$value>$value</axbr>") ; Чтобы вставить в страницу содержимое всех файлов в папке Sdirct, можно применить команду include: include ("$dirct/$value"); Данный способ, например, используется при выводе ленты обьяв-лений и новостей на уже упоминавшемся сайте www.harchikov.ru. в корневом каталоге сайта создана папка news, а на его заглавной странице размещен вышеприведенный сценарий (второй вариант -с использованием команды include)/Для помещения на сайт нового объявления администратору достаточно набрать его текст (при необходимости использовав html-разметку, но можно и без нее), поместить этот текст в файл, назвать файл цифровой записью даты создания объявления (для удобства работы и сортировки) и разместить его в папке news на сайте. Никакой редакции каких-либо страниц сайта не требуется. Для удаления объявления с сайта достаточно просто удалить файл с ним из папки news, и впредь выдаваемые посетителям страницы не будут включать в себя его содержимое. Весь процесс нетрудно поручить даже секретарше или полному "чайнику". Комментарий: Например, положим, что названия статей будем писать в мета-тэгах zagol, а имена авторов - в мета-тэгах author (т. е. в раздел <head> каждого файла со статьей нужно будет добавить строчки <meta name="zagol" content="3arоловок статьи "><meta name="author" content="ABTop статьи">). Тогда строки сценария, вытаскивающие из файла содержимое этих тэгов и помещающие их на страницу, будут выглядеть так: $m=get_meta_tags("$dirct/$value"); Использование этого способа иллюстрируется в примере на рис.6.1. В папке duel находится файл index.php сданным сценарием, а в папке stats - статьи. В каждом файле со статьей присутствуют мета-тэги zagol и author, в которых указаны названия статей и их авторы. При вызове файла index.php находящийся в нем сценарий пробегает по всем файлам в папке stats, вытаскивает из них мета-тэги и отображает их на странице. Номера в названиях файлов со статьями используются для установки очередности вывода ссылок на них. }
Рис. 6.1. Публикация статей - одной закачкой. Без всяких иных изменений При небольшой доработке возможности использования сценария можно серьезно расширить - скажем, генерировать с его помощью списки файлов в любой директории, а не только в указанной. Для этого следует убрать из сценария строку, жестко задавающую имя папки -в приведенном примере $dirct="new";, а значение переменной с именем подлежащей "потрошению" папки с файлами - $dirct -задавать через ссылку для вызова страницы. Если статьи разных номеров журнала помещаются в отдельные папки (например, соответственно называющиеся newsl, news2), то для того чтобы использовать одну и ту же страницу со сценарием для вывода оглавлений различных номеров, нужно указывать имя папки в передаваемой через адресную строку переменной, а впоследствии именно эту переменную использовать в сценарии в качестве имени "потрошимой" папки. Например, ссылки на той странице, откуда происходит переход на страницу со сценарием, могут выглядеть так: glav.php?dirct=newsl, oglav.php?dirct=news2 и т. д., где oglav.php - страница со сценарием, a $dirct - переменная, в которую записывается имя папки (рис. 6.2). Рис. 6.2. Один скрипт - на все папки Таким образом, РНР может снять с web-мастера массу рутинного труда и позволит ему сосредоточиться непосредственно на содержимом сайта, что наверняка послужит только на пользу посетителям. |