<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF xmlns="http://usefulinc.com/ns/doap#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Project><name>z3c.menu.simple</name>
<shortdesc>A simple menu system for Zope3</shortdesc>
<description>This package provides a simple menu implementation based on viewlets.


Detailed Documentation
**********************

===========
Simple Menu
===========

The ``z3c.menu.simple`` package provides a simple menu implementation which
allows you to implement simply menus based on content providers and viewlets.

Right now there are some ``SimpleMenuItem`` menu item implementations and
a tabbed menu with tab/tab-item and action/action-item located in this
package.

Let's see what this means.


ContextMenu
-----------

  &gt;&gt;&gt; from zope.viewlet.interfaces import IViewlet
  &gt;&gt;&gt; from zope.viewlet.interfaces import IViewletManager

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

  &gt;&gt;&gt; class IMenu(IViewletManager):
  ...     """Menu viewlet manager."""

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

  &gt;&gt;&gt; from zope.viewlet import manager
  &gt;&gt;&gt; Menu = manager.ViewletManager('left', IMenu)

Now we have to define a context:

  &gt;&gt;&gt; import zope.interface
  &gt;&gt;&gt; from zope.app.container import contained
  &gt;&gt;&gt; from zope.app.container.interfaces import IContained
  &gt;&gt;&gt; class Content(contained.Contained):
  ...     zope.interface.implements(IContained)
  &gt;&gt;&gt; root['content'] = Content()
  &gt;&gt;&gt; content = root['content']

  &gt;&gt;&gt; from zope.publisher.browser import TestRequest
  &gt;&gt;&gt; request = TestRequest()

  &gt;&gt;&gt; from zope.publisher.interfaces.browser import IBrowserView
  &gt;&gt;&gt; class View(contained.Contained):
  ...     zope.interface.implements(IBrowserView)
  ...     def __init__(self, context, request):
  ...         self.__parent__ = context
  ...         self.context = context
  ...         self.request = request
  &gt;&gt;&gt; view = View(content, request)

  &gt;&gt;&gt; menu = Menu(content, request, view)

So initially no menu get rendered:

  &gt;&gt;&gt; menu.update()
  &gt;&gt;&gt; menu.render()
  u''

But now we register a context menu item for the `IMenu`:

  &gt;&gt;&gt; import zope.component
  &gt;&gt;&gt; from zope.publisher.interfaces.browser import IDefaultBrowserLayer

  &gt;&gt;&gt; from z3c.menu.simple.menu import ContextMenuItem
  &gt;&gt;&gt; class MyLocalLink(ContextMenuItem):
  ...
  ...     __name__ = u'MyLocalLink'
  ...     urlEndings = 'myLocal.html'
  ...     viewURL = 'myLocal.html'

  &gt;&gt;&gt; # Create a security checker for viewlets.
  &gt;&gt;&gt; from zope.security.checker import NamesChecker, defineChecker
  &gt;&gt;&gt; viewletChecker = NamesChecker(('update', 'render'))
  &gt;&gt;&gt; defineChecker(MyLocalLink, viewletChecker)

  &gt;&gt;&gt; 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:

  &gt;&gt;&gt; menu.update()
  &gt;&gt;&gt; print menu.render()
  &lt;a href="http://127.0.0.1/content/myLocal.html"
     class="inactive-menu-item"&gt;MyLocalLink&lt;/a&gt;


GlobalMenu
----------

  &gt;&gt;&gt; from z3c.menu.simple.menu import GlobalMenuItem
  &gt;&gt;&gt; class MyGlobalLink(GlobalMenuItem):
  ...
  ...     __name__ = u'MyGlobalLink'
  ...     urlEndings = 'myGlobal.html'
  ...     viewURL = 'myGlobal.html'

  &gt;&gt;&gt; defineChecker(MyGlobalLink, viewletChecker)

  &gt;&gt;&gt; zope.component.provideAdapter(
  ...     MyGlobalLink,
  ...     (zope.interface.Interface, IDefaultBrowserLayer,
  ...     IBrowserView, IMenu),
  ...     IViewlet, name='MyGlobalLink')

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

  &gt;&gt;&gt; menu.update()
  &gt;&gt;&gt; print menu.render()
  &lt;a href="http://127.0.0.1/myGlobal.html"
     class="inactive-menu-item"&gt;MyGlobalLink&lt;/a&gt;
  &lt;a href="http://127.0.0.1/content/myLocal.html"
     class="inactive-menu-item"&gt;MyLocalLink&lt;/a&gt;


TabbedMenu
----------

Now we create a tabbed menu called MasterMenu:

  &gt;&gt;&gt; class IMasterMenu(IViewletManager):
  ...     """Master menu viewlet manager."""

