'''z3c.menu.simple - Простые меню на базе вьюлетов''' <> = Простое меню = Пакет ''z3c.menu.simple'' предоставляет простую реализацию меню, которая позволяет создавать простые меню на базе контент провайдеров и вьюлетов. На данный момент в пакете присутствует несколько реализаций пунктов меню '''!SimpleMenuItem''', а также меню в форме закладок. Давайте рассмотрим более детально, что все это значит. == Контекстное меню (ContextMenu) == {{{#!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 MyLocalLink }}} == Глобальное меню (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 MyGlobalLink MyLocalLink }}} == Меню в форме закладок == Теперь создадим меню в форме закладок с именем '''!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
MyTab
}}} После того, как вы увидели, как использовать пункт меню в форме закладки, давайте зарегистрируем действие. {{{#!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
}}}