work in progress: breadcrumbs

This commit is contained in:
Helmut Merz 2011-11-19 10:19:34 +01:00
parent a42fd38642
commit a2bc7f570d
2 changed files with 29 additions and 10 deletions

View file

@ -18,14 +18,11 @@
""" """
View class for Node objects. View class for Node objects.
$Id$
""" """
from urlparse import urlparse, urlunparse from urlparse import urlparse, urlunparse
from zope import component, interface, schema from zope import component, interface, schema
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.app import zapi
from zope.annotation.interfaces import IAnnotations from zope.annotation.interfaces import IAnnotations
from zope.app.catalog.interfaces import ICatalog from zope.app.catalog.interfaces import ICatalog
from zope.app.container.browser.contents import JustContents from zope.app.container.browser.contents import JustContents
@ -39,8 +36,11 @@ from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent
from zope.lifecycleevent import Attributes from zope.lifecycleevent import Attributes
from zope.formlib.form import Form, FormFields from zope.formlib.form import Form, FormFields
from zope.proxy import removeAllProxies from zope.proxy import removeAllProxies
from zope.publisher.defaultview import getDefaultViewName
from zope.security import canAccess, canWrite, checkPermission from zope.security import canAccess, canWrite, checkPermission
from zope.security.proxy import removeSecurityProxy from zope.security.proxy import removeSecurityProxy
from zope.traversing.api import getParent, getParents, getPath
from zope.traversing.browser import absoluteURL
from cybertools.ajax import innerHtml from cybertools.ajax import innerHtml
from cybertools.browser import configurator from cybertools.browser import configurator
@ -91,6 +91,17 @@ class NodeView(BaseView):
self.recordAccess() self.recordAccess()
return result return result
def breadcrumbs(self):
if not self.globalOptions('showBreadcrumbs'):
return []
menu = self.menu
data = [dict(label=menu.title, url=menu.url)]
menuItem = self.nearestMenuItem
if menuItem != menu.context:
data.append(dict(label=menuItem.title,
url=absoluteURL(menuItem, self.request)))
return data
def recordAccess(self, viewName=''): def recordAccess(self, viewName=''):
target = self.virtualTargetObject target = self.virtualTargetObject
targetUid = target is not None and util.getUidForObject(target) or '' targetUid = target is not None and util.getUidForObject(target) or ''
@ -243,7 +254,7 @@ class NodeView(BaseView):
return u'' return u''
if text.startswith('<'): # seems to be HTML if text.startswith('<'): # seems to be HTML
return text return text
source = zapi.createObject(self.context.contentType, text) source = component.createObject(self.context.contentType, text)
view = component.getMultiAdapter((removeAllProxies(source), self.request)) view = component.getMultiAdapter((removeAllProxies(source), self.request))
return view.render() return view.render()
@ -316,7 +327,7 @@ class NodeView(BaseView):
menu = self.menuObject menu = self.menuObject
parentMenu = None parentMenu = None
while menu is not None: while menu is not None:
parent = zapi.getParent(menu) parent = getParent(menu)
if INode.providedBy(parent): if INode.providedBy(parent):
parentMenu = parent.getMenu() parentMenu = parent.getMenu()
if parentMenu is None or parentMenu is menu: if parentMenu is None or parentMenu is menu:
@ -348,7 +359,7 @@ class NodeView(BaseView):
@Lazy @Lazy
def parents(self): def parents(self):
return zapi.getParents(self.context) return getParents(self.context)
@Lazy @Lazy
def nearestMenuItem(self): def nearestMenuItem(self):
@ -413,7 +424,7 @@ class NodeView(BaseView):
target = self.virtualTargetObject target = self.virtualTargetObject
if target is not None: if target is not None:
# zope.app.publisher.browser # zope.app.publisher.browser
name = zapi.getDefaultViewName(target, self.request) name = getDefaultViewName(target, self.request)
return self.targetView(name) return self.targetView(name)
return u'' return u''
@ -732,8 +743,8 @@ class ConfigureView(NodeView):
container = type.defaultContainer container = type.defaultContainer
name = form.get('create.name', '') name = form.get('create.name', '')
if not name: if not name:
viewManagerPath = zapi.getPath(root.getViewManager()) viewManagerPath = getPath(root.getViewManager())
name = zapi.getPath(self.context)[len(viewManagerPath)+1:] name = getPath(self.context)[len(viewManagerPath)+1:]
name = name.replace('/', '.') name = name.replace('/', '.')
# check for duplicates: # check for duplicates:
num = 1 num = 1
@ -850,7 +861,7 @@ class NodeViewConfigurator(configurator.AnnotationViewConfigurator):
@property @property
def viewProperties(self): def viewProperties(self):
result = [] result = []
for p in list(reversed(zapi.getParents(self.context))) + [self.context]: for p in list(reversed(getParents(self.context))) + [self.context]:
if not INode.providedBy(p) or p.nodeType != 'menu': if not INode.providedBy(p) or p.nodeType != 'menu':
continue continue
ann = IAnnotations(p) ann = IAnnotations(p)

View file

@ -26,6 +26,14 @@
<div id="content" class="span-6" <div id="content" class="span-6"
metal:define-macro="content"> metal:define-macro="content">
<metal:breadcrumbs define-slot="breadcrumbs">
<div tal:define="crumbs view/breadcrumbs"
tal:condition="crumbs">
<span tal:repeat="crumb crumbs">
<a tal:attributes="href crumb/url"
tal:content="crumb/label" />
<span tal:condition="not:repeat/crumb/end"> / </span></span>
</div></metal:breadcrumbs>
<div metal:define-slot="actions"></div> <div metal:define-slot="actions"></div>
<div metal:define-slot="message"></div> <div metal:define-slot="message"></div>
<metal:content define-slot="content"> <metal:content define-slot="content">