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.
|
||||
|
||||
>>> #from cybertools.composer.layout.browser.liquid.default import css
|
||||
>>> #component.provideUtility(css, ILayout, name='css')
|
||||
>>> from cybertools.composer.layout.browser.liquid.default import css
|
||||
>>> component.provideUtility(css, ILayout, name='css.liquid')
|
||||
|
||||
>>> from cybertools.composer.layout.browser.liquid.default import body
|
||||
>>> 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
|
||||
>>> component.provideUtility(footer, ILayout, name='footer.default')
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ class LayoutManager(object):
|
|||
|
||||
def getLayouts(self, key, instance):
|
||||
region = self.regions.get(key)
|
||||
return instance.getLayouts(region)
|
||||
return sorted(instance.getLayouts(region), key=lambda x: x.order)
|
||||
|
||||
|
||||
class Layout(Template):
|
||||
|
@ -59,6 +59,7 @@ class Layout(Template):
|
|||
title = description = u''
|
||||
category = 'default'
|
||||
renderer = None
|
||||
order = 0
|
||||
|
||||
def __init__(self, name, regionName, **kw):
|
||||
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">
|
||||
Some footer text.
|
||||
<body metal:define-macro="body">
|
||||
|
||||
<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>
|
||||
|
|
|
@ -30,5 +30,18 @@ from cybertools.composer.layout.base import Layout
|
|||
defaultRenderers = ViewPageTemplateFile('default.pt').macros
|
||||
|
||||
|
||||
footer = Layout('footer.default', 'body.footer',
|
||||
renderer=defaultRenderers['footer'])
|
||||
logo = Layout('logo.default', 'body.logo', renderer=defaultRenderers['logo'])
|
||||
|
||||
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.interface import implements
|
||||
|
||||
from cybertools.browser.liquid import Liquid
|
||||
from cybertools.composer.layout.base import Layout
|
||||
|
||||
from cybertools.composer.layout.browser.standard import standardRenderers
|
||||
|
||||
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">
|
||||
<!--<style type="text/css" media="all"
|
||||
tal:attributes="media view/media"
|
||||
tal:content="string:@import url(${view/page/resourceBase}${view/context/resourceName});">
|
||||
<metal:css define-macro="css"
|
||||
tal:define="layout view/context/template">
|
||||
<style type="text/css" media="all"
|
||||
tal:attributes="media layout/media"
|
||||
tal:content="string:@import url(${view/page/resourceBase}${layout/resource});">
|
||||
@import url(some.css);
|
||||
</style>-->
|
||||
</style>
|
||||
</metal:css>
|
||||
|
|
|
@ -29,6 +29,3 @@ from cybertools.composer.layout.base import Layout
|
|||
|
||||
standardRenderers = ViewPageTemplateFile('standard.pt').macros
|
||||
|
||||
|
||||
footer = Layout('footer.default', 'body.footer',
|
||||
renderer=standardRenderers['footer'])
|
||||
|
|
|
@ -1,8 +1,17 @@
|
|||
<!-- $Id$ -->
|
||||
|
||||
<configure
|
||||
xmlns="http://namespaces.zope.org/zope"
|
||||
xmlns:zope="http://namespaces.zope.org/zope"
|
||||
xmlns:browser="http://namespaces.zope.org/browser"
|
||||
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>
|
||||
|
|
|
@ -77,6 +77,7 @@ class ILayout(ITemplate):
|
|||
required=True,)
|
||||
|
||||
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):
|
||||
|
|
|
@ -25,6 +25,7 @@ $Id$
|
|||
from zope.interface import implements
|
||||
|
||||
from cybertools.composer.layout.interfaces import IRegion
|
||||
from cybertools.util.jeep import Jeep
|
||||
|
||||
|
||||
class Region(object):
|
||||
|
@ -35,4 +36,4 @@ class Region(object):
|
|||
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.layouts = []
|
||||
self.layouts = Jeep()
|
||||
|
|
Loading…
Add table
Reference in a new issue