Различия между версиями 3 и 4
Версия 3 от 2010-07-14 12:39:23
Размер: 764
Редактор: RostislavDzinko
Комментарий:
Версия 4 от 2010-07-14 12:40:33
Размер: 3218
Редактор: RostislavDzinko
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 12: Строка 12:

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

Let's create a menu which means we define a viewlet manager interface:

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

You can then create a viewlet manager using this interface now:

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

Now we have to define a context:

{{{#!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)
}}}

So initially no menu get rendered:

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

But now we register a context menu item for the 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')
}}}

Now see what we get if the IMenu viewlet manager get used:

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

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

Простое меню

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

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

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

Let's create a menu which means we define a viewlet manager interface:

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

You can then create a viewlet manager using this interface now:

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

Now we have to define a context:

   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)

So initially no menu get rendered:

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

But now we register a context menu item for the 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')

Now see what we get if the IMenu viewlet manager get used:

   1 >>> menu.update()
   2 >>> print menu.render()
   3 <a href="http://127.0.0.1/content/myLocal.html"
   4    class="inactive-menu-item">MyLocalLink</a>

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