[Checkins] SVN: grok/trunk/doc/design/menu.py - added some thoughts about the menu system (very sketchy!)

Christian Theune ct at gocept.com
Mon Dec 11 11:39:56 EST 2006


Log message for revision 71522:
   - added some thoughts about the menu system (very sketchy!)
  

Changed:
  A   grok/trunk/doc/design/menu.py

-=-
Added: grok/trunk/doc/design/menu.py
===================================================================
--- grok/trunk/doc/design/menu.py	2006-12-11 16:38:25 UTC (rev 71521)
+++ grok/trunk/doc/design/menu.py	2006-12-11 16:39:55 UTC (rev 71522)
@@ -0,0 +1,192 @@
+"""megrok.menu
+
+A simple but extensible menu system for Zope 3.
+
+What is a menu?
+
+    For web applications there are two competing design patterns that can be
+    handled under the term 'menu': classic GUI menus and web site navigation.
+
+    The essential difference in those two is the 'status' or 'context' of the
+    menu. In classic GUI applications, a menu is (more or less) stateless,
+    independent of the view to the application that is currently being used.
+
+    In classic web sites, the navigation gives a navigatable overview of the
+    site's hierarchy using an 'active' flag to indicate the user's position in
+    the site.
+
+    In web applications those two concepts start to mix.
+
+    The basic implementation of the menu system takes care of the classic
+    listing of options a user has in a specific context.
+
+    An extension mechanism is used to provide status-annotation to menu items
+    to show where a user currently is.
+
+Design goals:
+
+    -   Simple, central, menu definition without ZCML
+
+    -   Allow submenus.
+
+    -   Make status determination pluggable to allow for application-specific
+        complex scenarios without tainting the menu system.
+
+Menu rendering process:
+
+    -   create set of choices (apply filters in context, permissions, condition)
+
+    -   apply (status) annotations
+
+Determining whether an item is active:
+
+    a) Model based
+
+    - find out which object belongs to the menu item
+
+    - Is this object the same as the context of the menu?
+
+    b) View based
+
+    - find out which view belongs to the menu item
+
+    - Is it the currently published view?
+
+    Generalisation: 
+
+Zope/Grok stuff:
+
+    -   Menus are utilities
+
+Questions:
+
+    -   How to integrate with skin layers?  
+
+    -   Aren't menus just browser views? (context, request)
+
+    -   Two variations: allow menu items to render their HTML, or not? 
+
+        Allow HTML:
+
+            - provides ability to implement various menu item types
+
+            - codes in presentation
+
+        Don't allow HTML:
+
+            - more flexible to customize?
+
+        -> use views on menu items!
+"""
+
+import grok
+from megrok import menu
+
+class AddressBook(grok.Model):
+    pass
+
+class Contact(grok.Model):
+    pass
+
+class EditContact(grok.EditForm):
+    grok.context(Contact)
+    grok.annotation("title", _(u"Edit XY"))
+
+
+layout = grok.PageTemplate("""\
+<html>
+<body>
+
+    <!-- Most simple: Render the whole menu -->
+    <div tal:replace="structure menu/main/@@links"/>
+
+    <!-- Variation 1: Render whole menu as drop down list -->
+    <div tal:replace="structure menu/main/@@dropdown"/>
+
+    <!-- Variation 2: Render menu manually, get each item as link
+    <ul>
+        <li tal:repeat="item menu/main">
+            <a tal:replace="structure item/@@link">
+        </li>
+    </ul>
+
+    <!-- Variation 3: Render menu and items manually 
+    <ul tal:repeat="item menu/main"><a tal:attributes="href item/action" tal:content="item/title"></ul>
+    </ul>
+
+    <!-- Variation 4: Render option elements automatically -->
+    <select>
+        <option tal:repeat="item menu:main" tal:replace="item/@@option">
+    </select>
+
+    <!-- Bind the menu to a different object explicitly -->
+    <div tal:replace="structure python:menu['main'].bind(object1, request)"/>
+    '
+    <!-- Alternative: use a grok variable in the templates: -->
+    <div tal:replace="structure grok/menu/main/context:asdf/"/>
+
+
+
+    <grok:menu 
+</body>
+</html>""")
+
+class IMenuItem(Interface):
+
+    action
+    title
+    submenu
+
+
+main = menu.Menu(
+    menu.View(EditContact),         # Link to a view. Necessary information: context, name
+                                    # Link to a generic action/URL
+    menu.Action(_("External action"), "string:http://${context/"),
+    menu.SubMenu(
+        menu.Item(
+
+
+############ Implementation sketches
+
+class ViewMenuItem(object):
+
+    def __init__(self, view):
+        # View must be a view
+        
+
+class Action(object):
+    
+    def __init__(self, title, target):
+        self.title = title
+        self.target = target    # TALES expression
+
+    def 
+
+
+class BaseMenuItem(object):
+
+    def __init__(self, condition):
+        self.condition = condition
+
+    def checkCondition(context, request):
+        # - does this item apply in the given context?
+        # - does the user have the necessary permissions
+        # - does the user supplied condition evalute to true? 
+    
+
+class Menu(object):
+
+    def __init__(self, menu_items):
+        # XXX assert: All items must be menu items
+        self.menu_items = menu_items
+
+    def __call__(self, context, request):
+        relevant_items = []
+
+        for item in self.menu_items:
+            if not item.checkCondition(context, request):
+                continue
+
+            relevant_item.append(item)
+
+


Property changes on: grok/trunk/doc/design/menu.py
___________________________________________________________________
Name: svn:keywords
   + Id Rev Date
Name: svn:eol-style
   + native



More information about the Checkins mailing list