[Checkins] SVN: z3ext.layout/trunk/ Added 'pagelet' tales expression (same as @@pagelet)
Nikolay Kim
fafhrd at datacom.kz
Wed Oct 29 12:49:01 EDT 2008
Log message for revision 92674:
Added 'pagelet' tales expression (same as @@pagelet)
Changed:
U z3ext.layout/trunk/CHANGES.txt
U z3ext.layout/trunk/setup.py
U z3ext.layout/trunk/src/z3ext/layout/configure.zcml
U z3ext.layout/trunk/src/z3ext/layout/pagelet.txt
A z3ext.layout/trunk/src/z3ext/layout/tales.py
U z3ext.layout/trunk/src/z3ext/layout/zcml.py
-=-
Modified: z3ext.layout/trunk/CHANGES.txt
===================================================================
--- z3ext.layout/trunk/CHANGES.txt 2008-10-29 16:47:38 UTC (rev 92673)
+++ z3ext.layout/trunk/CHANGES.txt 2008-10-29 16:49:01 UTC (rev 92674)
@@ -2,6 +2,12 @@
CHANGES
=======
+1.5.4 (2008-10-30)
+------------------
+
+- Added 'pagelet' tales expression (same as @@pagelet)
+
+
1.5.3 (2008-10-16)
------------------
Modified: z3ext.layout/trunk/setup.py
===================================================================
--- z3ext.layout/trunk/setup.py 2008-10-29 16:47:38 UTC (rev 92673)
+++ z3ext.layout/trunk/setup.py 2008-10-29 16:49:01 UTC (rev 92674)
@@ -61,6 +61,7 @@
'zope.publisher',
'zope.configuration',
'zope.pagetemplate',
+ 'zope.tales',
'zope.app.component',
'zope.app.publisher',
'zope.app.pagetemplate',
Modified: z3ext.layout/trunk/src/z3ext/layout/configure.zcml
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/configure.zcml 2008-10-29 16:47:38 UTC (rev 92673)
+++ z3ext.layout/trunk/src/z3ext/layout/configure.zcml 2008-10-29 16:49:01 UTC (rev 92674)
@@ -2,6 +2,7 @@
xmlns="http://namespaces.zope.org/zope"
xmlns:zcml="http://namespaces.zope.org/zcml"
xmlns:z3ext="http://namespaces.zope.org/z3ext"
+ xmlns:tales="http://namespaces.zope.org/tales"
i18n_domain="z3ext.layout">
<includeDependencies package="z3ext.layout" />
@@ -9,6 +10,11 @@
<!-- adapter provides IPagelet for (context, request) -->
<adapter factory=".pagelet.queryPagelet" />
+ <!-- pagelet: tales expression -->
+ <tales:expressiontype
+ name="pagelet"
+ handler=".tales.TALESPageletExpression" />
+
<!-- @@pagelet view -->
<adapter
name="pagelet"
Modified: z3ext.layout/trunk/src/z3ext/layout/pagelet.txt
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/pagelet.txt 2008-10-29 16:47:38 UTC (rev 92673)
+++ z3ext.layout/trunk/src/z3ext/layout/pagelet.txt 2008-10-29 16:49:01 UTC (rev 92674)
@@ -301,3 +301,169 @@
>>> print pagelet.publishTraverse(request, 'testPageletType')
<div>My pagelet</div>
+
+
+The TALES `pagelet` expression
+==============================
+
+The ``pagelet`` expression will look up the interaface or IPageletType
+name, call it and return the HTML content. The first step, however, will be to
+register our pagelet with the component architecture:
+
+Let's now create a view using a page template:
+
+ >>> import os, tempfile
+ >>> temp_dir = tempfile.mkdtemp()
+ >>> templateFileName = os.path.join(temp_dir, 'template.pt')
+ >>> open(templateFileName, 'w').write('''
+ ... <html>
+ ... <body>
+ ... <h1>My Web Page</h1>
+ ... <div class="left-column">
+ ... <tal:block replace="structure pagelet:z3ext.layout.tests.ITestPagelet" />
+ ... </div>
+ ... <div class="main">
+ ... Content here
+ ... </div>
+ ... </body>
+ ... </html>
+ ... ''')
+
+Also we should register tales expression
+
+ >>> from z3ext.layout import tales
+ >>> from zope.app.pagetemplate.metaconfigure import registerType
+ >>> registerType('pagelet', tales.TALESPageletExpression)
+
+Finally we look up the view and render it.
+
+ >>> from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
+
+ >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+ >>> component.provideAdapter(
+ ... FrontPage,
+ ... (interface.Interface, interface.Interface), interface.Interface,
+ ... name='main.html')
+
+ >>> view = component.getMultiAdapter((object(), request), name='main.html')
+ >>> print view()
+ <html>
+ <body>
+ <h1>My Web Page</h1>
+ <div class="left-column">
+ <div>My pagelet</div>
+ </div>
+ <div class="main">
+ Content here
+ </div>
+ </body>
+ </html>
+
+Or we can use typed pagelet interface
+
+ >>> open(templateFileName, 'w').write('''
+ ... <html>
+ ... <body>
+ ... <h1>My Web Page</h1>
+ ... <div class="left-column">
+ ... <tal:block replace="structure pagelet:testPageletType" />
+ ... </div>
+ ... <div class="main">
+ ... Content here
+ ... </div>
+ ... </body>
+ ... </html>
+ ... ''')
+
+ >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+ >>> component.provideAdapter(
+ ... FrontPage,
+ ... (interface.Interface, interface.Interface), interface.Interface,
+ ... name='main.html')
+
+ >>> view = component.getMultiAdapter((object(), request), name='main.html')
+ >>> print view()
+ <html>
+ <body>
+ <h1>My Web Page</h1>
+ <div class="left-column">
+ <div>My pagelet</div>
+ </div>
+ <div class="main">
+ Content here
+ </div>
+ </body>
+ </html>
+
+Default IPagelet
+
+ >>> open(templateFileName, 'w').write('''
+ ... <html>
+ ... <body>
+ ... <h1>My Web Page</h1>
+ ... <div class="left-column">
+ ... <tal:block replace="structure pagelet:" />
+ ... </div>
+ ... <div class="main">
+ ... Content here
+ ... </div>
+ ... </body>
+ ... </html>
+ ... ''')
+
+ >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+ >>> component.provideAdapter(
+ ... FrontPage,
+ ... (interface.Interface, interface.Interface), interface.Interface,
+ ... name='main.html')
+
+ >>> view = component.getMultiAdapter((object(), request), name='main.html')
+ >>> print view()
+ <html>
+ <body>
+ <h1>My Web Page</h1>
+ <div class="left-column">
+ <div>My pagelet2</div>
+ </div>
+ <div class="main">
+ Content here
+ </div>
+ </body>
+ </html>
+
+
+If pagelet is not exist, just return empty string
+
+ >>> open(templateFileName, 'w').write('''
+ ... <html>
+ ... <body>
+ ... <h1>My Web Page</h1>
+ ... <div class="left-column">
+ ... <tal:block replace="structure pagelet:test.unknown" />
+ ... </div>
+ ... <div class="main">
+ ... Content here
+ ... </div>
+ ... </body>
+ ... </html>
+ ... ''')
+
+ >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+ >>> component.provideAdapter(
+ ... FrontPage,
+ ... (interface.Interface, interface.Interface), interface.Interface,
+ ... name='main.html')
+
+ >>> view = component.getMultiAdapter((object(), request), name='main.html')
+ >>> print view()
+ <html>
+ <body>
+ <h1>My Web Page</h1>
+ <div class="left-column">
+ <BLANKLINE>
+ </div>
+ <div class="main">
+ Content here
+ </div>
+ </body>
+ </html>
Added: z3ext.layout/trunk/src/z3ext/layout/tales.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/tales.py (rev 0)
+++ z3ext.layout/trunk/src/z3ext/layout/tales.py 2008-10-29 16:49:01 UTC (rev 92674)
@@ -0,0 +1,58 @@
+##############################################################################
+#
+# Copyright (c) 2008 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.
+#
+##############################################################################
+""" 'pagelet' tales expression registrations
+
+$Id: tales.py 2720 2008-08-25 11:15:10Z fafhrd91 $
+"""
+import logging, sys
+from zope.component import queryUtility
+from zope.component import queryMultiAdapter
+from zope.tales.expressions import StringExpr
+
+from interfaces import IPagelet, IPageletType
+
+
+class TALESPageletExpression(StringExpr):
+
+ def __call__(self, econtext):
+ name = super(TALESPageletExpression, self).__call__(econtext)
+
+ context = econtext.vars['context']
+ request = econtext.vars['request']
+ modules = econtext.vars['modules']
+
+ # lookup pagelet
+ if name:
+ iface = queryUtility(IPageletType, name)
+ if iface is None:
+ try:
+ iface, iname = name.rsplit('.', 1)
+ iface = getattr(modules[iface], iname)
+ except Exception, err:
+ log = logging.getLogger('z3ext.layout')
+ log.exception(err)
+ return u''
+ else:
+ iface = IPagelet
+
+ try:
+ view = queryMultiAdapter((context, request), iface)
+ if view is not None:
+ view.update()
+ return view.render()
+ except Exception, err:
+ log = logging.getLogger('z3ext.layout')
+ log.exception(err)
+
+ return u''
Modified: z3ext.layout/trunk/src/z3ext/layout/zcml.py
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/zcml.py 2008-10-29 16:47:38 UTC (rev 92673)
+++ z3ext.layout/trunk/src/z3ext/layout/zcml.py 2008-10-29 16:49:01 UTC (rev 92674)
@@ -26,7 +26,7 @@
from zope.app.component.metadirectives import IBasicViewInformation
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
-from interfaces import IPagelet
+from interfaces import IPagelet, IPageletType
from interfaces import ILayout, ILayoutCreatedEvent
from pagelet import BrowserPagelet
@@ -328,12 +328,18 @@
defineChecker(new_class, Checker(required))
# register pagelet
+ _context.action(
+ discriminator = ('z3ext.layout:registerPagelets', new_class),
+ callable = registerPagelets,
+ args = (for_, layer, new_class, provides, name, _context.info))
+
+
+def registerPagelets(for_, layer, newClass, provides, name, info):
for iface in provides:
- _context.action(
- discriminator = ('z3ext:pagelet', for_, layer, name, iface),
- callable = handler,
- args = ('registerAdapter',
- new_class, (for_, layer), iface, name, _context.info))
+ if IPageletType.providedBy(iface):
+ handler('registerAdapter', newClass, (for_, layer), iface, '', info)
+ else:
+ handler('registerAdapter', newClass, (for_, layer), iface, name, info)
def _handle_allowed_interface(
More information about the Checkins
mailing list