Содержание
Приведенные в статье общие размышления можно проиллюстрировать реализацией простого примера с использованием различных средств. Примером будет список логотипов выводимых в каком-либо месте страницы - например, вдоль нижнего края. Каждый логотип характеризуется следующими атрибутами:
Изображение
Ссылка
В результате нужно получить на странице фрагмент 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");
Как видим, объект здесь - строка логотипов, методы которого - отображение, редактировние и т.п.