work in progress: layout composer

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2889 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-09-18 10:14:56 +00:00
parent d83b3ab5c6
commit 7793462e9a
6 changed files with 80 additions and 22 deletions

View file

@ -8,10 +8,11 @@ Layout Management
>>> from zope.interface import Interface >>> from zope.interface import Interface
>>> from cybertools.composer.layout.base import LayoutManager >>> from cybertools.composer.layout.base import LayoutManager
>>> component.provideUtility(LayoutManager()) >>> manager = LayoutManager()
>>> component.provideUtility(manager)
>>> from cybertools.composer.layout.base import Layout, LayoutInstance >>> from zope.traversing.adapters import DefaultTraversable
>>> from cybertools.composer.layout.browser.liquid.default import BodyLayout >>> component.provideAdapter(DefaultTraversable, (Interface,))
Browser Views Browser Views
@ -20,19 +21,19 @@ Browser Views
>>> from zope.app.pagetemplate import ViewPageTemplateFile >>> from zope.app.pagetemplate import ViewPageTemplateFile
>>> standardRenderers = ViewPageTemplateFile('browser/standard.pt').macros >>> standardRenderers = ViewPageTemplateFile('browser/standard.pt').macros
>>> from zope.traversing.adapters import DefaultTraversable >>> from cybertools.composer.layout.base import Layout
>>> component.provideAdapter(DefaultTraversable, (Interface,)) >>> from cybertools.composer.layout.interfaces import ILayout
>>> css = Layout() # ResourceCollection() >>> #css = Layout('page.css', renderer=standardRenderers['css'])
>>> css.renderer = standardRenderers['css'] # resourceRenderers['css'] >>> # css = ResourceCollection('css', resourceRenderers['css'])
>>> css.registerFor('page.css') >>> #component.provideUtility(css, ILayout, name='css')
>>> from cybertools.composer.layout.browser.liquid.default import BodyLayout
>>> bodyLayout = BodyLayout() >>> bodyLayout = BodyLayout()
>>> bodyLayout.registerFor('page.body') >>> component.provideUtility(bodyLayout, ILayout, name='body.liquid')
>>> footerLayout = Layout() >>> footerLayout = Layout('body.footer', renderer=standardRenderers['footer'])
>>> footerLayout.renderer = standardRenderers['footer'] >>> component.provideUtility(footerLayout, ILayout, name='footer.default')
>>> 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

View file

@ -22,6 +22,7 @@ Basic classes for layouts and layout components.
$Id$ $Id$
""" """
from zope.cachedescriptors.property import Lazy
from zope import component from zope import component
from zope.interface import implements from zope.interface import implements
@ -37,8 +38,21 @@ class LayoutManager(object):
implements(ILayoutManager) implements(ILayoutManager)
def __init__(self): @Lazy
self.regions = {} def regions(self):
result = {}
for name, layout in component.getUtilitiesFor(ILayout):
region = result.setdefault(layout.regionName,
Region(layout.regionName))
region.layouts.append(layout)
return result
def getLayouts(self, key, **kw):
region = self.regions.get(key)
if region is None:
return []
# TODO: filter region.layouts
return region.layouts
def register(self, layout, regionName): def register(self, layout, regionName):
region = self.regions.setdefault(regionName, Region(regionName)) region = self.regions.setdefault(regionName, Region(regionName))
@ -50,12 +64,19 @@ class Layout(Template):
implements(ILayout) implements(ILayout)
name = '' name = ''
manager = None
renderer = None renderer = None
regionName = None
skin = 'default'
def __init__(self, regionName, **kw):
self.regionName = regionName
for k, v in kw.items():
setattr(self, k, v)
def registerFor(self, regionName): def registerFor(self, regionName):
manager = component.getUtility(ILayoutManager) manager = component.getUtility(ILayoutManager)
manager.register(self, regionName) manager.register(self, regionName)
self.regionName = regionName
class LayoutInstance(object): class LayoutInstance(object):

View file

@ -0,0 +1,33 @@
#
# 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
#
"""
Default layouts.
$Id$
"""
from zope.app.pagetemplate import ViewPageTemplateFile
from cybertools.composer.layout.base import Layout
standardRenderers = ViewPageTemplateFile('standard.pt').macros
footer = Layout('body.footer', renderer=standardRenderers['footer'])

View file

@ -35,6 +35,11 @@ template = ViewPageTemplateFile('default.pt')
class BodyLayout(Layout): class BodyLayout(Layout):
regionName = 'page.body'
def __init__(self):
pass
@Lazy @Lazy
def renderer(self): def renderer(self):
return template.macros['body'] return template.macros['body']

View file

@ -51,7 +51,7 @@ class BaseView(object):
class Page(BaseView): class Page(BaseView):
def __call__(self): def __call__(self):
layout = Layout() layout = Layout('page')
layout.renderer = ViewPageTemplateFile('main.pt').macros['page'] layout.renderer = ViewPageTemplateFile('main.pt').macros['page']
instance = LayoutInstance(self.context) instance = LayoutInstance(self.context)
instance.template = layout instance.template = layout
@ -83,9 +83,9 @@ class LayoutView(BaseView):
def resources(self): def resources(self):
return ViewResources(self) return ViewResources(self)
def getRegion(self, key): def getLayoutsFor(self, key, **kw):
manager = component.getUtility(ILayoutManager) manager = component.getUtility(ILayoutManager)
return manager.regions.get('.'.join((self.name, key))) return manager.getLayouts('.'.join((self.name, key)), **kw)
# subview providers # subview providers
@ -97,11 +97,8 @@ class ViewLayouts(object):
def __getitem__(self, key): def __getitem__(self, key):
view = self.view view = self.view
region = view.getRegion(key)
if region is None:
return []
subviews = [] subviews = []
for layout in region.layouts: for layout in view.getLayoutsFor(key):
instance = LayoutInstance(view.client) instance = LayoutInstance(view.client)
instance.template = layout instance.template = layout
instance.view = view instance.view = view

View file

@ -58,6 +58,7 @@ class SchemaFactory(object):
schema.Date: ('date',), schema.Date: ('date',),
schema.Datetime: ('date',), schema.Datetime: ('date',),
schema.Int: ('number',), schema.Int: ('number',),
schema.Float: ('number',),
schema.Bool: ('checkbox',), schema.Bool: ('checkbox',),
schema.List: ('list',), schema.List: ('list',),
schema.Choice: ('dropdown',), schema.Choice: ('dropdown',),