work in progress: layout management: delegate management of layouts and regions to a layout manager utility
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2784 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									3c3d635493
								
							
						
					
					
						commit
						2bd4149058
					
				
					 6 changed files with 46 additions and 32 deletions
				
			
		|  | @ -7,8 +7,10 @@ Layout Management | ||||||
|   >>> from zope import component |   >>> from zope import component | ||||||
|   >>> from zope.interface import Interface |   >>> from zope.interface import Interface | ||||||
| 
 | 
 | ||||||
|  |   >>> from cybertools.composer.layout.base import LayoutManager | ||||||
|  |   >>> component.provideUtility(LayoutManager()) | ||||||
|  | 
 | ||||||
|   >>> from cybertools.composer.layout.base import Layout, LayoutInstance |   >>> from cybertools.composer.layout.base import Layout, LayoutInstance | ||||||
|   >>> from cybertools.composer.layout.region import Region, regions |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| Browser Views | Browser Views | ||||||
|  | @ -25,16 +27,12 @@ Browser Views | ||||||
| 
 | 
 | ||||||
|   >>> bodyLayout = Layout() |   >>> bodyLayout = Layout() | ||||||
|   >>> bodyLayout.renderer = ViewPageTemplateFile('browser/liquid/body.pt').macros['body'] |   >>> bodyLayout.renderer = ViewPageTemplateFile('browser/liquid/body.pt').macros['body'] | ||||||
|   >>> bodyRegion = Region('body') |   >>> LayoutInstance(bodyLayout).registerFor('page.body') | ||||||
|   >>> bodyRegion.layouts.append(LayoutInstance(bodyLayout)) |  | ||||||
|   >>> regions['page.body'] = bodyRegion |  | ||||||
| 
 | 
 | ||||||
|   >>> standardRenderers = ViewPageTemplateFile('browser/standard.pt').macros |   >>> standardRenderers = ViewPageTemplateFile('browser/standard.pt').macros | ||||||
|   >>> footerLayout = Layout() |   >>> footerLayout = Layout() | ||||||
|   >>> footerLayout.renderer = standardRenderers['footer'] |   >>> footerLayout.renderer = standardRenderers['footer'] | ||||||
|   >>> footerRegion = Region('footer') |   >>> LayoutInstance(footerLayout).registerFor('body.footer') | ||||||
|   >>> footerRegion.layouts.append(LayoutInstance(footerLayout)) |  | ||||||
|   >>> regions['body.footer'] = footerRegion |  | ||||||
| 
 | 
 | ||||||
|   >>> from cybertools.composer.layout.browser.view import Page |   >>> from cybertools.composer.layout.browser.view import Page | ||||||
|   >>> from zope.publisher.browser import TestRequest |   >>> from zope.publisher.browser import TestRequest | ||||||
|  |  | ||||||
|  | @ -22,15 +22,29 @@ Basic classes for layouts and layout components. | ||||||
| $Id$ | $Id$ | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
|  | from zope import component | ||||||
| from zope.interface import implements | from zope.interface import implements | ||||||
| 
 | 
 | ||||||
| from cybertools.composer.base import Component, Element, Compound | from cybertools.composer.base import Component, Element, Compound | ||||||
| from cybertools.composer.base import Template | from cybertools.composer.base import Template | ||||||
|  | from cybertools.composer.layout.interfaces import ILayoutManager | ||||||
| from cybertools.composer.layout.interfaces import ILayout, ILayoutInstance | from cybertools.composer.layout.interfaces import ILayout, ILayoutInstance | ||||||
| from cybertools.composer.layout.interfaces import IRegion | from cybertools.composer.layout.region import Region | ||||||
| from cybertools.util.jeep import Jeep | from cybertools.util.jeep import Jeep | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class LayoutManager(object): | ||||||
|  | 
 | ||||||
|  |     implements(ILayoutManager) | ||||||
|  | 
 | ||||||
|  |     def __init__(self): | ||||||
|  |         self.regions = {} | ||||||
|  | 
 | ||||||
|  |     def register(self, layout, regionName): | ||||||
|  |         region = self.regions.setdefault(regionName, Region(regionName)) | ||||||
|  |         region.layouts.append(layout) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class Layout(Template): | class Layout(Template): | ||||||
| 
 | 
 | ||||||
|     implements(ILayout) |     implements(ILayout) | ||||||
|  | @ -48,21 +62,10 @@ class LayoutInstance(object): | ||||||
|         self.template = template |         self.template = template | ||||||
|         self.context = context |         self.context = context | ||||||
| 
 | 
 | ||||||
|  |     def registerFor(self, regionName): | ||||||
|  |         manager = component.getUtility(ILayoutManager) | ||||||
|  |         manager.register(self, regionName) | ||||||
|  | 
 | ||||||
|     @property |     @property | ||||||
|     def renderer(self): |     def renderer(self): | ||||||
|         return self.template.renderer |         return self.template.renderer | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class Region(object): |  | ||||||
| 
 |  | ||||||
|     implements(IRegion) |  | ||||||
| 
 |  | ||||||
|     allowedLayoutCategories = None |  | ||||||
| 
 |  | ||||||
