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