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:
helmutm 2008-07-31 13:31:29 +00:00
parent 3c3d635493
commit 2bd4149058
6 changed files with 46 additions and 32 deletions

View file

@ -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

View file

@ -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 []

View file

@ -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">

View file

@ -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]

View file

@ -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.

View file

@ -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 = {}