work in progress: layout management - first working page with CSS

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2894 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-09-20 08:45:15 +00:00
parent 49102961e5
commit d2f070037e
13 changed files with 218 additions and 20 deletions

View file

@ -28,12 +28,27 @@ manager.
The layouts themselves are also specified as utilities. The layouts themselves are also specified as utilities.
>>> #from cybertools.composer.layout.browser.liquid.default import css >>> from cybertools.composer.layout.browser.liquid.default import css
>>> #component.provideUtility(css, ILayout, name='css') >>> component.provideUtility(css, ILayout, name='css.liquid')
>>> from cybertools.composer.layout.browser.liquid.default import body >>> from cybertools.composer.layout.browser.liquid.default import body
>>> component.provideUtility(body, ILayout, name='body.liquid') >>> component.provideUtility(body, ILayout, name='body.liquid')
>>> from cybertools.composer.layout.browser.default import logo
>>> component.provideUtility(logo, ILayout, name='logo.default')
>>> from cybertools.composer.layout.browser.default import top_actions
>>> component.provideUtility(top_actions, ILayout, name='top_actions.default')
>>> from cybertools.composer.layout.browser.default import column1
>>> component.provideUtility(column1, ILayout, name='column1.default')
>>> from cybertools.composer.layout.browser.default import content
>>> component.provideUtility(content, ILayout, name='content.default')
>>> from cybertools.composer.layout.browser.default import column2
>>> component.provideUtility(column2, ILayout, name='column2.default')
>>> from cybertools.composer.layout.browser.default import footer >>> from cybertools.composer.layout.browser.default import footer
>>> component.provideUtility(footer, ILayout, name='footer.default') >>> component.provideUtility(footer, ILayout, name='footer.default')

View file

@ -49,7 +49,7 @@ class LayoutManager(object):
def getLayouts(self, key, instance): def getLayouts(self, key, instance):
region = self.regions.get(key) region = self.regions.get(key)
return instance.getLayouts(region) return sorted(instance.getLayouts(region), key=lambda x: x.order)
class Layout(Template): class Layout(Template):
@ -59,6 +59,7 @@ class Layout(Template):
title = description = u'' title = description = u''
category = 'default' category = 'default'
renderer = None renderer = None
order = 0
def __init__(self, name, regionName, **kw): def __init__(self, name, regionName, **kw):
self.name = name self.name = name

View file

@ -0,0 +1,40 @@
<!-- $Id$ -->
<configure
xmlns:zope="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="cybertools.composer">
<zope:utility
component="cybertools.composer.layout.browser.default.logo"
provides="cybertools.composer.layout.interfaces.ILayout"
name="logo.default" />
<zope:utility
component="cybertools.composer.layout.browser.default.top_actions"
provides="cybertools.composer.layout.interfaces.ILayout"
name="column2.top_actions" />
<zope:utility
component="cybertools.composer.layout.browser.default.column1"
provides="cybertools.composer.layout.interfaces.ILayout"
name="column1.default" />
<zope:utility
component="cybertools.composer.layout.browser.default.content"
provides="cybertools.composer.layout.interfaces.ILayout"
name="content.default" />
<zope:utility
component="cybertools.composer.layout.browser.default.column2"
provides="cybertools.composer.layout.interfaces.ILayout"
name="column2.default" />
<zope:utility
component="cybertools.composer.layout.browser.default.footer"
provides="cybertools.composer.layout.interfaces.ILayout"
name="footer.default" />
<include package=".liquid" />
</configure>

View file

@ -1,3 +1,66 @@
<div metal:define-macro="footer"> <body metal:define-macro="body">
Some footer text.
<div>
<div>
<tal:sub repeat="view view/layouts/logo">
<metal:sub use-macro="view/renderer" /></tal:sub>
<tal:sub repeat="view view/layouts/top_actions">
<metal:sub use-macro="view/renderer" /></tal:sub>
</div>
</div>
<div>
<tal:sub repeat="view view/layouts/column1">
<metal:sub use-macro="view/renderer" />
</tal:sub>
</div>
<div>
<tal:sub repeat="view view/layouts/content">
<metal:sub use-macro="view/renderer" />
</tal:sub>
</div>
<div>
<tal:sub repeat="view view/layouts/column2">
<metal:sub use-macro="view/renderer" />
</tal:sub>
</div>
<div>
<tal:sub repeat="view view/layouts/footer">
<metal:sub use-macro="view/renderer" />
</tal:sub>
</div>
</body>
<div metal:define-macro="logo">
Logo
</div>
<div metal:define-macro="top_actions">
Top actions
</div>
<div metal:define-macro="column1">
Column 1
</div>
<div metal:define-macro="content">
Content
</div>
<div metal:define-macro="column2">
Column 2
</div>
<div metal:define-macro="footer">
Powered by Zope.
</div> </div>

View file

