Содержание
Приведенные в статье общие размышления можно проиллюстрировать реализацией простого примера с использованием различных средств. Примером будет список логотипов выводимых в каком-либо месте страницы - например, вдоль нижнего края. Каждый логотип характеризуется следующими атрибутами:
Изображение
Ссылка
В результате нужно получить на странице фрагмент HTML-кода примерно следующего содержания:
<P> <A HREF="ссылка-1"> <IMG SRC="URL-изображения-1"> </A> ... несколько повторений ... </P>
Причем должна быть возможность легкого изменения дизайна приведенного фрагмента и списка логотипов.
За отсутствием серьезных альтернатив для более масштабных задач, будем хранить логотипы в базе данных MySQLв таблице, определяемой строкой:
CREATE TABLE logo ( id int primary key auto_increment, img varchar(32), ref varchar(32) );
Для отображения будем использовать следующий фрагмент кода HTML::Template :
..... какое-то начало .... <P> <TMPL-LOOP name="logo_list"> <A HREF="%ref%"> <IMG SRC="%img%"> </A> </TMPL-LOOP> </P> ..... какой-то конец ....
Для получения данных из базы создадим perl-модуль под названием LOGO, который будет содеражать следующий фрагмент кода:
if ($self->query(logo_list)) { $self->htmltable("select ref,img from logo",logo_list,ref,img) }
(Позже мы поясним почему нужен "целый модуль" для одной строки кода)
Все, задача практически решена: после небольшого тестирования HTML::Template-код можно отдать дизайнеру, который из вышеприведенного незамысловатого фрагмента сделает конфетку. Как нетрудно видеть, дизайнер не выходит за пределы привычной ему концепции HTML-тегов: просто появились два новых тега. Нарушить программный код дизайнер не может, т.к. не имеет к нему доступ.
Но за этими победными словами кроется подводный камень: приведенный фрагмент кода функционально не полон. Как разместить новые логотипы в списке? Открыть Unix-shell, запустить консольный клиент MySQL и начать писать SQL-запросы? Вполне возможный вариант, хотя на самом деле, вышеупомянутый "целый модуль" придется существенно доработать, добавив средства редактирования таблицы логотипов. Это нетрудно - но выходит за рамки нашего примера. Результатом будет функционально полное решение, позволяющее вставлять в CGI-скрипт возможность отображать строку логотипов, написав команду вида:
$logo = LOGO->new(tablename=>"logo", edit=>"1");
Как видим, объект здесь - строка логотипов, методы которого - отображение, редактировние и т.п.