|     def __init__(self, name): |  | ||||||
|         self.name = name |  | ||||||
| 
 |  | ||||||
|     @property |  | ||||||
|     def layouts(self): |  | ||||||
|         return [] |  | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| <body class="tundra" | <body class="tundra" | ||||||
|       metal:define-macro="body"> |       metal:define-macro="body"> | ||||||
| 
 | 
 | ||||||
|     <!--<div id="global"> |     <div id="global"> | ||||||
|       <div class="top"> |       <div class="top"> | ||||||
|         <tal:sub repeat="view view/layouts/logo"> |         <tal:sub repeat="view view/layouts/logo"> | ||||||
|           <metal:sub use-macro="view/renderer" /></tal:sub> |           <metal:sub use-macro="view/renderer" /></tal:sub> | ||||||
|  | @ -11,7 +11,7 @@ | ||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
|     <div id="menu"> |     <div id="menu"> | ||||||
|         <tal:sub repeat="view view/layouts/portlets_left"> |         <tal:sub repeat="view view/layouts/column1"> | ||||||
|           <metal:sub use-macro="view/renderer" /> |           <metal:sub use-macro="view/renderer" /> | ||||||
|         </tal:sub> |         </tal:sub> | ||||||
|     </div> |     </div> | ||||||
|  | @ -23,10 +23,10 @@ | ||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
|     <div id="sub-section"> |     <div id="sub-section"> | ||||||
|         <tal:sub repeat="view view/layouts/portlets_right"> |         <tal:sub repeat="view view/layouts/column2"> | ||||||
|           <metal:sub use-macro="view/renderer" /> |           <metal:sub use-macro="view/renderer" /> | ||||||
|         </tal:sub> |         </tal:sub> | ||||||
|     </div>--> |     </div> | ||||||
| 
 | 
 | ||||||
|     <div id="footer" class="footer"> |     <div id="footer" class="footer"> | ||||||
|         <tal:sub repeat="view view/layouts/footer"> |         <tal:sub repeat="view view/layouts/footer"> | ||||||
|  |  | ||||||
|  | @ -27,7 +27,7 @@ from zope.interface import Interface, implements | ||||||
| from zope.cachedescriptors.property import Lazy | from zope.cachedescriptors.property import Lazy | ||||||
| from zope.app.pagetemplate import ViewPageTemplateFile | from zope.app.pagetemplate import ViewPageTemplateFile | ||||||
| 
 | 
 | ||||||
| from cybertools.composer.layout.region import regions | from cybertools.composer.layout.interfaces import ILayoutManager | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class BaseView(object): | class BaseView(object): | ||||||
|  | @ -64,7 +64,8 @@ class LayoutView(BaseView): | ||||||
|         return ViewResources(self) |         return ViewResources(self) | ||||||
| 
 | 
 | ||||||
|     def getRegion(self, key): |     def getRegion(self, key): | ||||||
|         return regions['.'.join((self.name, key))] |         manager = component.getUtility(ILayoutManager) | ||||||
|  |         return manager.regions.get('.'.join((self.name, key))) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Page(LayoutView): | class Page(LayoutView): | ||||||
|  | @ -84,6 +85,8 @@ class ViewLayouts(object): | ||||||
|     def __getitem__(self, key): |     def __getitem__(self, key): | ||||||
|         view = self.view |         view = self.view | ||||||
|         region = view.getRegion(key) |         region = view.getRegion(key) | ||||||
|  |         if region is None: | ||||||
|  |             return [] | ||||||
|         return [LayoutView(layout, view.request, name=key) |         return [LayoutView(layout, view.request, name=key) | ||||||
|                 for layout in region.layouts] |                 for layout in region.layouts] | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -33,6 +33,15 @@ from cybertools.composer.interfaces import IInstance | ||||||
| _ = MessageFactory('cybertools.composer') | _ = MessageFactory('cybertools.composer') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class ILayoutManager(Interface): | ||||||
|  |     """ A utility that manages layouts and regions. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def register(layout, regionName): | ||||||
|  |         """ Register the layout instance given for the region specified. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class ILayout(ITemplate): | class ILayout(ITemplate): | ||||||
|     """ Represents an ordered sequence of layout elements. |     """ Represents an ordered sequence of layout elements. | ||||||
|     """ |     """ | ||||||
|  | @ -92,6 +101,10 @@ class ILayoutInstance(IInstance): | ||||||
|                     u'If a component is a layout the value is a corresponding ' |                     u'If a component is a layout the value is a corresponding ' | ||||||
|                     u'layout instance.') |                     u'layout instance.') | ||||||
| 
 | 
 | ||||||
|  |     def registerFor(regionName): | ||||||
|  |         """ Register the layout instance for the region specified. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class IRegion(Interface): | class IRegion(Interface): | ||||||
|     """ A part of a layout "canvas" that may be filled with layout objects. |     """ A part of a layout "canvas" that may be filled with layout objects. | ||||||
|  |  | ||||||
|  | @ -36,6 +36,3 @@ class Region(object): | ||||||
|     def __init__(self, name): |     def __init__(self, name): | ||||||
|         self.name = name |         self.name = name | ||||||
|         self.layouts = [] |         self.layouts = [] | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| regions = {} |  | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm