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.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.region import Region, regions
Browser Views
@ -25,16 +27,12 @@ Browser Views
>>> bodyLayout = Layout()
>>> bodyLayout.renderer = ViewPageTemplateFile('browser/liquid/body.pt').macros['body']
>>> bodyRegion = Region('body')
>>> bodyRegion.layouts.append(LayoutInstance(bodyLayout))
>>> regions['page.body'] = bodyRegion
>>> LayoutInstance(bodyLayout).registerFor('page.body')
>>> standardRenderers = ViewPageTemplateFile('browser/standard.pt').macros
>>> footerLayout = Layout()
>>> footerLayout.renderer = standardRenderers['footer']
>>> footerRegion = Region('footer')
>>> footerRegion.layouts.append(LayoutInstance(footerLayout))
>>> regions['body.footer'] = footerRegion
>>> LayoutInstance(footerLayout).registerFor('body.footer')
>>> from cybertools.composer.layout.browser.view import Page
>>> from zope.publisher.browser import TestRequest

View file

@ -22,15 +22,29 @@ Basic classes for layouts and layout components.
$Id$
"""
from zope import component
from zope.interface import implements
from cybertools.composer.base import Component, Element, Compound
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 IRegion
from cybertools.composer.layout.region import Region
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):
implements(ILayout)
@ -48,21 +62,10 @@ class LayoutInstance(object):
self.template = template
self.context = context
def registerFor(self, regionName):
manager = component.getUtility(ILayoutManager)
manager.register(self, regionName)
@property
def renderer(self):
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"
metal:define-macro="body">
<!--<div id="global">
<div id="global">
<div class="top">
<tal:sub repeat="view view/layouts/logo">
<metal:sub use-macro="view/renderer" /></tal:sub>
@ -11,7 +11,7 @@
</div>
<div id="menu">
<tal:sub repeat="view view/layouts/portlets_left">
<tal:sub repeat="view view/layouts/column1">
<metal:sub use-macro="view/renderer" />
</tal:sub>
</div>
@ -23,10 +23,10 @@
</div>
<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" />
</tal:sub>
</div>-->
</div>
<div id="footer" class="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.app.pagetemplate import ViewPageTemplateFile
from cybertools.composer.layout.region import regions
from cybertools.composer.layout.interfaces import ILayoutManager
class BaseView(object):
@ -64,7 +64,8 @@ class LayoutView(BaseView):
return ViewResources(self)
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):
@ -84,6 +85,8 @@ class ViewLayouts(object):
def __getitem__(self, key):
view = self.view
region = view.getRegion(key)
if region is None:
return []
return [LayoutView(layout, view.request, name=key)
for layout in region.layouts]

View file

@ -33,6 +33,15 @@ from cybertools.composer.interfaces import IInstance
_ = 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):
""" 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'layout instance.')
def registerFor(regionName):
""" Register the layout instance for the region specified.
"""
class IRegion(Interface):
""" 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):
self.name = name
self.layouts = []
regions = {}