Различия между версиями 3 и 8 (по 5 версиям)
Версия 3 от 2010-07-14 12:39:23
Размер: 764
Редактор: RostislavDzinko
Комментарий:
Версия 8 от 2010-07-14 12:52:31
Размер: 8903
Редактор: RostislavDzinko
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 12: Строка 12:

{{{#!highlight python
>>> from zope.viewlet.interfaces import IViewlet
>>> from zope.viewlet.interfaces import IViewletManager
}}}

Давайте создадим меню, что, технически, означает создание интерфейса менеджера вьюлетов:

{{{#!highlight python
>>> class IMenu(IViewletManager):
... """Menu viewlet manager."""
}}}

Используя этот интерфейс можно создать менеджер вьюлетов:

{{{#!highlight python
>>> from zope.viewlet import manager
>>> Menu = manager.ViewletManager('left', IMenu)
}}}

Теперь нам следует определить контекст:

{{{#!highlight python
>>> import zope.interface
>>> from zope.app.container import contained
>>> from zope.app.container.interfaces import IContained
>>> class Content(contained.Contained):
... zope.interface.implements(IContained)
>>> root['content'] = Content()
>>> content = root['content']
>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
>>> from zope.publisher.interfaces.browser import IBrowserView
>>> class View(contained.Contained):
... zope.interface.implements(IBrowserView)
... def __init__(self, context, request):
... self.__parent__ = context
... self.context = context
... self.request = request
>>> view = View(content, request)
>>> menu = Menu(content, request, view)
}}}

Так что изначально не будет отображено никакое меню:

{{{#!highlight python
>>> menu.update()
>>> menu.render()
u''
}}}

Но теперь мы регистрируем пункт меню для '''IMenu''':

{{{#!highlight python
>>> import zope.component
>>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer
>>> from z3c.menu.simple.menu import ContextMenuItem
>>> class MyLocalLink(ContextMenuItem):
...
... __name__ = u'MyLocalLink'
... urlEndings = 'myLocal.html'
... viewURL = 'myLocal.html'
>>> # Create a security checker for viewlets.
>>> from zope.security.checker import NamesChecker, defineChecker
>>> viewletChecker = NamesChecker(('update', 'render'))
>>> defineChecker(MyLocalLink, viewletChecker)
>>> zope.component.provideAdapter(
... MyLocalLink,
... (zope.interface.Interface, IDefaultBrowserLayer,
... IBrowserView, IMenu),
... IViewlet, name='MyLocalLink')
}}}

Давайте посмотрим, что случится если использовать менеджер вьюлетов '''IMenu''':

{{{#!highlight python
>>> menu.update()
>>> print menu.render()
}}}
{{{#!highlight html
<a href="http://127.0.0.1/content/myLocal.html"
   class="inactive-menu-item">MyLocalLink</a>
}}}

== Глобальное меню (GlobalMenu) ==

{{{#!highlight python
>>> from z3c.menu.simple.menu import GlobalMenuItem
>>> class MyGlobalLink(GlobalMenuItem):
...
... __name__ = u'MyGlobalLink'
... urlEndings = 'myGlobal.html'
... viewURL = 'myGlobal.html'
>>> defineChecker(MyGlobalLink, viewletChecker)
>>> zope.component.provideAdapter(
... MyGlobalLink,
... (zope.interface.Interface, IDefaultBrowserLayer,
... IBrowserView, IMenu),
... IViewlet, name='MyGlobalLink')
}}}

Теперь посмотрим, что случится если использовать менеджер вьюлетов '''IMenu''':

{{{#!highlight python
>>> menu.update()
>>> print menu.render()
}}}
{{{#!highlight html
<a href="http://127.0.0.1/myGlobal.html"
   class="inactive-menu-item">MyGlobalLink</a>
<a href="http://127.0.0.1/content/myLocal.html"
   class="inactive-menu-item">MyLocalLink</a>
}}}

== Меню в форме закладок ==

Теперь создадим меню в форме закладок с именем '''!MasterMenu''':

{{{#!highlight python
>>> class IMasterMenu(IViewletManager):
... """Master menu viewlet manager."""
}}}

