САМОУЧИТЕЛЬ PHP 4

фотоальбом


Давайте напишем небольшой сценарий, представляющий собой простейший фотоальбом с возможностью добавления в него новых фотографий.

Листинг 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. Его главная задача — оформить страницу так, чтобы она выглядела красиво. У меня нет никаких других стимулов, кроме как экономии типографской краски, чтобы не разнести данные блоки по разным файлам. Мы еще вернемся к такому подходу в одной из следующих глав.

Содержание раздела