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.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
|
||||
|
|
|
@ -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 []
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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]
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -36,6 +36,3 @@ class Region(object):
|
|||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.layouts = []
|
||||
|
||||
|
||||
regions = {}
|
||||
|
|
Loading…
Add table
Reference in a new issue