{ "info": { "author": "Stephan Richter, Roger Ineichen and the Zope Community", "author_email": "zope-dev@zope.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Zope3", "Intended Audience :: Developers", "License :: OSI Approved :: Zope Public License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP" ], "description": "This package provides a simple menu implementation based on viewlets.\n\n\n.. contents ::\n\n===========\nSimple Menu\n===========\n\nThe ``z3c.menu.simple`` package provides a simple menu implementation which\nallows you to implement simply menus based on content providers and viewlets.\n\nRight now there are some ``SimpleMenuItem`` menu item implementations and\na tabbed menu with tab/tab-item and action/action-item located in this\npackage.\n\nLet's see what this means.\n\n\nContextMenu\n-----------\n\n >>> from zope.viewlet.interfaces import IViewlet\n >>> from zope.viewlet.interfaces import IViewletManager\n\nLet's create a menu which means we define a viewlet manager interface:\n\n >>> class IMenu(IViewletManager):\n ... \"\"\"Menu viewlet manager.\"\"\"\n\nYou can then create a viewlet manager using this interface now:\n\n >>> from zope.viewlet import manager\n >>> Menu = manager.ViewletManager('left', IMenu)\n\nNow we have to define a context:\n\n >>> import zope.interface\n >>> from zope.app.container import contained\n >>> from zope.app.container.interfaces import IContained\n >>> class Content(contained.Contained):\n ... zope.interface.implements(IContained)\n >>> root['content'] = Content()\n >>> content = root['content']\n\n >>> from zope.publisher.browser import TestRequest\n >>> request = TestRequest()\n\n >>> from zope.publisher.interfaces.browser import IBrowserView\n >>> class View(contained.Contained):\n ... zope.interface.implements(IBrowserView)\n ... def __init__(self, context, request):\n ... self.__parent__ = context\n ... self.context = context\n ... self.request = request\n >>> view = View(content, request)\n\n >>> menu = Menu(content, request, view)\n\nSo initially no menu get rendered:\n\n >>> menu.update()\n >>> menu.render()\n u''\n\nBut now we register a context menu item for the `IMenu`:\n\n >>> import zope.component\n >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer\n\n >>> from z3c.menu.simple.menu import ContextMenuItem\n >>> class MyLocalLink(ContextMenuItem):\n ...\n ... __name__ = u'MyLocalLink'\n ... urlEndings = 'myLocal.html'\n ... viewURL = 'myLocal.html'\n\n >>> # Create a security checker for viewlets.\n >>> from zope.security.checker import NamesChecker, defineChecker\n >>> viewletChecker = NamesChecker(('update', 'render'))\n >>> defineChecker(MyLocalLink, viewletChecker)\n\n >>> zope.component.provideAdapter(\n ... MyLocalLink,\n ... (zope.interface.Interface, IDefaultBrowserLayer,\n ... IBrowserView, IMenu),\n ... IViewlet, name='MyLocalLink')\n\nNow see what we get if the IMenu viewlet manager get used:\n\n >>> menu.update()\n >>> print menu.render()\n MyLocalLink\n\n\nGlobalMenu\n----------\n\n >>> from z3c.menu.simple.menu import GlobalMenuItem\n >>> class MyGlobalLink(GlobalMenuItem):\n ...\n ... __name__ = u'MyGlobalLink'\n ... urlEndings = 'myGlobal.html'\n ... viewURL = 'myGlobal.html'\n\n >>> defineChecker(MyGlobalLink, viewletChecker)\n\n >>> zope.component.provideAdapter(\n ... MyGlobalLink,\n ... (zope.interface.Interface, IDefaultBrowserLayer,\n ... IBrowserView, IMenu),\n ... IViewlet, name='MyGlobalLink')\n\nNow see what we get if the IMenu viewlet manager get used:\n\n >>> menu.update()\n >>> print menu.render()\n MyGlobalLink\n MyLocalLink\n\n\nTabbedMenu\n----------\n\nNow we create a tabbed menu called MasterMenu:\n\n >>> class IMasterMenu(IViewletManager):\n ... \"\"\"Master menu viewlet manager.\"\"\"\n\nLet's create a viewlet manager using this interface and the TabMenu as base\nclass:\n\n >>> from z3c.menu.simple.menu import TabMenu\n >>> MasterMenu = manager.ViewletManager('masterMenu', IMasterMenu,\n ... bases=(TabMenu,))\n\nWe use the same context, request and view like before:\n\n >>> masterMenu = MasterMenu(content, request, view)\n\nSo initially no menu get rendered:\n\n >>> masterMenu.update()\n >>> masterMenu.render()\n u''\n\nNow we register a menu tab which is also a viewlet manager:\n\n >>> from zope.browserpage import viewpagetemplatefile\n >>> from z3c.menu.simple import ITab\n >>> from z3c.menu.simple.menu import Tab\n >>> class MyTabs(Tab):\n ... template = viewpagetemplatefile.ViewPageTemplateFile('tab.pt')\n >>> myTabs = MyTabs(content, request, view)\n\nAlso here, initially no tab get rendered:\n\n >>> myTabs.update()\n >>> myTabs.render()\n u''\n\nNow we register a menu action which is also a viewlet manager:\n\n >>> from z3c.menu.simple import IAction\n >>> from z3c.menu.simple.menu import Action\n >>> class MyActions(Action):\n ... template = viewpagetemplatefile.ViewPageTemplateFile('action.pt')\n >>> myActions = MyActions(content, request, view)\n\nAlso here, initially no tab get rendered:\n\n >>> myActions.update()\n >>> myActions.render()\n u''\n\nAfter setup the `TabMenu`, `Tab` and `Action` viewlet managers, we start to\nregister a tab menu item:\n\n >>> from z3c.menu.simple.menu import TabItem\n >>> class MyTab(TabItem):\n ...\n ... __name__ = u'MyTab'\n ... url = 'myTab.html'\n ... selectedViewNames = ['myTab.html']\n\n >>> tabChecker = NamesChecker(('update', 'render', 'css', 'selected'))\n >>> defineChecker(MyTab, tabChecker)\n\n >>> zope.component.provideAdapter(\n ... MyTab,\n ... (zope.interface.Interface, IDefaultBrowserLayer,\n ... IBrowserView, ITab),\n ... IViewlet, name='MyTab')\n\nNow see what we get if the tab viewlet manager get rendered:\n\n >>> myTabs.update()\n >>> print myTabs.render()\n