work in progress: breadcrumbs
This commit is contained in:
parent
a42fd38642
commit
a2bc7f570d
2 changed files with 29 additions and 10 deletions
|
@ -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)
|
||||||
|
|
|
@ -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">
|
||||||
|
|
Loading…
Add table
Reference in a new issue