@ -30,5 +30,18 @@ from cybertools.composer.layout.base import Layout
defaultRenderers = ViewPageTemplateFile('default.pt').macros defaultRenderers = ViewPageTemplateFile('default.pt').macros
footer = Layout('footer.default', 'body.footer', logo = Layout('logo.default', 'body.logo', renderer=defaultRenderers['logo'])
renderer=defaultRenderers['footer'])
top_actions = Layout('top_actions.default', 'body.top_actions',
renderer=defaultRenderers['top_actions'])
column1 = Layout('column1.default', 'body.column1',
renderer=defaultRenderers['column1'])
content = Layout('content.default', 'body.content',
renderer=defaultRenderers['content'])
column2 = Layout('column2.default', 'body.column2',
renderer=defaultRenderers['column2'])
footer = Layout('footer.default', 'body.footer', renderer=defaultRenderers['footer'])

View file

@ -0,0 +1,31 @@
/*
$Id$
based on http://www.tjkdesign.com/articles/liquid/4.asp
*/
body {
min-width:640px;
margin: 0;
padding: 0;
font: 9pt Verdana, Tahoma, Arial, Helvetica, sans-serif;
background-color: white;
color: #000040;
}
#global,#menu,#sub-section,#footer {
overflow: hidden;
display: inline-block;
}
#content {
display: inline-block;
}
#global,#footer {width:100%}
#menu,#content,#sub-section {float:left}
#menu {width:20%}
#content {width:62%}
#sub-section {width:17%}
#footer {clear:left; float:left}

View file

@ -0,0 +1,21 @@
<!-- $Id$ -->
<configure
xmlns:zope="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="cybertools.composer">
<browser:resource
name="liquid.css" file="base.css" />
<zope:utility
component="cybertools.composer.layout.browser.liquid.default.css"
provides="cybertools.composer.layout.interfaces.ILayout"
name="css.liquid" />
<zope:utility
component="cybertools.composer.layout.browser.liquid.default.body"
provides="cybertools.composer.layout.interfaces.ILayout"
name="body.liquid" />
</configure>

View file

@ -27,11 +27,16 @@ from zope.cachedescriptors.property import Lazy
from zope import component from zope import component
from zope.interface import implements from zope.interface import implements
from cybertools.browser.liquid import Liquid
from cybertools.composer.layout.base import Layout from cybertools.composer.layout.base import Layout
from cybertools.composer.layout.browser.standard import standardRenderers
defaultRenderers = ViewPageTemplateFile('default.pt').macros defaultRenderers = ViewPageTemplateFile('default.pt').macros
body = Layout('body.liquid', 'page.body',
renderer=defaultRenderers['body']) css = Layout('css.liquid', 'page.css', renderer=standardRenderers['css'],
media='all', resource='liquid.css', skin=Liquid)
body = Layout('body.liquid', 'page.body', renderer=defaultRenderers['body'],
skin=Liquid)

View file

@ -1,7 +1,8 @@
<metal:css define-macro="css"> <metal:css define-macro="css"
<!--<style type="text/css" media="all" tal:define="layout view/context/template">
tal:attributes="media view/media" <style type="text/css" media="all"
tal:content="string:@import url(${view/page/resourceBase}${view/context/resourceName});"> tal:attributes="media layout/media"
tal:content="string:@import url(${view/page/resourceBase}${layout/resource});">
@import url(some.css); @import url(some.css);
</style>--> </style>
</metal:css> </metal:css>

View file

@ -29,6 +29,3 @@ from cybertools.composer.layout.base import Layout
standardRenderers = ViewPageTemplateFile('standard.pt').macros standardRenderers = ViewPageTemplateFile('standard.pt').macros
footer = Layout('footer.default', 'body.footer',
renderer=standardRenderers['footer'])

View file

@ -1,8 +1,17 @@
<!-- $Id$ --> <!-- $Id$ -->
<configure <configure
xmlns="http://namespaces.zope.org/zope" xmlns:zope="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser" xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="cybertools.composer"> i18n_domain="cybertools.composer">
<zope:utility
factory="cybertools.composer.layout.base.LayoutManager" />
<zope:adapter
for="*"
factory="cybertools.composer.layout.base.LayoutInstance" />
<include package=".browser" />
</configure> </configure>

View file

@ -77,6 +77,7 @@ class ILayout(ITemplate):
required=True,) required=True,)
renderer = Attribute(u'An object responsible for rendering the layout.') renderer = Attribute(u'An object responsible for rendering the layout.')
order = Attribute(u'A number that may be used as a sorting key.')
class ILayoutComponent(IComponent): class ILayoutComponent(IComponent):

View file

@ -25,6 +25,7 @@ $Id$
from zope.interface import implements from zope.interface import implements
from cybertools.composer.layout.interfaces import IRegion from cybertools.composer.layout.interfaces import IRegion
from cybertools.util.jeep import Jeep
class Region(object): class Region(object):
@ -35,4 +36,4 @@ class Region(object):
def __init__(self, name): def __init__(self, name):
self.name = name self.name = name
self.layouts = [] self.layouts = Jeep()