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:
parent
49102961e5
commit
d2f070037e
13 changed files with 218 additions and 20 deletions
|
@ -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')
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
40
composer/layout/browser/configure.zcml
Normal file
40
composer/layout/browser/configure.zcml
Normal 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>
|
|
@ -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>
|
||||||
|
|
|
@ -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'])
|
||||||
|
|
31
composer/layout/browser/liquid/base.css
Normal file
31
composer/layout/browser/liquid/base.css
Normal 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}
|
21
composer/layout/browser/liquid/configure.zcml
Normal file
21
composer/layout/browser/liquid/configure.zcml
Normal 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>
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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'])
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Add table
Reference in a new issue