Яндекс цитирования
 

CGI/PERL : практика программирования

 

[ В начало раздела ]

Электронный фотоальбом

Сейчас я вместе с вами построю то, что уже многих давно интересует.

Фотоальбом на Perl!

Звучит интрегующе, не так ли? Уверяю вас, что все достаточно просто. Каждый имеющий хотя бы малейшее представление о работе с текстовыми файлами, а также о работе массивов и хэшей сможет разобраться самостоятельно с задачей. Я лишь немного в этом помогу.

Итак, сфорулирую точнее задачу. Необходимо создать скрипт, реализующий работу электронного фотоальбома. Пользователю должен выводится полный рубрикатор фотографий из альбома. Причем фотографии могут дублироваться в нескольких группах.

При выборе группы, предоставляются все фотографии в группе (эскизы). При выборе любой из них, пользователь может увидеть оригинал фотографии и описание ее.

В файле "photos.txt" будем хранить каталог фотографий. Причем записи будут хранить информацию в виде:

номер_группы;Название группы
идентификатор;эскиз;оригинал_фото;пояснение
...

Идентификатор - 4-х значное число с опережающими нулями.

Пример файла "photos.txt":

  06;Олег Митяев
  0030;mt01_s.jpg;mt01.jpg;Олег Митяев (с обложки песенника "Давай с тобой поговорим")
  0031;mt02_s.jpg;mt02.jpg;Олег Митяев
  0032;mit01_s.jpg;mit01.jpg;Олег Митяев
  0033;mit02_s.jpg;mit02.jpg;Олег Митяев
  0034;mit03_s.jpg;mit03.jpg;Олег Митяев
  0035;mit04_s.jpg;mit04.jpg;Олег Митяев
  07;Константин Тарасов
  0036;tar1_s.jpg;tar1.jpg;Константин Тарасов
  0037;tar2_s.jpg;tar2.jpg;Константин Тарасов. Фрагмент клипа "Лето-это маленькая жизнь!"

Условимся, что все изображения лежат в каталоге "\photos" корня.

Различие между выбором группы и фотографии установим следующее: номер группы - двухзначное число, а номер фото - 4-хзначное число.

Давайте сделаем скрипт настраиваемым к числу фотографий в строке. Например, 4.

Все это отразим в блоке констант:

# константы
$HOME_DIR = "/home/dolgov/public_html/";
$SCRIPT_DIR = $HOME_DIR . "cgi-bin/";
$PHOTOS_BASE = $SCRIPT_DIR . "photos.txt";
$PHOTOS_DIR =  "photos/";
$INROW = 4;   # число фото в строке
$TDWIDTH = "200";  # ширина ячейки для фото
$ALBUMPHOTO_HTML = "photos.htm";  # шаблон каталог
$SHOWPHOTO_HTML = "photos2.htm";  # шаблон фото

require $SCRIPT_DIR."parsform.pl"; require $SCRIPT_DIR."template.pl";

Заметьте, что я использую в работе шаблоны для вывода информации пользователям. Это очень удобно и практично, так как без особых усилий я могу превратить любой скрипт в издательскую систему! Об этом в следующих статьях.

Подключаемый модуль "parsform.pl" помогает разбирать входные данные, помещая их в хэш $FORM, а модуль "template.pl" - отвечает за обработку шаблона и замену спецтегов значениями хэшей $CONFIG, $VAR, $ENV. Повторяю, это намного удобнее, чем в код программы вписывать килобайты HTML-кодов!

Спецтеги - текстовые строки в формате <<ИМЯ_ПЕРЕМЕННОЙ>>.

# получаю список параметров из входного потока
if ($ENV{'QUERY_STRING'}) {
    # устанавливаем REQUEST_METHOD и разбираем данные.
    $ENV{'REQUEST_METHOD'} = "GET";
    &parse_form;
}

Итак, разобравшись с настройкой, двинемся дальше.

Каждый раз при обращении к скрипту мы должны читать информацию из файла каталога. Поэтому сразу же его прочитаем и поместим в массив @base.

# открываю фото-базу
open(BASE, $PHOTOS_BASE);
@base = <BASE>;
close BASE;

Теперь установим разветвление программы по своим веткам, которые в конце пути опять сойдутся вместе для вывода информации пользователям. Нам необходимо реализовать:

  • - формирование содержание фото-каталога;
  • - формирование страницу с фото группы;
  • - вывод отдельной фотографии.
if($FORM{'id'}) { 
  if ($FORM{'id'} =~ /^(\d\d)\b/) { &photo_album($FORM{'id'}); }
  else { &show_photo($FORM{'id'}); }}
else { &album_content; }

# вывожу в броузер страницу print STDOUT "Content-type: text/html\n\n"; if (!&parse_template($TEMPLATE_HTML, *STDOUT)) { print "<HTML><BODY>$Error_Message</BODY></HTML>\n"; }

