| ГЛАВА 6. Рнр:папкопотрошилка
При створенні інтернету-ресурсу, що містить часто однотипний вміст, що оновлюється, проблема прудкості і зручності оновлення встає досить гострий. Наприклад, ви є адміністратором сайту, на якому розміщуються статті різних авторів. У такому разі під час вступу нової статті вам доводиться, окрім розміщення на web-сервере (або виділеному вам аккаунте) її самої, ще і оновлювати сторінку із списком цих статей, додавши заслання на новоразмещенную web-страницу із статтею - адже інакше попасти на нову статтю з сайту буде неможливо. А якщо статті поступають часто? Та ще і не лише поступають, але і віддаляються, або в них міняється назва? Адже тоді для відстежування правильності вмісту доводиться докладати немало зусиль.
Або
інша ситуація - необхідно розмістити на сайті новинну стрічку. Просте рішення напрошується відразу: просто включати текст новин в сторінку, що містить їх. Або, в.крайнем випадку, писати новини в окремому файлі, а в web-страницу включати цей файл за допомогою команди PHP include - тоді при оновленні новин доведеться завантажувати на сервер лише файл з новинами, а не всю сторінку. Але все таки... не так це і зручно! Кожного разу працювати з файлом з гіпертекстовою розміткою, кожного разу його завантажувати на сайт... А якщо вам треба доручити завантаження людині, яка абсолютно не знає HTML? Текст-то він напише, а ось вставити його в потрібне місце гіпертекстової розмітки?
Або, нарешті, третя ситуація - ви робите файловий архів, і ваші друзі завантажують на ваш сервер свої файли. Як зробити так, щоб вони з'являлися в списку доступних для відвідувачів файлів відразу ж після їх завантаження, без вашої участі, без необхідності уручну оновлювати їх список?
Приведений нижче
сценарій на мові РНР згодиться вам у всіх трьох випадках. Коротко його алгоритм простий: при виклику сторінки, що містить його, він пробігає по всіх файлах у вказаній в сценарії директорії і складає їх список. А з цим списком можна вже зробити все що хочеться: або включити їх вміст один за одним в web-страницу, що виводиться, або скласти каталог файлів.
Отже - ось сценарій:
<?php
Спочатку вкажемо сценарію ім'я теки, в якій містяться ті, що підлягають каталогізації або включенню в іншу сторінку файли:
$dirct="new";
Для того, щоб РНР міг працювати з файлами з цієї теки, необхідно вказати її дескриптор - якесь "внутрішнє ім'я", "потік виведення даних" (про те, чому доводиться так робити, дивитеся літературу по РНР і програмуванню, поки ж просто візьміть до відома). Для цього використовується функція opendir (каталог), а отримуваний з її допомогою дескриптор записується в змінну $hdl:
$hdl=opendir($dirct);
Тепер запишемо всі імена файлів, що містяться в ній, в масив $а [ ]. Згідно з синтаксисом РНР (див. гл. 3), для цього досить просто привласнювати масиву $а [ ] різні значення - при цьому автоматично в нього додаватимуться нові члени, яким ці значення привласнюватимуться. Для приміщення імен файлів (з розширеннями) з директорії $dirct у масив використовується функція readdir (ім'я каталога), що працює з дескриптором цієї директорії, записаним раніше в змінну $hdl с'помощью функції opendir.
Коментар:
Функція
readdir призначена для виведення списку файлів і тек, що містяться у вказаному в її параметрі каталозі. При кожному своєму виклику вона видає ім'я випадково вибраного файлу (або вкладеної теки) вказаного каталога, кожного разу - нове, до тих пір, поки не перерахує імена всіх файлів і вкладених тек.
Серед виданих функцією readdir імен будуть і заслання на поточний і батьківський (тобто що включає поточний) каталог, що позначаються відповідно одній і двома крапками (так вже працює web-сервер). Оскільки нас цікавлять лише файли каталога, то дані заслання із списку файлів слід виключити, додавши перевірку складу імені файлу.
while ($file = readdir($hdl))
if ( ($file!=".")&&($file!="..")) $a[]=$file;
}
Тепер закриємо відкриту теку, очистивши дескриптор (так необхідно) - функцією closedir (каталог):
closedir($hdl);
Список імен файлів теки, поміщений тепер в масив $а, містить ці імена у випадковому порядку - так їх видає функція readdir . Проте масив можна відсортувати - функціями asort (за абеткою - пряме) або rsort (за абеткою - зворотне: з z до а). Використання сортування масиву дасть можливість включати імена файлів або їх вміст в певному порядку - досить лише називати їх так, щоб вони сортувалися потрібним чином (скажімо, новині зручно іменувати датою - файли з ними можуть мати імена типа 20020901 .php, 20020902.php, тоді при прямому сортуванні найсвіжіші файли виявляться внизу списку, при зворотній -вверху).
rsort($a);
Ну а тепер виводитимемо імена поодинці з початку масиву до кінця і використовувати їх на свій розсуд. Для цього застосуємо оператора foreach (змінна as масив), який прочитує у вказану в його параметрах змінну всі елементи масиву по черзі, виконуючи кожного разу вказаний після нього у фігурних дужках код, в якому вказана змінна може використовуватися:
foreach ($a as $value) {
Коментар:
Оператор foreach працюватиме лише врнр 4.0 і вище. Якщо ви можете використовувати лише РНРЗ, то замість нього можна використовувати трохи більш громіздкий код - спочатку визначимо розмір отриманого списку:
$l=sizeof($a);
а потім виконаємо нижченаведений цикл для кожного елементу масиву за допомогою циклу for, вказавши в його параметрах взнану величину масиву:
for ($k = 1; $k < $1; $k++)
Для зручності можна записати значення чергового елементу масиву в змінну:
$value=$a[$k]; і вийде практично повний аналог оператора for each.
Подальший текст сценарію залежить від ваших потреб (і однаковий як для оператора f oreach, так і при використанні циклу for).
Щоб
вивести простою список файлів в теці $dirct, що складається з гіперпосилань на них, можна використовувати таку команду, помістивши її в це місце сценарію:
echo ("<a href = $dirct/$value>$value</axbr>") ;
Щоб вставити в сторінку вміст всіх файлів в теці Sdirct, можна застосувати команду include: include ("$dirct/$value");
Даний спосіб, наприклад, використовується при виведенні стрічки обьяв-леній і новин на вже згадуваному сайті www.harchikov.ru. у кореневому каталозі сайту створена тека news, а на його заголовній сторінці розміщений наведений вище сценарій (другий варіант -с використанням команди include) /для приміщення на сайт нового оголошення адміністраторові досить набрати його текст (при необхідності використавши html-разметку, але можна і без неї), помістити цей текст у файл, назвати файл цифровим записом дати створення оголошення (для зручності роботи і сортування) і розмістити його в теці news на сайті. Жодної редакції яких-небудь сторінок сайту не потрібна. Для видалення оголошення з сайту досить просто видалити файл з ним з теки news, і надалі видавані відвідувачам сторінки не включатимуть його вміст. Весь процес неважко доручити навіть секретарці або повному "чайнику".
Проте
для складання списку статей інформації лише про імена файлів мало. Адже в такому списку бажано вказати хоч би назву статті і ім'я її автора. Щоб це зробити, можна, наприклад, вказувати ці дані в тегах meta, що включаються в кожен файл із статтею, а взнати вміст даних тегів можна за допомогою функції get_meta_tags (ім'я файлу).
Коментар:
функція get__meta_tags (ім'я файлу) створює масив, елементів (У РНР компоненти масиву можуть мати не лише числовий індекс, але і імена, такий масив називається асоціативним. Детальніше - у гл. 3.) якого відповідають назвам мета-тэгов вказаного в параметрі функції файлу (якщо, звичайно, тако-д'ге теги там є), а значення цих елементів - відповідним значенням мета-тэгов.
Наприклад, покладемо, що назви статей писатимемо в
мета-тэгах zagol, а імена авторів - в мета-тэгах author (тобто в розділ
<head> кожного файлу із статтею потрібно буде додати строчки
<Meta name="zagol" content= "3arоловок статті"><meta name= "author" content= "abtopстатті">). Тоді рядки сценарію, що витягують з файлу вміст цих тегів і що поміщають їх на сторінку, виглядатимуть так:
$m=get_meta_tags("$dirct/$value");
echo "<a href=$dirct/$value>$m[zagol]</a> $m[author]<br>";
Використання цього способу ілюструється в прикладі на ріс.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 - сторінка з сценарієм, а $dirct - змінна, в яку записується ім'я теки (мал. 6.2).

Мал. 6.2. Один скрипт - на всі теки
Таким чином, РНР може зняти з web-мастера масу рутинної праці і дозволить йому зосередитися безпосередньо на вмісті сайту, що напевно послужить лише на користь відвідувачам.
Даний сценарій, настільки детально розібраний в цій главі, незрідка використовуватиметься в подальших главах. Тому вивчите його уважніше. |