Zope

Теперь все тоже самое, только в Zope. Опять-таки, будем хранить объект в рамках самого Zope, правда, на этот раз это будет действительно объект - объект, для которого помимо свойств определим метод: tag. Не останавливаясь на подробностях создания объекта, скажем лишь что класс объекта называется Logo. В отличие от двух предыдущих случаев будем хранить изображение в самой базе данных, породив класс Logo от встроенного класса image. Хотя метод render можно написать на языке Python, в данном случае будет проще воспользоваться самим DTML. Назначение метода - вернуть строку, отображающую логотип. Вот он:


<A HREF="<dtml_var ref>"> <dtml_var "tag(border=0)">" </A>

(Нам не потребовался тег img, потому что сам по себе объект Image уже делает операцию отображения изображения используя метод tag)

Создадим для объекта Logo вид по умолчанию, вызывающий этот метод. Теперь в каталоге Logo создадим несколько объектов типа Logo, а в нужном месте вставим следующий DTML-код:


<dtml-in "Logo.objectItems()">
        <dtml-var sequence-item>
</dtml-in>

Все, готово. Нашему дизайнеру, как и в Midgard, нужно лезть в разные фрагменты, однако здесь при сохранении всех преимуществ Midgard, мы получаем еще одно: инкапсуляцию. Что будет если в каталог Logo мы положим объект класса Image ? Мы получим картинку без ссылки. А объект класса DTML-document? Вставленный текст документа. Кроме того, мы можем аналогично Logo определить более сложный тип Banner, причем, это происходит незаметно для дизайнера (он лишь определяет метод render()) и прозрачно - для контент-менеджера (в списке классов объектов, которые он может добавить в каталог появляется еще один). Заметим еще одну немаловажную деталь: несколькими манипуляциями мышью мы можем экспортировать определение объекта и сам объект в виде переносимого формата (XML или ZEXP) и импортировать в другой сайт - вот и повторное использование. Функциональная полнота обеспечивается за счет наследования при создании типа объекта.