Различия между версиями 1 и 20 (по 19 версиям)
Версия 1 от 2010-09-29 06:54:14
Размер: 719
Редактор: RostislavDzinko
Комментарий:
Версия 20 от 2010-09-29 10:21:24
Размер: 10976
Редактор: RostislavDzinko
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 7: Строка 7:
It is often required to build web applications with equal/similar features, but different look and feel. Variation of look and feel can be simple or complex. It can be either just an exchange of a CSS file and some images. Sometimes, you will be required to reconfigure the application to have different user interface components, such as widgets, tables etc. Also you will be required to mix and match user interface components from multiple packages. Зачастую требуется разрабатывать веб приложения с одинаковыми/похожими требованиями к функциональности, но с разным внешним видом. Варьирование внешнего вида и ощущения приложения может быть как небольшим, так и существенным. Это может быть всего лишь простая замена CSS файла и нескольких изображений. Иногда требуется изменить конфигурацию приложения с целью замещения компонентов пользовательского интерфейса, таких как виджеты, таблицы и т.д.. Также вам потребуется совместно использовать компоненты интерфейса из разных пакетов.
Строка 9: Строка 9:
There are two terms associated with skinning named, layer and skin. Before proceeding, it would be better to understand the meaning of these two terms in BlueBream skinning. Есть два термина, которые ассоциируются с внешним видом - '''слой''' (layer) и '''скин''' (skin). Перед тем, как продолжить, следует лучше разобраться в этих понятиях !BlueBream.

=== Слои ===

Слой определяет ощущение (feel) пользовательского интерфейса приложения. Слой содержит логику отображения приложения. Логика отображения включает в себя вывод страниц и расстановку виджетов. Общими вещами для слоев являются страницы, контент-провайдеры, менеджеры вьюдетов и вьюлеты. Слои разрабатываются !BlueBream (Python) разработчиками.

=== Скины ===

Скин определяет внешний вид пользовательского интерфейса приложения. Общими понятиями для скинов являются шаблоны (ZPT) и ресурсы (CSS, Javascript, и т.д.). Скин использует слои для получения данных шаблонами. Скины разрабатываются HTML верстальщиками и графическими дизайнерами.

=== Слои против скинов ===

И слои и скины реализованы как интерфейсы. Технически, !BlueBream их не различает. На самом деле вся разница между ними только в соглашении о разделении логики и внешнего вида приложения. Вы можете не следовать соглашению, если для вас оно слишком абстрактно, но когда вы разрабатываете приложение с несколькими скинами, настоятельно рекомендуется следовать соглашению, поскольку оно явным образом разделяет задачи.

И слои и скины поддерживают наследование/заимствование. Этот механизм реализуется путем комбинирования наследования интерфейсов и техник просмотра компонентов.

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

В этом разделе обсуждается создание нового скина для приложения "сборщик заявок".

== Новый скин ==

Все виды (представления) по умолчанию регистрируются на слой, который установлен по умолчанию. Следовательно, вам не нужно явно указывать слой, чтобы зарегистрировать вид на слой по умолчанию. Интерфейс, который определяет слой по умолчанию, находится тут: zope.publisher.interfaces.browser.IDefaultBrowserLayer. Слой по умолчанию содержит множество вещей, которые вам не всегда нужны (настройки безопасности). Поскольку очень много всего в ''zope.app'' зарегистрировано на слой по умолчанию, он содержит неконтролируемое количество мусора. Очень трудно подтвердить, что все регистрации соответствуют потребностям безопасности вашего приложения. Другая проблема в том, что эти виды могут быть доступны, даже когда вы этого не хотите. И хотя рекомендуется разрабатывать слои с нуля, некоторые регистрации в слое по умолчанию могут быть очень даже полезными. Примерами являются регистрации видов страниц с ошибками, регистрации траверсинга, и виджеты.

== Установка слоя ==

Вы можете создать новый пакет с именем '''skin''' внутри пространства имен '''tc'''. Все вещи, связанные со скином, будут добавляться здесь. Сначала создайте папку '''skin''' и файл _ _init_ _.py, чтобы создать пакет Python:

{{{#!highlight bash
$ mkdir src/tc/skin
$ echo "#Python Package" > src/tc/skin/__init__.py
}}}

Определение скина будет находится в ''src/tc/skin/interfaces.py'', а регистрация в ''src/tc/skin/configure.zcml''. Чтобы создать новый слой, вам следует описать интерфейс типа '''IBrowserSkinType'''. Создайте '''ITCLayer''', как показано ниже, в ''src/tc/skin/interfaces.py'':

{{{#!highlight python
from zope.publisher.interfaces.browser import IBrowserSkinType

class ITCLayer(IBrowserSkinType):
    """Ticket collector application layer"""
}}}

