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