Глава 24. ПРИЛОЖЕНИЕ А

Содержание

CGI-скрипт & HTML::Template
Midgard
Zope

Приведенные в статье общие размышления можно проиллюстрировать реализацией простого примера с использованием различных средств. Примером будет список логотипов выводимых в каком-либо месте страницы - например, вдоль нижнего края. Каждый логотип характеризуется следующими атрибутами:

  1. Изображение

  2. Ссылка

В результате нужно получить на странице фрагмент HTML-кода примерно следующего содержания:


<P>
        <A HREF="ссылка-1"> <IMG SRC="URL-изображения-1"> </A>
        ... несколько повторений ...
</P>

Причем должна быть возможность легкого изменения дизайна приведенного фрагмента и списка логотипов.

CGI-скрипт & HTML::Template

За отсутствием серьезных альтернатив для более масштабных задач, будем хранить логотипы в базе данных 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");

Как видим, объект здесь - строка логотипов, методы которого - отображение, редактировние и т.п.