work in progress: layout management: repurpose layout instance; provide page (top-level view) that in turn invokes a top-level layout view

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2785 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-07-31 16:07:54 +00:00
parent 2bd4149058
commit ba8a12110b
6 changed files with 54 additions and 75 deletions

View file

@ -19,24 +19,26 @@ Browser Views
>>> from zope.traversing.adapters import DefaultTraversable >>> from zope.traversing.adapters import DefaultTraversable
>>> component.provideAdapter(DefaultTraversable, (Interface,)) >>> component.provideAdapter(DefaultTraversable, (Interface,))
>>> from cybertools.composer.layout.browser.layout import PageLayout
>>> pageLayout = PageLayout()
>>> pageLayoutInstance = LayoutInstance(pageLayout)
>>> from zope.app.pagetemplate import ViewPageTemplateFile >>> from zope.app.pagetemplate import ViewPageTemplateFile
>>> #pageLayout = Layout()
>>> #pageLayout.renderer = ViewPageTemplateFile('browser/main.pt').macros['page']
>>> bodyLayout = Layout() >>> bodyLayout = Layout()
>>> bodyLayout.renderer = ViewPageTemplateFile('browser/liquid/body.pt').macros['body'] >>> bodyLayout.renderer = ViewPageTemplateFile('browser/liquid/body.pt').macros['body']
>>> LayoutInstance(bodyLayout).registerFor('page.body') >>> bodyLayout.registerFor('page.body')
>>> standardRenderers = ViewPageTemplateFile('browser/standard.pt').macros
>>> footerLayout = Layout() >>> footerLayout = Layout()
>>> standardRenderers = ViewPageTemplateFile('browser/standard.pt').macros
>>> footerLayout.renderer = standardRenderers['footer'] >>> footerLayout.renderer = standardRenderers['footer']
>>> LayoutInstance(footerLayout).registerFor('body.footer') >>> footerLayout.registerFor('body.footer')
>>> 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
>>> page = Page(pageLayoutInstance, TestRequest()) >>> #instance = LayoutInstance(None)
>>> #instance.template = pageLayout
>>> #page = Page(instance, TestRequest())
>>> page = Page(None, TestRequest())
>>> page() >>> page()
u'<!DOCTYPE ...>...<html ...>...</html>... u'<!DOCTYPE ...>...<html ...>...</html>...

View file

@ -49,22 +49,23 @@ class Layout(Template):
implements(ILayout) implements(ILayout)
name = u'' name = ''
manager = None manager = None
renderer = None renderer = None
def registerFor(self, regionName):
manager = component.getUtility(ILayoutManager)
manager.register(self, regionName)
class LayoutInstance(object): class LayoutInstance(object):
implements(ILayoutInstance) implements(ILayoutInstance)
def __init__(self, template, context=None): template = None
self.template = template
self.context = context
def registerFor(self, regionName): def __init__(self, context):
manager = component.getUtility(ILayoutManager) self.context = context
manager.register(self, regionName)
@property @property
def renderer(self): def renderer(self):

View file

@ -1,37 +0,0 @@
#
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Specialized browser layouts.
$Id$
"""
from zope.app.pagetemplate import ViewPageTemplateFile
from cybertools.composer.layout.base import Layout
class PageLayout(Layout):
name = u'page'
@property
def renderer(self):
return ViewPageTemplateFile('main.pt').macros['page']

View file

@ -27,6 +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.base import Layout, LayoutInstance
from cybertools.composer.layout.interfaces import ILayoutManager from cybertools.composer.layout.interfaces import ILayoutManager
@ -47,13 +48,32 @@ class BaseView(object):
return self.template(self) return self.template(self)
class Page(BaseView):
def __call__(self):
layout = Layout()
layout.renderer = ViewPageTemplateFile('main.pt').macros['page']
instance = LayoutInstance(self.context)
instance.template = layout
view = LayoutView(instance, self.request, name='page')
view.body = view.layouts['body'][0]
return view.template(view)
class LayoutView(BaseView): class LayoutView(BaseView):
name = 'base' name = 'base'
@Lazy
def client(self):
return self.context.context
@Lazy @Lazy
def renderer(self): def renderer(self):
return self.context.renderer renderer = self.context.renderer
if renderer is None:
raise ValueError('No renderer found for %r.' % self.context)
return renderer
@Lazy @Lazy
def layouts(self): def layouts(self):
@ -68,14 +88,7 @@ class LayoutView(BaseView):
return manager.regions.get('.'.join((self.name, key))) return manager.regions.get('.'.join((self.name, key)))
class Page(LayoutView): # subview providers
name = 'page'
#@Lazy
def body(self):
return self.layouts['body'][0]()
class ViewLayouts(object): class ViewLayouts(object):
@ -87,8 +100,13 @@ class ViewLayouts(object):
region = view.getRegion(key) region = view.getRegion(key)
if region is None: if region is None:
return [] return []
return [LayoutView(layout, view.request, name=key) subviews = []
for layout in region.layouts] for layout in region.layouts:
instance = LayoutInstance(view.client)
instance.template = layout
instance.view = view
subviews.append(LayoutView(instance, view.request, name=key))
return subviews
class ViewResources(object): class ViewResources(object):

View file

@ -38,7 +38,7 @@ class ILayoutManager(Interface):
""" """
def register(layout, regionName): def register(layout, regionName):
""" Register the layout instance given for the region specified. """ Register the layout given for the region specified.
""" """
@ -66,6 +66,10 @@ class ILayout(ITemplate):
renderer = Attribute(u'An object responsible for rendering the layout.') renderer = Attribute(u'An object responsible for rendering the layout.')
def registerFor(regionName):
""" Register the layout for the region specified.
"""
class ILayoutComponent(IComponent): class ILayoutComponent(IComponent):
""" May be used for data entry or display. """ May be used for data entry or display.
@ -96,15 +100,6 @@ class ILayoutInstance(IInstance):
renderer = Attribute(u'An object responsible for rendering the layout.') renderer = Attribute(u'An object responsible for rendering the layout.')
componentAttributes = Attribute(u'A mapping``{componentName: value, ...}`` '
u'specifying the parameter values entered for the components. '
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): 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.
@ -118,4 +113,4 @@ class IRegion(Interface):
value_type=schema.ASCIILine(), value_type=schema.ASCIILine(),
required=False,) required=False,)
layouts = Attribute(u'The layout instances currently assigned to this region.') layouts = Attribute(u'The layouts currently assigned to this region.')

View file

@ -17,7 +17,7 @@
# #
""" """
Region class(es) + default regions registry. Region implementation.
$Id$ $Id$
""" """