Давайте создадим менеджер вьюлетов используя этот интерфейс и '''!TabMenu''' в качестве базового класса:

{{{#!highlight python
>>> from z3c.menu.simple.menu import TabMenu
>>> MasterMenu = manager.ViewletManager('masterMenu', IMasterMenu,
... bases=(TabMenu,))
}}}

Мы используем тот же контекст, запрос и вид, как и перед этим:

{{{#!highlight python
>>> masterMenu = MasterMenu(content, request, view)
}}}

Итак, изначально меню отображается пустым:

{{{#!highlight python
>>> masterMenu.update()
>>> masterMenu.render()
u''
}}}

Теперь зарегистрируем закладку, которая также является менеджером вьюлетов:

{{{#!highlight python
>>> from zope.browserpage import viewpagetemplatefile
>>> from z3c.menu.simple import ITab
>>> from z3c.menu.simple.menu import Tab
>>> class MyTabs(Tab):
... template = viewpagetemplatefile.ViewPageTemplateFile('tab.pt')
>>> myTabs = MyTabs(content, request, view)
}}}

И снова получаем пустое меню:

{{{#!highlight python
>>> myTabs.update()
>>> myTabs.render()
u''
}}}

Теперь зарегистрируем действие, которое также является менеджером вьюлетов:

{{{#!highlight python
>>> from z3c.menu.simple import IAction
>>> from z3c.menu.simple.menu import Action
>>> class MyActions(Action):
... template = viewpagetemplatefile.ViewPageTemplateFile('action.pt')
>>> myActions = MyActions(content, request, view)
}}}

И опять получаем пустое меню:

{{{#!highlight python
>>> myActions.update()
>>> myActions.render()
u''
}}}

После установки менеджеров вьюлетов '''!TabMenu''', '''Tab''' и '''Action''' мы начинаем регистрировать пункт меню закладки:

{{{#!highlight python
>>> from z3c.menu.simple.menu import TabItem
>>> class MyTab(TabItem):
...
... __name__ = u'MyTab'
... url = 'myTab.html'
... selectedViewNames = ['myTab.html']
>>> tabChecker = NamesChecker(('update', 'render', 'css', 'selected'))
>>> defineChecker(MyTab, tabChecker)
>>> zope.component.provideAdapter(
... MyTab,
... (zope.interface.Interface, IDefaultBrowserLayer,
... IBrowserView, ITab),
... IViewlet, name='MyTab')
}}}

Теперь взгляните, что мы получаем, когда отображаем менеджер вьюлетов:

{{{#!highlight python
>>> myTabs.update()
>>> print myTabs.render()
}}}
{{{#!highlight html
<div class="tabMenu">
  <span class="inactive-menu-item">
  <a href="myTab.html">MyTab</a>
</span>
</div>
}}}

После того, как вы увидели, как использовать пункт меню в форме закладки, давайте зарегистрируем действие.

{{{#!highlight python
>>> from z3c.menu.simple.menu import ActionItem
>>> class MyAction(ActionItem):
...
... __name__ = u'MyAction'
... title = 'myAction'
>>> actionChecker = NamesChecker(('update', 'render', 'title'))
>>> defineChecker(MyAction, actionChecker)
>>> zope.component.provideAdapter(
... MyAction,
... (zope.interface.Interface, IDefaultBrowserLayer,
... IBrowserView, IAction),
... IViewlet, name='MyAction')
}}}

Теперь посмотрим, что мы получим с использованием менеджера вьюлетов действия:

{{{#!highlight python
>>> myActions.update()
>>> print myActions.render()
}}}
{{{#!highlight html
<div class="actionMenuWrapper">
  <ul class="actionMenu">
    <li class="inactive-menu-item">
      <a href="">
        <div>myAction</div>
      </a>
    </li>
  </ul>
</div>
<div class="clearActionMenu" />
}}}

z3c.menu.simple - Простые меню на базе вьюлетов

Простое меню

Пакет z3c.menu.simple предоставляет простую реализацию меню, которая позволяет создавать простые меню на базе контент провайдеров и вьюлетов. На данный момент в пакете присутствует несколько реализаций пунктов меню SimpleMenuItem, а также меню в форме закладок. Давайте рассмотрим более детально, что все это значит.

