[CMF-checkins] SVN: CMF/trunk/C Merged CMFonFive into CMF itself.
Florent Guillaume
fg at nuxeo.com
Sat Sep 24 11:51:32 EDT 2005
Log message for revision 38594:
Merged CMFonFive into CMF itself.
Switched tests to doctests.
Changed:
U CMF/trunk/CHANGES.txt
U CMF/trunk/CMFCore/__init__.py
A CMF/trunk/CMFCore/browser/
A CMF/trunk/CMFCore/browser/__init__.py
A CMF/trunk/CMFCore/browser/configure.zcml
A CMF/trunk/CMFCore/browser/globalbrowsermenuservice.py
A CMF/trunk/CMFCore/browser/meta.zcml
A CMF/trunk/CMFCore/configure.zcml
A CMF/trunk/CMFCore/dtml/explainFiveActionsTool.dtml
A CMF/trunk/CMFCore/fiveactionstool.py
A CMF/trunk/CMFCore/meta.zcml
A CMF/trunk/CMFCore/tests/fiveactions.zcml
A CMF/trunk/CMFCore/tests/test_fiveactionstool.py
U CMF/trunk/CMFDefault/configure.zcml
A CMF/trunk/CMFDefault/skin/
A CMF/trunk/CMFDefault/skin/__init__.py
A CMF/trunk/CMFDefault/skin/configure.zcml
A CMF/trunk/CMFDefault/skin/five_template.pt
-=-
Modified: CMF/trunk/CHANGES.txt
===================================================================
--- CMF/trunk/CHANGES.txt 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CHANGES.txt 2005-09-24 15:51:32 UTC (rev 38594)
@@ -2,6 +2,19 @@
New Features
+ - The features of CMFonFive have been folder into CMFCore and
+ CMFDefault:
+
+ * Zope 3 menus (browser:menu) are bridged to CMF actions using the
+ portal_fiveactions tool. Any menuItem registered will be
+ accessible though the portal_actions tool, where the menu for
+ which the item was registered will be used as the action
+ category.
+
+ * The Zope 3 'cmf' skin layer provides integration between the
+ Zope3 standard macros and the CMF main template, by redefining
+ five_template.pt.
+
- TypeInformation and newstyle Actions: Added i18n support.
If 'i18n_domain' is specified, 'title' and 'description' are returned as
MassageID objects instead of strings. This allows to use different i18n
Modified: CMF/trunk/CMFCore/__init__.py
===================================================================
--- CMF/trunk/CMFCore/__init__.py 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/__init__.py 2005-09-24 15:51:32 UTC (rev 38594)
@@ -22,6 +22,7 @@
import ActionsTool, UndoTool, RegistrationTool, SkinsTool
import MemberDataTool, TypesTool
import URLTool
+import fiveactionstool
import DirectoryView, FSImage, FSFile, FSPropertiesObject
import FSDTMLMethod, FSPythonScript, FSSTXMethod
import FSPageTemplate
@@ -55,6 +56,7 @@
MemberDataTool.MemberDataTool,
TypesTool.TypesTool,
URLTool.URLTool,
+ fiveactionstool.FiveActionsTool,
)
this_module = modules[ __name__ ]
Added: CMF/trunk/CMFCore/browser/__init__.py
===================================================================
--- CMF/trunk/CMFCore/browser/__init__.py 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/browser/__init__.py 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1 @@
+# import this
Property changes on: CMF/trunk/CMFCore/browser/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: CMF/trunk/CMFCore/browser/configure.zcml
===================================================================
--- CMF/trunk/CMFCore/browser/configure.zcml 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/browser/configure.zcml 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,13 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ xmlns:browser="http://namespaces.zope.org/browser"
+ i18n_domain="cmf"
+ >
+
+ <!-- Set up default menus as action categories. -->
+ <browser:menu
+ id="object"
+ title="Object menu"
+ />
+
+</configure>
Property changes on: CMF/trunk/CMFCore/browser/configure.zcml
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: CMF/trunk/CMFCore/browser/globalbrowsermenuservice.py
===================================================================
--- CMF/trunk/CMFCore/browser/globalbrowsermenuservice.py 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/browser/globalbrowsermenuservice.py 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,161 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Global Browser Menu Service
+
+Five-based adaptation of the one in Zope 3.0.
+
+$Id$
+"""
+
+from zope.security.interfaces import Unauthorized, Forbidden
+from zope.interface import implementedBy
+from Products.Five.security import checkPermission, CheckerPublic
+from zope.app.publication.browser import PublicationTraverser
+from zope.app.component.interface import provideInterface
+
+from zope.app.publisher.browser.globalbrowsermenuservice import \
+ globalBrowserMenuService
+from zope.app.publisher.browser.globalbrowsermenuservice import MenuItem
+
+from zope.interface.interfaces import IInterface
+from types import ClassType
+
+
+def addMenuItem(menu_id, interface, action, title,
+ description='', filter_string=None, permission=None,
+ extra=None,
+ ):
+ registry = globalBrowserMenuService._registry[menu_id].registry
+
+ if permission:
+ if permission == 'zope.Public':
+ permission = CheckerPublic
+
+ if interface is not None and not IInterface.providedBy(interface):
+ if isinstance(interface, (type, ClassType)):
+ interface = implementedBy(interface)
+ else:
+ raise TypeError(
+ "The interface argument must be an interface (or None) "
+ "or a class.")
+
+ data = registry.get(interface) or []
+ data.append(
+ MenuItem(action, title, description, filter_string, permission, extra)
+ )
+ registry.register(interface, data)
+
+
+def getMenu(menu_id, object, request, max=999999):
+ traverser = PublicationTraverser()
+
+ result = []
+ seen = {}
+
+ # stuff for figuring out the selected view
+ request_url = request.getURL()
+
+ for item in globalBrowserMenuService.getAllMenuItems(menu_id, object):
+
+ # Make sure we don't repeat a specification for a given title
+ title = item.title
+ if title in seen:
+ continue
+ seen[title] = 1
+
+ permission = item.permission
+ action = item.action
+
+ if permission:
+ # If we have an explicit permission, check that we
+ # can access it.
+ if not checkPermission(permission, object):
+ continue
+
+ elif action:
+ # Otherwise, test access by attempting access
+ path = action
+ l = action.find('?')
+ if l >= 0:
+ path = action[:l]
+ try:
+ v = traverser.traverseRelativeURL(
+ request, object, path)
+ # TODO:
+ # tickle the security proxy's checker
+ # we're assuming that view pages are callable
+ # this is a pretty sound assumption
+ v.__call__
+ except (Unauthorized, Forbidden):
+ continue # Skip unauthorized or forbidden
+
+ normalized_action = action
+ if action.startswith('@@'):
+ normalized_action = action[2:]
+
+ if request_url.endswith('/'+normalized_action):
+ selected='selected'
+ elif request_url.endswith('/++view++'+normalized_action):
+ selected='selected'
+ elif request_url.endswith('/@@'+normalized_action):
+ selected='selected'
+ else:
+ selected=''
+
+ result.append({
+ 'title': title,
+ 'description': item.description,
+ 'action': "%s" % action,
+ 'filter': item.filter,
+ 'selected': selected,
+ 'extra': item.extra,
+ })
+
+ if len(result) >= max:
+ return result
+
+ return result
+
+
+
+def menuItemDirective(_context, menu, for_,
+ action, title, description='', filter=None,
+ permission=None, extra=None):
+ return menuItemsDirective(_context, menu, for_).menuItem(
+ _context, action, title, description, filter, permission, extra)
+
+
+class menuItemsDirective(object):
+
+ def __init__(self, _context, menu, for_):
+ self.interface = for_
+ self.menu = menu
+
+ def menuItem(self, _context, action, title, description='',
+ filter=None, permission=None, extra=None):
+ _context.action(
+ discriminator = ('browser:menuItem',
+ self.menu, self.interface, title),
+ callable = addMenuItem,
+ args = (self.menu, self.interface,
+ action, title, description, filter, permission, extra),
+ ),
+
+ def __call__(self, _context):
+ _context.action(
+ discriminator = None,
+ callable = provideInterface,
+ args = (self.interface.__module__+'.'+self.interface.getName(),
+ self.interface)
+ )
Property changes on: CMF/trunk/CMFCore/browser/globalbrowsermenuservice.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: CMF/trunk/CMFCore/browser/meta.zcml
===================================================================
--- CMF/trunk/CMFCore/browser/meta.zcml 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/browser/meta.zcml 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,34 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ xmlns:meta="http://namespaces.zope.org/meta">
+
+ <meta:directives namespace="http://namespaces.zope.org/cmf">
+
+ <meta:directive
+ name="menu"
+ schema="zope.app.publisher.browser.metadirectives.IMenuDirective"
+ handler="zope.app.publisher.browser.globalbrowsermenuservice.menuDirective"
+ />
+
+ <meta:directive
+ name="menuItem"
+ schema="zope.app.publisher.browser.metadirectives.IMenuItemDirective"
+ handler=".browser.globalbrowsermenuservice.menuItemDirective"
+ />
+
+ <meta:complexDirective
+ name="menuItems"
+ schema="zope.app.publisher.browser.metadirectives.IMenuItemsDirective"
+ handler=".browser.globalbrowsermenuservice.menuItemsDirective"
+ >
+
+ <meta:subdirective
+ name="menuItem"
+ schema="zope.app.publisher.browser.metadirectives.IMenuItemSubdirective"
+ />
+
+ </meta:complexDirective>
+
+ </meta:directives>
+
+</configure>
Property changes on: CMF/trunk/CMFCore/browser/meta.zcml
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: CMF/trunk/CMFCore/configure.zcml
===================================================================
--- CMF/trunk/CMFCore/configure.zcml 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/configure.zcml 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,5 @@
+<configure xmlns="http://namespaces.zope.org/zope">
+
+ <include package=".browser"/>
+
+</configure>
Property changes on: CMF/trunk/CMFCore/configure.zcml
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: CMF/trunk/CMFCore/dtml/explainFiveActionsTool.dtml
===================================================================
--- CMF/trunk/CMFCore/dtml/explainFiveActionsTool.dtml 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/dtml/explainFiveActionsTool.dtml 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,8 @@
+<dtml-var manage_page_header>
+<dtml-var manage_tabs>
+
+<h3><code>portal_fiveactions</code> Tool</h3>
+
+<p>This tool provides a bridge from Zope 3 menus to CMF actions.</p>
+
+<dtml-var manage_page_footer>
Property changes on: CMF/trunk/CMFCore/dtml/explainFiveActionsTool.dtml
___________________________________________________________________
Name: svn:eol-style
+ native
Added: CMF/trunk/CMFCore/fiveactionstool.py
===================================================================
--- CMF/trunk/CMFCore/fiveactionstool.py 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/fiveactionstool.py 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,103 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" Five actions tool.
+
+$Id$
+"""
+
+from AccessControl import ClassSecurityInfo
+from Globals import InitializeClass
+from Globals import DTMLFile
+from OFS.SimpleItem import SimpleItem
+
+from ActionInformation import ActionInformation
+from ActionProviderBase import ActionProviderBase
+from Expression import Expression
+from permissions import ManagePortal
+from utils import UniqueObject
+from utils import _dtmldir
+
+from zope.app.publisher.browser.globalbrowsermenuservice import \
+ globalBrowserMenuService
+from browser.globalbrowsermenuservice import getMenu
+
+
+class FiveActionsTool(UniqueObject, SimpleItem, ActionProviderBase):
+ """Five actions tool.
+
+ Provides a bridge that makes Zope 3 menus available as CMF actions.
+ """
+
+ __implements__ = ActionProviderBase.__implements__
+
+ id = 'portal_fiveactions'
+ meta_type = 'CMF Five Actions Tool'
+
+ security = ClassSecurityInfo()
+
+ manage_options = (({'label': 'Overview',
+ 'action': 'manage_overview'},
+ ) +
+ SimpleItem.manage_options)
+
+ #
+ # ZMI methods
+ #
+
+ security.declareProtected(ManagePortal, 'manage_overview')
+ manage_overview = DTMLFile('explainFiveActionsTool', _dtmldir)
+
+ #
+ # ActionProvider
+ #
+
+ security.declarePrivate('listActions')
+ def listActions(self, info=None, object=None):
+ """ List all the actions defined by a provider.
+ """
+ if object is None and info is not None:
+ # BBB (according to the interface)
+ object = info.content
+ if object is None:
+ # The tool itself doesn't provide any action
+ return ()
+
+ actions = []
+ for mid in globalBrowserMenuService._registry.keys():
+ menu = getMenu(mid, object, self.REQUEST)
+ for entry in menu:
+ # The action needs a unique name, so we'll build one
+ # from the object_id and the action url. That is sure
+ # to be unique.
+ action = str(entry['action'])
+ if object is None:
+ act_id = 'action_%s' % action
+ else:
+ act_id = 'action_%s_%s' % (object.getId(), action)
+
+ if entry['filter'] is None:
+ filter = None
+ else:
+ filter = Expression(text=str(entry['filter']))
+
+ act = ActionInformation(id=act_id,
+ title=str(entry['title']),
+ action=Expression(text='string:%s' % action),
+ condition=filter,
+ category=str(mid),
+ visible=1)
+ actions.append(act)
+ return tuple(actions)
+
+
+InitializeClass(FiveActionsTool)
Property changes on: CMF/trunk/CMFCore/fiveactionstool.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: CMF/trunk/CMFCore/meta.zcml
===================================================================
--- CMF/trunk/CMFCore/meta.zcml 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/meta.zcml 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,5 @@
+<configure xmlns="http://namespaces.zope.org/zope">
+
+ <include file="browser/meta.zcml"/>
+
+</configure>
Property changes on: CMF/trunk/CMFCore/meta.zcml
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: CMF/trunk/CMFCore/tests/fiveactions.zcml
===================================================================
--- CMF/trunk/CMFCore/tests/fiveactions.zcml 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/tests/fiveactions.zcml 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,29 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ xmlns:browser="http://namespaces.zope.org/browser"
+ i18n_domain="cmf"
+ >
+
+ <browser:menu
+ id="mymenu"
+ title="CMF menu" />
+
+ <browser:menuItem
+ for="Products.Five.testing.simplecontent.ISimpleContent"
+ menu="mymenu"
+ title="Public Test Menu Item"
+ action="public.html"
+ description="This is a public test menu item"
+ permission="zope.Public"
+ />
+
+ <browser:menuItem
+ for="Products.Five.testing.simplecontent.ISimpleContent"
+ menu="mymenu"
+ title="Protected Test Menu Item"
+ action="protected.html"
+ description="This is a protected test menu item"
+ permission="zope2.ManageUsers"
+ />
+
+</configure>
Property changes on: CMF/trunk/CMFCore/tests/fiveactions.zcml
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: CMF/trunk/CMFCore/tests/test_fiveactionstool.py
===================================================================
--- CMF/trunk/CMFCore/tests/test_fiveactionstool.py 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFCore/tests/test_fiveactionstool.py 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,86 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation and Contributors. All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" Unit tests for five actions tool.
+
+$Id$
+"""
+
+import os, sys
+if __name__ == '__main__':
+ execfile(os.path.join(sys.path[0], 'framework.py'))
+
+
+def test_fiveactionstool():
+ """
+ Test the Five actions tool.
+
+ Some basic setup:
+
+ >>> from zope.app.tests.placelesssetup import setUp, tearDown
+ >>> setUp()
+
+ >>> import Products.Five
+ >>> import Products.CMFCore
+ >>> from Products.Five import zcml
+ >>> zcml.load_config('meta.zcml', Products.Five)
+ >>> zcml.load_config('permissions.zcml', Products.Five)
+ >>> zcml.load_config('meta.zcml', Products.CMFCore)
+ >>> folder = self.folder
+
+ Let's create a Five actions tool:
+
+ >>> from Products.CMFCore.fiveactionstool import FiveActionsTool
+ >>> folder.tool = FiveActionsTool()
+ >>> tool = folder.tool # rewrap
+
+ Let's create some simple content object providing ISimpleContent:
+
+ >>> from Products.Five.testing.simplecontent import SimpleContent
+ >>> foo = SimpleContent('foo', 'Foo')
+
+ Now we'll load a configuration file specifying some menu and menu
+ items for ISimpleContent.
+
+ >>> import Products.CMFCore.tests
+ >>> zcml.load_config('fiveactions.zcml', Products.CMFCore.tests)
+
+ Let's look what the tool lists as actions for such an object. Note
+ that 'action_content_protected.html' is not present, as it was
+ protected by a more restrictive permission:
+
+ >>> actions = tool.listActions(object=foo)
+ >>> [(action.category, action.id) for action in actions]
+ [('mymenu', 'action_foo_public.html')]
+
+ When looking at an object not implementing ISimpleContent, we see no
+ actions:
+
+ >>> tool.listActions(object=folder)
+ ()
+
+ The tool itself doesn't have any actions:
+
+ >>> tool.listActions()
+ ()
+
+ Cleanup:
+
+ >>> tearDown()
+ """
+
+def test_suite():
+ from Testing.ZopeTestCase import ZopeDocTestSuite
+ return ZopeDocTestSuite()
+
+if __name__ == '__main__':
+ framework()
Property changes on: CMF/trunk/CMFCore/tests/test_fiveactionstool.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Modified: CMF/trunk/CMFDefault/configure.zcml
===================================================================
--- CMF/trunk/CMFDefault/configure.zcml 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFDefault/configure.zcml 2005-09-24 15:51:32 UTC (rev 38594)
@@ -4,4 +4,6 @@
<include package=".browser"/>
+ <include package=".skin"/>
+
</configure>
Added: CMF/trunk/CMFDefault/skin/__init__.py
===================================================================
--- CMF/trunk/CMFDefault/skin/__init__.py 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFDefault/skin/__init__.py 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1 @@
+# import this
Property changes on: CMF/trunk/CMFDefault/skin/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: CMF/trunk/CMFDefault/skin/configure.zcml
===================================================================
--- CMF/trunk/CMFDefault/skin/configure.zcml 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFDefault/skin/configure.zcml 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,28 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ xmlns:browser="http://namespaces.zope.org/browser"
+ i18n_domain="cmf">
+
+ <browser:layer
+ name="cmf"
+ />
+
+ <browser:skin
+ name="cmf"
+ layers="cmf default"
+ />
+
+ <browser:defaultSkin
+ name="cmf"
+ />
+
+ <!-- Define a default template with css-oriented slots -->
+ <browser:page
+ for="*"
+ template="five_template.pt"
+ name="five_template"
+ permission="zope.Public"
+ layer="cmf"
+ />
+
+</configure>
Property changes on: CMF/trunk/CMFDefault/skin/configure.zcml
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: CMF/trunk/CMFDefault/skin/five_template.pt
===================================================================
--- CMF/trunk/CMFDefault/skin/five_template.pt 2005-09-24 15:38:50 UTC (rev 38593)
+++ CMF/trunk/CMFDefault/skin/five_template.pt 2005-09-24 15:51:32 UTC (rev 38594)
@@ -0,0 +1,15 @@
+<metal:block define-macro="page"><metal:block use-macro="here/main_template/macros/master">
+ <metal:block fill-slot="base">
+ <metal:block define-slot="base" />
+ </metal:block>
+ <metal:block fill-slot="header">
+ <metal:block define-slot="header" />
+ </metal:block>
+ <metal:block fill-slot="css_slot">
+ <metal:block define-slot="style_slot" />
+ </metal:block>
+ <metal:block fill-slot="main">
+ <metal:block define-slot="body" />
+ </metal:block>
+</metal:block>
+</metal:block>
Property changes on: CMF/trunk/CMFDefault/skin/five_template.pt
___________________________________________________________________
Name: svn:eol-style
+ native
More information about the CMF-checkins
mailing list