Содержание альбома. Мы должны просмотреть файл каталога и выбрать наименования групп. Далее эту информацию сформировать в виде строки HTML, которую поместим в переменную $VAR{'ALBUM'}. А в переменной $VAR{'PHOTOCOUNT'} будем хранить число фотографий в каталоге. Используем шаблон для фотоальбома (см. блок констант).

Итак, вот получившийся код:

####################################################################
# содержание фотоальбома
####################################################################
sub album_content {
  $VAR{'ALBUM'} = "";  
  $rec = "";
  $phcount = 0; $all=0;

foreach $s (@base) { if ($s =~ /^(\d\d);(.*)/) { if ($rec ne "") {$rec .= " ($phcount)<br>\n"; $phcount=0;} $rec .= "<a href=\"$ENV{'PATH_INFO'}?id=$1\">$2</a>"; } else {$phcount++; $all++;} } if ($rec ne "") {$rec .= " ($phcount)<br>\n"; $phcount=0;} $VAR{'ALBUM'} = "<p style=\"PADDING-LEFT: 12px\">\n".$rec."</p>"; $VAR{'PHOTOCOUNT'} = $all;

$TEMPLATE_HTML = $HOME_DIR . $ALBUMPHOTO_HTML; return(1); }

Далее, сформируем страницу фотоальбома с эскизами. Действуем следующим образом. Читаем файл каталога, выделем фотографии в нужной нам группе, формируем таблицу из эскизов и описаний, недостающие ячейки дописываем. Аналогично предыдущей процедуре, считаем количество фотографий в группе и составляем переменную $VAR{'ALBUM'} для вывода таблицы эскизов.

####################################################################
# создание фотоальбома
####################################################################
sub photo_album {
  # инициализация
  $group = shift;

$VAR{'ALBUM'} = ""; $groupcounts = 0; $groups = ""; $records = 0; $worktype = 0;

# просматриваю базу и распределяю по группам foreach $s (@base) { if ($s =~ /^(\d\d);(.*)/) { if ($worktype eq 1) {$worktype = 2;} if ($group eq $1) {$worktype=1; $VAR{'DESC'} = "/ $2";} if ($worktype eq 2) {last;} # останавливаю обработку next; } if ($worktype eq 1) { ($id,$filesmall,$filebig,$caption) = split(/;/, $s); $n = $groupcounts; if(($n eq 0)||(!$n)) {$groups .= "<tr>\n"; $n=0;} $groups .= "<td align=\"center\" width=$TDWIDTH nowrap>\n". "<table width=\"100%\" height=\"100%\" border=0 cellspacing=0 cellpadding=0>". "<tr><td height=\"100%\" align=center valign=top>". "<a href=\"$ENV{'PATH_INFO'}?id=$id\">". "<img src=\"../$PHOTOS_DIR$filesmall\" valign=\"top\" border=2></a></td></tr>". "<tr><td height=50 valign=\"top\" align=center><p>$caption</p></td></tr> </table></td>\n"; if ($n eq $INROW-1) { $n=0; $groups .= "</tr>\n"; } else {$n++;} $groupcounts = $n; $records++; } } $VAR{'PHOTOCOUNT'} = $records;

# дописываю недостающие ячейки в последнюю строку $s = $groups; $el = $groupcounts; if($el ne 0) { $s .= ("<td></td>")x($INROW-$el) . "</tr>\n"; } $VAR{'ALBUM'} = "<table width=\"100%\" border=0 cellspacing=0>\n". $s."</table>\n";

$TEMPLATE_HTML = $HOME_DIR . $ALBUMPHOTO_HTML; return(1); }

Теперь осталось вывести оригинал фотографии. Для этого используем сквозной поиск по каталогу, формирование названия изображения и тега img для фотографии. Используем шаблон для одиночной фотографии.

####################################################################
# вывод выбранной фотографии
####################################################################
sub show_photo {
  $id = shift;

foreach $s (@base) { if($s =~ /^$id;/) { ($id,$filesmall,$filebig,$caption) = split(/;/, $s); last; } }

$VAR{'PHOTO'} = "<img src=\"../$PHOTOS_DIR$filebig\" border=0>"; $VAR{'PHOTOCAPTION'} = $caption;

if($ENV{'HTTP_REFERER'} eq "") {$backpath = $ENV{'PATH_INFO'};} else {$backpath = $ENV{'HTTP_REFERER'};}

$VAR{'BACK'} = "<a href=\"$backpath\">Вернуться</a>"; $TEMPLATE_HTML = $HOME_DIR . $SHOWPHOTO_HTML; return(1); }

Вот мы создали собственный электронный фотальбом. Осталось наполнить его фотографиями и шутливыми описаниями и ... позвать своих друзей на просмотр!

Удачи!

© Долгов Сергей 27.11.2000

 

[ В начало раздела ]


 

 

Все для web-дизана!!! Бард-Путеводитель Много Всего CGI-Гид. Лучшие скрипты... WDH - WebDesignHelp - CGI, JAVA, APPLETS, TOP100! Раскрутка, увеличение посещаемости и индекса цитируемости в поисковых системах.

© 2000-2002 Долгов Сергей

dolgov_sergei@mail.ru

X