Контекстное меню (ContextMenu)

   1 >>> from zope.viewlet.interfaces import IViewlet
   2 >>> from zope.viewlet.interfaces import IViewletManager

Давайте создадим меню, что, технически, означает создание интерфейса менеджера вьюлетов:

   1 >>> class IMenu(IViewletManager):
   2 ...     """Menu viewlet manager."""

Используя этот интерфейс можно создать менеджер вьюлетов:

   1 >>> from zope.viewlet import manager
   2 >>> Menu = manager.ViewletManager('left', IMenu)

Теперь нам следует определить контекст:

   1 >>> import zope.interface
   2 >>> from zope.app.container import contained
   3 >>> from zope.app.container.interfaces import IContained
   4 >>> class Content(contained.Contained):
   5 ...     zope.interface.implements(IContained)
   6 >>> root['content'] = Content()
   7 >>> content = root['content']
   8 >>> from zope.publisher.browser import TestRequest
   9 >>> request = TestRequest()
  10 >>> from zope.publisher.interfaces.browser import IBrowserView
  11 >>> class View(contained.Contained):
  12 ...     zope.interface.implements(IBrowserView)
  13 ...     def __init__(self, context, request):
  14 ...         self.__parent__ = context
  15 ...         self.context = context
  16 ...         self.request = request
  17 >>> view = View(content, request)
  18 >>> menu = Menu(content, request, view)

Так что изначально не будет отображено никакое меню:

   1 >>> menu.update()
   2 >>> menu.render()
   3 u''

Но теперь мы регистрируем пункт меню для IMenu:

   1 >>> import zope.component
   2 >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer
   3 >>> from z3c.menu.simple.menu import ContextMenuItem
   4 >>> class MyLocalLink(ContextMenuItem):
   5 ...
   6 ...     __name__ = u'MyLocalLink'
   7 ...     urlEndings = 'myLocal.html'
   8 ...     viewURL = 'myLocal.html'
   9 >>> # Create a security checker for viewlets.
  10 >>> from zope.security.checker import NamesChecker, defineChecker
  11 >>> viewletChecker = NamesChecker(('update', 'render'))
  12 >>> defineChecker(MyLocalLink, viewletChecker)
  13 >>> zope.component.provideAdapter(
  14 ...     MyLocalLink,
  15 ...     (zope.interface.Interface, IDefaultBrowserLayer,
  16 ...     IBrowserView, IMenu),
  17 ...     IViewlet, name='MyLocalLink')

Давайте посмотрим, что случится если использовать менеджер вьюлетов IMenu:

   1 >>> menu.update()
   2 >>> print menu.render()

   1 <a href="http://127.0.0.1/content/myLocal.html"
   2    class="inactive-menu-item">MyLocalLink</a>

Глобальное меню (GlobalMenu)

   1 >>> from z3c.menu.simple.menu import GlobalMenuItem
   2 >>> class MyGlobalLink(GlobalMenuItem):
   3 ...
   4 ...     __name__ = u'MyGlobalLink'
   5 ...     urlEndings = 'myGlobal.html'
   6 ...     viewURL = 'myGlobal.html'
   7 >>> defineChecker(MyGlobalLink, viewletChecker)
   8 >>> zope.component.provideAdapter(
   9 ...     MyGlobalLink,
  10 ...     (zope.interface.Interface, IDefaultBrowserLayer,
  11 ...     IBrowserView, IMenu),
  12 ...     IViewlet, name='MyGlobalLink')

Теперь посмотрим, что случится если использовать менеджер вьюлетов IMenu:

   1 >>> menu.update()
   2 >>> print menu.render()

   1 <a href="http://127.0.0.1/myGlobal.html"
   2    class="inactive-menu-item">MyGlobalLink</a>
   3 <a href="http://127.0.0.1/content/myLocal.html"
   4    class="inactive-menu-item">MyLocalLink</a>

Меню в форме закладок

Теперь создадим меню в форме закладок с именем MasterMenu:

   1 >>> class IMasterMenu(IViewletManager):
   2 ...     """Master menu viewlet manager."""