{{{#!wiki note
'''Тип интерфейса'''

'''IBrowserSkinType''' - интерфейс, который очень похож на '''Interface'''. Чтобы создать тип интерфейса, создайте интерфейс, наследуясь от ''zope.interface.interfaces.IInterface''. Например:
}}}

{{{#!highlight python
from zope.interface.interfaces import IInterface

class IMyInterfaceType(IInterface):
    """My interface type"""
}}}

Чтобы использовать этот слой, поменяйте все директивы '''page''', '''viewletmanager''', и '''viewlet''', чтобы они указывали на его использование:

{{{#!highlight xml
layer="tc.skin.interfaces.ITCLayer"
}}}

== Установка скина ==

Скины также являются интерфейсами, которые определены в пакете ''zope.interface''. Вы можете создать интерфейс скина, наследуясь от интерфейса слоя. Например, есть '''ITCSkin''', который наследуется от слоя приложения ticket collector (ITCLayer):

{{{#!highlight python
class ITCSkin(ITCLayer):
    """Skin for ticket collector app."""
}}}

Чтобы зарегистрировать его, можно использовать директивы '''interface''' и '''utility''' из пространства имен '''zope'''. Добавьте следующие строки в ''src/tc/skin/configure.zcml'':

{{{#!highlight xml
<configure
   xmlns="http://namespaces.zope.org/zope"
   xmlns:browser="http://namespaces.zope.org/browser"
   i18n_domain="ticketcollector">

  <interface
      interface="tc.skin.interfaces.ITCSkin"
      type="zope.publisher.interfaces.browser.IBrowserSkinType"
      />

  <utility
      component="tc.skin.interfaces.ITCSkin"
      provides="zope.publisher.interfaces.browser.IBrowserSkinType"
      name="TCSkin"
      />

</configure>
}}}

В качестве сокращения вы также можете использовать только директиву '''interface''', передав ей параметр '''name'''. Что касается скинов, следующая директива сделает то же самое, что и две предыдущие:

{{{#!highlight xml
<interface
    interface="tc.skin.interfaces.ITCSkin"
    type="zope.publisher.interfaces.browser.IBrowserSkinType"
    name="TCSkin"
    />
}}}

На данном этапе определение скина завершено, но он все еще не включен из главного пакета приложения. Чтобы включить этот пакет в главный (''tc.main''), вам следует изменить ''src/tc/main/configure.zcml'' и добавить следующее перед </configure>:

{{{#!highlight xml
<include package="tc.skin" />
}}}

Теперь вы можете регистрировать все шаблоны на этот скин, добавляя атрибут '''layer''':

{{{#!highlight xml
layer="tc.skin.interfaces.ITCSkin"
}}}

Как видите, не нужно создавать дополнительный слой, чтобы создать новый скин. Но настоятельно рекомендуется объявлять виды для скина прямо, а не регистрировать их для слоя.

Учебник - часть 3

Введение

Зачастую требуется разрабатывать веб приложения с одинаковыми/похожими требованиями к функциональности, но с разным внешним видом. Варьирование внешнего вида и ощущения приложения может быть как небольшим, так и существенным. Это может быть всего лишь простая замена CSS файла и нескольких изображений. Иногда требуется изменить конфигурацию приложения с целью замещения компонентов пользовательского интерфейса, таких как виджеты, таблицы и т.д.. Также вам потребуется совместно использовать компоненты интерфейса из разных пакетов.

Есть два термина, которые ассоциируются с внешним видом - слой (layer) и скин (skin). Перед тем, как продолжить, следует лучше разобраться в этих понятиях BlueBream.

Слои

Слой определяет ощущение (feel) пользовательского интерфейса приложения. Слой содержит логику отображения приложения. Логика отображения включает в себя вывод страниц и расстановку виджетов. Общими вещами для слоев являются страницы, контент-провайдеры, менеджеры вьюдетов и вьюлеты. Слои разрабатываются BlueBream (Python) разработчиками.

Скины

Скин определяет внешний вид пользовательского интерфейса приложения. Общими понятиями для скинов являются шаблоны (ZPT) и ресурсы (CSS, Javascript, и т.д.). Скин использует слои для получения данных шаблонами. Скины разрабатываются HTML верстальщиками и графическими дизайнерами.

Слои против скинов

И слои и скины реализованы как интерфейсы. Технически, BlueBream их не различает. На самом деле вся разница между ними только в соглашении о разделении логики и внешнего вида приложения. Вы можете не следовать соглашению, если для вас оно слишком абстрактно, но когда вы разрабатываете приложение с несколькими скинами, настоятельно рекомендуется следовать соглашению, поскольку оно явным образом разделяет задачи.

