фотоальбом
Давайте напишем небольшой сценарий, представляющий собой простейший фотоальбом с возможностью добавления в него новых фотографий.
Листинг 28.1. Сценарий photo.php: простейший фотоальбом
<?
$ImgDir="img"; // Каталог для хранения изображений
@mkdir($ImgDir,666); // Создаем, если его еще нет
// Проверяем, нажата ли кнопка добавления фотографии
if(@$doUpload) {
// Проверяем, принят ли файл
if(file_exists($File)) {
// Все в порядке — добавляем файл в каталог с фотографиями
// Используем то же имя, что и в системе пользователя
Copy($File,"$ImgDir/".basename($File_name));
}
}
// Теперь считываем в массив наш фотоальбом
$d=opendir($ImgDir); // открываем каталог
$Photos=array(); // изначально альбом пуст
// Перебираем все файлы
while(($e=readdir($d))!==false) {
// Это изображение GIF, JPG или PNG?
if(!ereg("^(.*)\\.(gif|jpg|png)$",$e,$P)) continue;
// Если нет, переходим к следующему файлу,
// иначе обрабатываем этот
$path="$ImgDir/$e"; // адрес
$sz=GetImageSize($path); // размер
$tm=filemtime($path); // время добавления
// Вставляем изображение в массив $Photos
$Photos[$tm] = array(
'time' => filemtime($path), // время добавления
'name' => $e, // имя файла
'url' => $path, // его URI
'w' => $sz[0], // ширина картинки
'h' => $sz[1], // ее высота
'wh' => $sz[3] // "width=xxx height=yyy"
);
}
// Ключи массива $Photos — время в секундах, когда была добавлена
// та или иная фотография. Сортируем массив: наиболее "свежие"
// фотографии располагаем ближе к его началу.
krsort($Photos);
// Данные для вывода готовы. Дело за малым — оформить страницу.
?>
<body>
<form action=photo.php method=POST enctype=multipart/form-data>
<input type=file name=File><br>
<input type=submit name=doUpload value="Закачать новую фотографию">
</form>
<?foreach($Photos as $n=>$Img) {?>
<img
src=<?=$Img['url']?>
<?=$Img['wh']?>
alt="Добавлена <?=date("d.m.Y H:i:s",$Img['time'])?>"
>
<?}?>
</body>
Конечно, этот сценарий далеко не идеален (например, он не поддерживает удаление фотографий из фотоальбома), но для иллюстрации заявленных возможностей, по-моему, вполне подходит. Для простоты я совместил две функции (администрирование альбома и его просмотр) в одной программе. В реальной жизни, конечно, за каждую из них должен отвечать отдельный сценарий (первый из них, наверное, будет требовать от пользователя прохождения авторизации, чтобы добавлять фотографии в альбом могли лишь привилегированные пользователи).
Обратите внимание на то, как этот сценарий оформлен. В самом начале находится весь код на PHP, который, собственно, и работает с данными фотоальбома. В этом коде в принципе нет никаких указаний на то, как должна быть отформатирована страница. Его задача — просто сгенерировать данные. Наоборот, тот текст, который следует после закрывающей скобки ?>, содержит минимум кода на PHP. Его главная задача — оформить страницу так, чтобы она выглядела красиво. У меня нет никаких других стимулов, кроме как экономии типографской краски, чтобы не разнести данные блоки по разным файлам. Мы еще вернемся к такому подходу в одной из следующих глав.