Давайте создадим менеджер вьюлетов используя этот интерфейс и TabMenu в качестве базового класса:

   1 >>> from z3c.menu.simple.menu import TabMenu
   2 >>> MasterMenu = manager.ViewletManager('masterMenu', IMasterMenu,
   3 ...                                     bases=(TabMenu,))

Мы используем тот же контекст, запрос и вид, как и перед этим:

   1 >>> masterMenu = MasterMenu(content, request, view)

Итак, изначально меню отображается пустым:

   1 >>> masterMenu.update()
   2 >>> masterMenu.render()
   3 u''

Теперь зарегистрируем закладку, которая также является менеджером вьюлетов:

   1 >>> from zope.browserpage import viewpagetemplatefile
   2 >>> from z3c.menu.simple import ITab
   3 >>> from z3c.menu.simple.menu import Tab
   4 >>> class MyTabs(Tab):
   5 ...     template = viewpagetemplatefile.ViewPageTemplateFile('tab.pt')
   6 >>> myTabs = MyTabs(content, request, view)

И снова получаем пустое меню:

   1 >>> myTabs.update()
   2 >>> myTabs.render()
   3 u''

Теперь зарегистрируем действие, которое также является менеджером вьюлетов:

   1 >>> from z3c.menu.simple import IAction
   2 >>> from z3c.menu.simple.menu import Action
   3 >>> class MyActions(Action):
   4 ...     template = viewpagetemplatefile.ViewPageTemplateFile('action.pt')
   5 >>> myActions = MyActions(content, request, view)

И опять получаем пустое меню:

   1 >>> myActions.update()
   2 >>> myActions.render()
   3 u''

После установки менеджеров вьюлетов TabMenu, Tab и Action мы начинаем регистрировать пункт меню закладки:

   1 >>> from z3c.menu.simple.menu import TabItem
   2 >>> class MyTab(TabItem):
   3 ...
   4 ...     __name__ = u'MyTab'
   5 ...     url = 'myTab.html'
   6 ...     selectedViewNames = ['myTab.html']
   7 >>> tabChecker = NamesChecker(('update', 'render', 'css', 'selected'))
   8 >>> defineChecker(MyTab, tabChecker)
   9 >>> zope.component.provideAdapter(
  10 ...     MyTab,
  11 ...     (zope.interface.Interface, IDefaultBrowserLayer,
  12 ...     IBrowserView, ITab),
  13 ...     IViewlet, name='MyTab')

Теперь взгляните, что мы получаем, когда отображаем менеджер вьюлетов:

   1 >>> myTabs.update()
   2 >>> print myTabs.render()

   1 <div class="tabMenu">
   2   <span class="inactive-menu-item">
   3   <a href="myTab.html">MyTab</a>
   4 </span>
   5 </div>

После того, как вы увидели, как использовать пункт меню в форме закладки, давайте зарегистрируем действие.

   1 >>> from z3c.menu.simple.menu import ActionItem
   2 >>> class MyAction(ActionItem):
   3 ...
   4 ...     __name__ = u'MyAction'
   5 ...     title = 'myAction'
   6 >>> actionChecker = NamesChecker(('update', 'render', 'title'))
   7 >>> defineChecker(MyAction, actionChecker)
   8 >>> zope.component.provideAdapter(
   9 ...     MyAction,
  10 ...     (zope.interface.Interface, IDefaultBrowserLayer,
  11 ...     IBrowserView, IAction),
  12 ...     IViewlet, name='MyAction')

Теперь посмотрим, что мы получим с использованием менеджера вьюлетов действия:

   1 >>> myActions.update()
   2 >>> print myActions.render()

   1 <div class="actionMenuWrapper">
   2   <ul class="actionMenu">
   3     <li class="inactive-menu-item">
   4       <a href="">
   5         <div>myAction</div>
   6       </a>
   7     </li>
   8   </ul>
   9 </div>
  10 <div class="clearActionMenu" />

Пакеты/ZopePlone/Z3cMenuSimple (последним исправлял пользователь RostislavDzinko 2010-07-14 12:52:31)