И слои и скины поддерживают наследование/заимствование. Этот механизм реализуется путем комбинирования наследования интерфейсов и техник просмотра компонентов.

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

В этом разделе обсуждается создание нового скина для приложения "сборщик заявок".

Новый скин

Все виды (представления) по умолчанию регистрируются на слой, который установлен по умолчанию. Следовательно, вам не нужно явно указывать слой, чтобы зарегистрировать вид на слой по умолчанию. Интерфейс, который определяет слой по умолчанию, находится тут: zope.publisher.interfaces.browser.IDefaultBrowserLayer. Слой по умолчанию содержит множество вещей, которые вам не всегда нужны (настройки безопасности). Поскольку очень много всего в zope.app зарегистрировано на слой по умолчанию, он содержит неконтролируемое количество мусора. Очень трудно подтвердить, что все регистрации соответствуют потребностям безопасности вашего приложения. Другая проблема в том, что эти виды могут быть доступны, даже когда вы этого не хотите. И хотя рекомендуется разрабатывать слои с нуля, некоторые регистрации в слое по умолчанию могут быть очень даже полезными. Примерами являются регистрации видов страниц с ошибками, регистрации траверсинга, и виджеты.

Установка слоя

Вы можете создать новый пакет с именем skin внутри пространства имен tc. Все вещи, связанные со скином, будут добавляться здесь. Сначала создайте папку skin и файл _ _init_ _.py, чтобы создать пакет Python:

   1 $ mkdir src/tc/skin
   2 $ echo "#Python Package" > src/tc/skin/__init__.py

Определение скина будет находится в src/tc/skin/interfaces.py, а регистрация в src/tc/skin/configure.zcml. Чтобы создать новый слой, вам следует описать интерфейс типа IBrowserSkinType. Создайте ITCLayer, как показано ниже, в src/tc/skin/interfaces.py:

   1 from zope.publisher.interfaces.browser import IBrowserSkinType
   2 
   3 class ITCLayer(IBrowserSkinType):
   4     """Ticket collector application layer"""

Тип интерфейса

IBrowserSkinType - интерфейс, который очень похож на Interface. Чтобы создать тип интерфейса, создайте интерфейс, наследуясь от zope.interface.interfaces.IInterface. Например:

   1 from zope.interface.interfaces import IInterface
   2 
   3 class IMyInterfaceType(IInterface):
   4     """My interface type"""

Чтобы использовать этот слой, поменяйте все директивы page, viewletmanager, и viewlet, чтобы они указывали на его использование:

   1 layer="tc.skin.interfaces.ITCLayer"

Установка скина

Скины также являются интерфейсами, которые определены в пакете zope.interface. Вы можете создать интерфейс скина, наследуясь от интерфейса слоя. Например, есть ITCSkin, который наследуется от слоя приложения ticket collector (ITCLayer):

   1 class ITCSkin(ITCLayer):
   2     """Skin for ticket collector app."""

Чтобы зарегистрировать его, можно использовать директивы interface и utility из пространства имен zope. Добавьте следующие строки в src/tc/skin/configure.zcml:

   1 <configure
   2    xmlns="http://namespaces.zope.org/zope"
   3    xmlns:browser="http://namespaces.zope.org/browser"
   4    i18n_domain="ticketcollector">
   5 
   6   <interface
   7       interface="tc.skin.interfaces.ITCSkin"
   8       type="zope.publisher.interfaces.browser.IBrowserSkinType"
   9       />
  10 
  11   <utility
  12       component="tc.skin.interfaces.ITCSkin"
  13       provides="zope.publisher.interfaces.browser.IBrowserSkinType"
  14       name="TCSkin"
  15       />
  16 
  17 </configure>

В качестве сокращения вы также можете использовать только директиву interface, передав ей параметр name. Что касается скинов, следующая директива сделает то же самое, что и две предыдущие:

   1 <interface
   2     interface="tc.skin.interfaces.ITCSkin"
   3     type="zope.publisher.interfaces.browser.IBrowserSkinType"
   4     name="TCSkin"
   5     />

На данном этапе определение скина завершено, но он все еще не включен из главного пакета приложения. Чтобы включить этот пакет в главный (tc.main), вам следует изменить src/tc/main/configure.zcml и добавить следующее перед </configure>:

   1 <include package="tc.skin" />

Теперь вы можете регистрировать все шаблоны на этот скин, добавляя атрибут layer:

   1 layer="tc.skin.interfaces.ITCSkin"

Как видите, не нужно создавать дополнительный слой, чтобы создать новый скин. Но настоятельно рекомендуется объявлять виды для скина прямо, а не регистрировать их для слоя.

Документации/Bluebream/BluebreamУчебник3 (последним исправлял пользователь RostislavDzinko 2010-09-29 10:41:57)