Let's create a viewlet manager using this interface and the TabMenu as base
class:

  &gt;&gt;&gt; from z3c.menu.simple.menu import TabMenu
  &gt;&gt;&gt; MasterMenu = manager.ViewletManager('masterMenu', IMasterMenu,
  ...                                     bases=(TabMenu,))

We use the same context, request and view like before:

  &gt;&gt;&gt; masterMenu = MasterMenu(content, request, view)

So initially no menu get rendered:

  &gt;&gt;&gt; masterMenu.update()
  &gt;&gt;&gt; masterMenu.render()
  u''

Now we register a menu tab which is also a viewlet manager:

  &gt;&gt;&gt; from zope.app.pagetemplate import viewpagetemplatefile
  &gt;&gt;&gt; from z3c.menu.simple import ITab
  &gt;&gt;&gt; from z3c.menu.simple.menu import Tab
  &gt;&gt;&gt; class MyTabs(Tab):
  ...     template = viewpagetemplatefile.ViewPageTemplateFile('tab.pt')
  &gt;&gt;&gt; myTabs = MyTabs(content, request, view)

Also here, initially no tab get rendered:

  &gt;&gt;&gt; myTabs.update()
  &gt;&gt;&gt; myTabs.render()
  u''

Now we register a menu action which is also a viewlet manager:

  &gt;&gt;&gt; from z3c.menu.simple import IAction
  &gt;&gt;&gt; from z3c.menu.simple.menu import Action
  &gt;&gt;&gt; class MyActions(Action):
  ...     template = viewpagetemplatefile.ViewPageTemplateFile('action.pt')
  &gt;&gt;&gt; myActions = MyActions(content, request, view)

Also here, initially no tab get rendered:

  &gt;&gt;&gt; myActions.update()
  &gt;&gt;&gt; myActions.render()
  u''

After setup the `TabMenu`, `Tab` and `Action` viewlet managers, we start to
register a tab menu item:

  &gt;&gt;&gt; from z3c.menu.simple.menu import TabItem
  &gt;&gt;&gt; class MyTab(TabItem):
  ...
  ...     __name__ = u'MyTab'
  ...     url = 'myTab.html'
  ...     selectedViewNames = ['myTab.html']

  &gt;&gt;&gt; tabChecker = NamesChecker(('update', 'render', 'css', 'selected'))
  &gt;&gt;&gt; defineChecker(MyTab, tabChecker)

  &gt;&gt;&gt; zope.component.provideAdapter(
  ...     MyTab,
  ...     (zope.interface.Interface, IDefaultBrowserLayer,
  ...     IBrowserView, ITab),
  ...     IViewlet, name='MyTab')

Now see what we get if the tab viewlet manager get rendered:

  &gt;&gt;&gt; myTabs.update()
  &gt;&gt;&gt; print myTabs.render()
  &lt;div class="tabMenu"&gt;
    &lt;span class="inactive-menu-item"&gt;
    &lt;a href="myTab.html"&gt;MyTab&lt;/a&gt;
  &lt;/span&gt;
  &lt;/div&gt;

After showing how a tab menu item get used, we will register a menu action
item.

  &gt;&gt;&gt; from z3c.menu.simple.menu import ActionItem
  &gt;&gt;&gt; class MyAction(ActionItem):
  ...
  ...     __name__ = u'MyAction'
  ...     title = 'myAction'

  &gt;&gt;&gt; actionChecker = NamesChecker(('update', 'render', 'title'))
  &gt;&gt;&gt; defineChecker(MyAction, actionChecker)

  &gt;&gt;&gt; zope.component.provideAdapter(
  ...     MyAction,
  ...     (zope.interface.Interface, IDefaultBrowserLayer,
  ...     IBrowserView, IAction),
  ...     IViewlet, name='MyAction')

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

  &gt;&gt;&gt; myActions.update()
  &gt;&gt;&gt; print myActions.render()
  &lt;div class="actionMenuWrapper"&gt;
    &lt;ul class="actionMenu"&gt;
      &lt;li class="inactive-menu-item"&gt;
        &lt;a href=""&gt;
          &lt;div&gt;myAction&lt;/div&gt;
        &lt;/a&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
  &lt;div class="clearActionMenu" /&gt;


=======
CHANGES
=======

0.5.1dev (unreleased)
---------------------

- Bug: Updated meta-data and documentation.


0.5.0 (2008-01-21)
------------------

- Initial Release</description>
<homepage rdf:resource="http://pypi.python.org/pypi/z3c.menu.simple" />
<maintainer><foaf:Person><foaf:name>Stephan Richter, Roger Ineichen and the Zope Community</foaf:name>
<foaf:mbox_sha1sum>2a5d53de05a9e41953ed1826447b07e9a7fa1525</foaf:mbox_sha1sum></foaf:Person></maintainer>
<release><Version><revision>0.5.1</revision></Version></release>
</Project></rdf:RDF>